From 0d9de6d2a5aa878e0dbf7d730312d598e57b69a9 Mon Sep 17 00:00:00 2001 From: MaurizioBrioschi Date: Wed, 24 Feb 2016 18:21:14 +0100 Subject: [PATCH 01/11] #9 refactor observers time command to manage different Magento versions --- composer.lock | 1706 +++++++ .../code/community/Hackathon/PSR0Autoloader | 1 + .../etc/modules/Hackathon_PSR0Autoloader.xml | 1 + root/shell/autoloader_initializer.php | 1 + .../Reports/AbstractMagentoPatchFactory.php | 70 + .../Command/Reports/MagentoPatch1_9_2_2.php | 69 + .../Command/Reports/MagentoPatch1_9_2_3.php | 48 + .../Command/Reports/MagentoPatchFactory.php | 21 + .../Magerun/Base/Command/Reports/Observer.php | 22 + .../Command/Reports/ObserversTimesCommand.php | 108 +- .../Base/Command/Reports/PatchInterface.php | 34 + .../1_9_2_2}/observerstimes_dispatchEvent | 0 .../1_9_2_2}/observerstimes_mageRun | 0 .../1_9_2_2}/observerstimes_mageRunEnd | 0 .../1_9_2_2}/observerstimes_observer | 0 vendor/autoload.php | 7 + vendor/bin/magento-composer-installer.php | 1 + vendor/bin/phpcbf | 1 + vendor/bin/phpcs | 1 + vendor/bin/phpunit | 1 + vendor/bin/validate-json | 1 + vendor/composer/ClassLoader.php | 387 ++ vendor/composer/autoload_classmap.php | 690 +++ vendor/composer/autoload_namespaces.php | 14 + vendor/composer/autoload_psr4.php | 20 + vendor/composer/autoload_real.php | 50 + vendor/composer/installed.json | 1747 +++++++ vendor/doctrine/instantiator/.gitignore | 5 + vendor/doctrine/instantiator/.scrutinizer.yml | 46 + .../doctrine/instantiator/.travis.install.sh | 14 + vendor/doctrine/instantiator/.travis.yml | 22 + vendor/doctrine/instantiator/CONTRIBUTING.md | 35 + vendor/doctrine/instantiator/LICENSE | 19 + vendor/doctrine/instantiator/README.md | 40 + vendor/doctrine/instantiator/composer.json | 45 + vendor/doctrine/instantiator/phpmd.xml.dist | 27 + vendor/doctrine/instantiator/phpunit.xml.dist | 22 + .../Exception/ExceptionInterface.php | 29 + .../Exception/InvalidArgumentException.php | 62 + .../Exception/UnexpectedValueException.php | 79 + .../Doctrine/Instantiator/Instantiator.php | 273 ++ .../Instantiator/InstantiatorInterface.php | 37 + .../InstantiatorPerformanceEvent.php | 96 + .../InvalidArgumentExceptionTest.php | 83 + .../UnexpectedValueExceptionTest.php | 69 + .../InstantiatorTest/InstantiatorTest.php | 219 + .../AbstractClassAsset.php | 29 + .../ArrayObjectAsset.php | 41 + .../InstantiatorTestAsset/ExceptionAsset.php | 41 + .../FinalExceptionAsset.php | 41 + .../InstantiatorTestAsset/PharAsset.php | 41 + .../PharExceptionAsset.php | 44 + .../SerializableArrayObjectAsset.php | 62 + .../SimpleSerializableAsset.php | 61 + .../SimpleTraitAsset.php | 29 + .../UnCloneableAsset.php | 50 + .../UnserializeExceptionArrayObjectAsset.php | 39 + .../WakeUpNoticesAsset.php | 38 + .../InstantiatorTestAsset/XMLReaderAsset.php | 41 + .../composer-config-reader/CHANGELOG.md | 17 + .../composer-config-reader/CONTRIBUTING.md | 29 + .../eloquent/composer-config-reader/LICENSE | 19 + .../eloquent/composer-config-reader/README.md | 173 + .../composer-config-reader/composer.json | 29 + .../composer-config-reader/composer.lock | 1246 +++++ .../etc/composer-schema.json | 372 ++ .../src/ConfigurationReader.php | 545 +++ .../src/ConfigurationValidator.php | 106 + .../src/Element/AbstractRepository.php | 73 + .../src/Element/ArchiveConfiguration.php | 56 + .../src/Element/Author.php | 97 + .../src/Element/Configuration.php | 638 +++ .../src/Element/InstallationMethod.php | 35 + .../src/Element/PackageRepository.php | 51 + .../src/Element/ProjectConfiguration.php | 362 ++ .../src/Element/Repository.php | 53 + .../src/Element/RepositoryInterface.php | 25 + .../src/Element/ScriptConfiguration.php | 314 ++ .../src/Element/Stability.php | 45 + .../src/Element/SupportInformation.php | 125 + .../src/Element/VcsChangePolicy.php | 35 + .../ConfigurationExceptionInterface.php | 20 + .../Exception/ConfigurationReadException.php | 50 + .../InvalidConfigurationException.php | 70 + .../src/Exception/InvalidJsonException.php | 103 + .../Exception/UndefinedPropertyException.php | 53 + .../src/ObjectAccess.php | 89 + vendor/eloquent/enumeration/.php_cs | 60 + vendor/eloquent/enumeration/.sami | 15 + vendor/eloquent/enumeration/CHANGELOG.md | 64 + vendor/eloquent/enumeration/CONTRIBUTING.md | 33 + vendor/eloquent/enumeration/LICENSE | 19 + vendor/eloquent/enumeration/README.md | 276 ++ vendor/eloquent/enumeration/composer.json | 27 + vendor/eloquent/enumeration/composer.lock | 1502 ++++++ .../enumeration/src/AbstractEnumeration.php | 39 + .../enumeration/src/AbstractMultiton.php | 500 ++ .../enumeration/src/AbstractValueMultiton.php | 130 + .../enumeration/src/EnumerationInterface.php | 21 + .../AbstractUndefinedMemberException.php | 78 + .../Exception/ExtendsConcreteException.php | 74 + .../Exception/UndefinedMemberException.php | 48 + .../UndefinedMemberExceptionInterface.php | 48 + .../enumeration/src/MultitonInterface.php | 64 + .../src/ValueMultitonInterface.php | 29 + vendor/eloquent/liberator/CHANGELOG.md | 14 + vendor/eloquent/liberator/CONTRIBUTING.md | 29 + vendor/eloquent/liberator/LICENSE | 19 + vendor/eloquent/liberator/README.md | 106 + vendor/eloquent/liberator/composer.json | 26 + vendor/eloquent/liberator/composer.lock | 256 + .../src/Eloquent/Liberator/Liberator.php | 78 + .../src/Eloquent/Liberator/LiberatorArray.php | 25 + .../src/Eloquent/Liberator/LiberatorClass.php | 181 + .../Eloquent/Liberator/LiberatorObject.php | 155 + .../src/Eloquent/Liberator/LiberatorProxy.php | 18 + vendor/eloquent/pops/CHANGELOG.md | 6 + vendor/eloquent/pops/CONTRIBUTING.md | 29 + vendor/eloquent/pops/LICENSE | 19 + vendor/eloquent/pops/README.md | 291 ++ vendor/eloquent/pops/composer.json | 25 + vendor/eloquent/pops/composer.lock | 214 + .../eloquent/pops/src/Eloquent/Pops/Pops.php | 139 + .../eloquent/pops/src/Eloquent/Pops/Proxy.php | 16 + .../pops/src/Eloquent/Pops/ProxyArray.php | 182 + .../pops/src/Eloquent/Pops/ProxyClass.php | 337 ++ .../pops/src/Eloquent/Pops/ProxyObject.php | 287 ++ .../pops/src/Eloquent/Pops/ProxyPrimitive.php | 44 + .../pops/src/Eloquent/Pops/Safe/Safe.php | 18 + .../pops/src/Eloquent/Pops/Safe/SafeProxy.php | 49 + .../src/Eloquent/Pops/Safe/SafeProxyArray.php | 25 + .../src/Eloquent/Pops/Safe/SafeProxyClass.php | 25 + .../Eloquent/Pops/Safe/SafeProxyObject.php | 25 + .../Eloquent/Pops/Safe/SafeProxyPrimitive.php | 18 + .../symfony2-coding-standard/.gitignore | 6 + .../symfony2-coding-standard/.travis.yml | 27 + .../symfony2-coding-standard/CONTRIBUTING.md | 12 + .../symfony2-coding-standard/README.md | 51 + .../Arrays/MultiLineArrayCommaSniff.php | 95 + .../Classes/MultipleClassesOneFileSniff.php | 91 + .../Classes/PropertyDeclarationSniff.php | 92 + .../Sniffs/Commenting/ClassCommentSniff.php | 114 + .../Commenting/FunctionCommentSniff.php | 168 + .../Formatting/BlankLineBeforeReturnSniff.php | 93 + .../Sniffs/Functions/ScopeOrderSniff.php | 107 + .../NamingConventions/ValidClassNameSniff.php | 145 + .../Objects/ObjectInstantiationSniff.php | 92 + .../Sniffs/Scope/MethodScopeSniff.php | 71 + .../WhiteSpace/AssignmentSpacingSniff.php | 71 + .../WhiteSpace/BinaryOperatorSpacingSniff.php | 71 + .../Sniffs/WhiteSpace/CommaSpacingSniff.php | 77 + .../WhiteSpace/DiscourageFitzinatorSniff.php | 79 + .../Arrays/MultiLineArrayCommaUnitTest.inc | 73 + .../Arrays/MultiLineArrayCommaUnitTest.php | 61 + .../Commenting/FunctionCommentUnitTest.inc | 29 + .../Commenting/FunctionCommentUnitTest.php | 56 + .../BlankLineBeforeReturnUnitTest.inc | 46 + .../BlankLineBeforeReturnUnitTest.php | 57 + .../Objects/ObjectInstantiationUnitTest.inc | 28 + .../Objects/ObjectInstantiationUnitTest.php | 63 + .../Symfony2/ruleset.xml | 98 + .../symfony2-coding-standard/TESTING.md | 8 + .../symfony2-coding-standard/build.properties | 6 + .../symfony2-coding-standard/build.xml | 58 + .../symfony2-coding-standard/composer.json | 31 + vendor/firegento/psr0autoloader | 1 + vendor/icecave/isolator/CHANGELOG.md | 43 + vendor/icecave/isolator/CONTRIBUTING.md | 23 + vendor/icecave/isolator/LICENSE.md | 9 + vendor/icecave/isolator/README.md | 171 + vendor/icecave/isolator/composer.json | 28 + vendor/icecave/isolator/composer.lock | 997 ++++ vendor/icecave/isolator/src/Generator.php | 159 + vendor/icecave/isolator/src/Isolator.php | 144 + vendor/icecave/isolator/src/IsolatorTrait.php | 30 + vendor/icecave/isolator/src/PackageInfo.php | 8 + vendor/installed.json | 11 + .../justinrainbow/json-schema/.gitattributes | 5 + vendor/justinrainbow/json-schema/LICENSE | 29 + vendor/justinrainbow/json-schema/README.md | 55 + .../json-schema/bin/validate-json | 245 + .../justinrainbow/json-schema/composer.json | 58 + .../json-schema/phpunit.xml.dist | 26 + .../Constraints/CollectionConstraint.php | 112 + .../src/JsonSchema/Constraints/Constraint.php | 291 ++ .../Constraints/ConstraintInterface.php | 60 + .../JsonSchema/Constraints/EnumConstraint.php | 46 + .../src/JsonSchema/Constraints/Factory.php | 96 + .../Constraints/FormatConstraint.php | 181 + .../Constraints/NumberConstraint.php | 83 + .../Constraints/ObjectConstraint.php | 149 + .../Constraints/SchemaConstraint.php | 37 + .../Constraints/StringConstraint.php | 57 + .../JsonSchema/Constraints/TypeConstraint.php | 145 + .../Constraints/UndefinedConstraint.php | 307 ++ .../Exception/InvalidArgumentException.php | 17 + .../InvalidSchemaMediaTypeException.php | 17 + .../Exception/InvalidSourceUriException.php | 17 + .../Exception/JsonDecodingException.php | 40 + .../Exception/ResourceNotFoundException.php | 17 + .../Exception/UriResolverException.php | 17 + .../src/JsonSchema/RefResolver.php | 277 ++ .../Uri/Retrievers/AbstractRetriever.php | 29 + .../src/JsonSchema/Uri/Retrievers/Curl.php | 79 + .../Uri/Retrievers/FileGetContents.php | 87 + .../Uri/Retrievers/PredefinedArray.php | 54 + .../Uri/Retrievers/UriRetrieverInterface.php | 32 + .../src/JsonSchema/Uri/UriResolver.php | 157 + .../src/JsonSchema/Uri/UriRetriever.php | 289 ++ .../json-schema/src/JsonSchema/Validator.php | 40 + .../magento-composer-installer/.travis.yml | 66 + .../magento-composer-installer/CHANGELOG.md | 65 + .../CONTRIBUTING.md | 44 + .../magento-composer-installer/README.md | 211 + .../magento-composer-installer/appveyor.yml | 24 + .../bin/magento-composer-installer.php | 26 + .../magento-composer-installer/composer.json | 83 + .../magento-composer-installer/res/target.xml | 15 + .../src/MagentoHackathon/Composer/Helper.php | 151 + .../Composer/Magento/Deploy/Manager/Entry.php | 52 + .../Composer/Magento/DeployManager.php | 121 + .../Composer/Magento/Deploystrategy/Copy.php | 122 + .../Deploystrategy/DeploystrategyAbstract.php | 521 +++ .../Composer/Magento/Deploystrategy/Link.php | 101 + .../Composer/Magento/Deploystrategy/None.php | 37 + .../Magento/Deploystrategy/Symlink.php | 176 + .../Composer/Magento/Event/EventManager.php | 52 + .../Magento/Event/PackageDeployEvent.php | 37 + .../Magento/Event/PackagePreInstallEvent.php | 38 + .../Magento/Event/PackageUnInstallEvent.php | 46 + .../Magento/Factory/DeploystrategyFactory.php | 66 + .../Composer/Magento/Factory/EntryFactory.php | 66 + .../Factory/InstallStrategyFactory.php | 60 + .../Magento/Factory/ParserFactory.php | 69 + .../Factory/ParserFactoryInterface.php | 22 + .../Factory/PathTranslationParserFactory.php | 53 + .../Composer/Magento/GitIgnore.php | 111 + .../Composer/Magento/GitIgnoreListener.php | 52 + .../Composer/Magento/InstalledPackage.php | 70 + .../Magento/InstalledPackageDumper.php | 32 + .../Composer/Magento/ModuleManager.php | 229 + .../Composer/Magento/Parser/MapParser.php | 35 + .../Composer/Magento/Parser/ModmanParser.php | 72 + .../Magento/Parser/PackageXmlParser.php | 153 + .../Composer/Magento/Parser/Parser.php | 25 + .../Magento/Parser/PathTranslationParser.php | 92 + .../Composer/Magento/Patcher/Bootstrap.php | 210 + .../Composer/Magento/Plugin.php | 455 ++ .../Composer/Magento/ProjectConfig.php | 464 ++ .../InstalledPackageFileSystemRepository.php | 190 + .../InstalledPackageRepositoryInterface.php | 43 + .../UnInstallStrategy/UnInstallStrategy.php | 66 + .../UnInstallStrategyInterface.php | 18 + .../Composer/Magento/Util/FileSystem.php | 15 + vendor/mothership/component_base/LICENSE | 22 + vendor/mothership/component_base/README.md | 16 + .../mothership/component_base/composer.json | 33 + .../src-tests/Tests/BaseTestCase.php | 47 + .../src-tests/Tests/DatabaseTestCase.php | 99 + .../component_base/src-tests/Tests/README.md | 9 + .../src-tests/Tests/exemple.yaml | 37 + .../src-tests/Tests/phpunit.xml | 22 + .../Exception/ExceptionAbstract.php | 122 + .../src/Mothership/Tests/TraitBase.php | 62 + vendor/mothership/state_machine/.gitignore | 3 + vendor/mothership/state_machine/.travis.yml | 9 + vendor/mothership/state_machine/LICENSE | 21 + vendor/mothership/state_machine/README.md | 264 ++ vendor/mothership/state_machine/composer.json | 35 + .../state_machine/phpunit.composer.xml | 40 + .../src/CollectionWorkflowAbstract.php | 117 + .../Advanced/AdvancedStateMachine.php | 36 + .../Examples/Advanced/AdvancedWorkflow.php | 172 + .../src/Examples/Advanced/Workflow.yml | 87 + .../src/Examples/Advanced/workflow.png | Bin 0 -> 101654 bytes .../BooleanConditionsStateMachine.php | 36 + .../BooleanConditionsWorkflow.php | 83 + .../Examples/BooleanConditions/Workflow.yml | 35 + .../Examples/BooleanConditions/workflow.png | Bin 0 -> 67730 bytes .../src/Examples/Fail/FailStateMachine.php | 36 + .../src/Examples/Fail/FailWorkflow.php | 50 + .../src/Examples/Fail/Workflow.yml | 22 + .../IfConditions/IfConditionsStateMachine.php | 36 + .../IfConditions/IfConditionsWorkflow.php | 72 + .../src/Examples/IfConditions/Workflow.yml | 33 + .../src/Examples/IfConditions/workflow.png | Bin 0 -> 64904 bytes .../Examples/Simple/SimpleStateMachine.php | 36 + .../src/Examples/Simple/SimpleWorkflow.php | 55 + .../src/Examples/Simple/Workflow.yml | 22 + .../src/Examples/Simple/workflow.png | Bin 0 -> 13210 bytes .../src/Exception/StateMachineException.php | 45 + .../src/Exception/StatusException.php | 44 + .../src/Exception/TransitionException.php | 43 + .../src/Exception/WorkflowException.php | 43 + .../state_machine/src/StateMachine.php | 44 + .../src/StateMachineAbstract.php | 218 + .../src/StateMachineInterface.php | 43 + .../mothership/state_machine/src/Status.php | 260 ++ .../state_machine/src/StatusInterface.php | 113 + .../src/Tests/StateMachineTest.php | 141 + .../src/Tests/StateMachineTestCase.php | 76 + .../state_machine/src/Tests/WorkflowTest.php | 151 + .../state_machine/src/Transition.php | 171 + .../state_machine/src/TransitionInterface.php | 86 + .../state_machine/src/WorkflowAbstract.php | 313 ++ .../state_machine/src/WorkflowInterface.php | 73 + .../reflection-docblock/.gitignore | 2 + .../reflection-docblock/.travis.yml | 32 + .../phpdocumentor/reflection-docblock/LICENSE | 21 + .../reflection-docblock/README.md | 57 + .../reflection-docblock/composer.json | 26 + .../reflection-docblock/composer.lock | 827 ++++ .../reflection-docblock/phpunit.xml.dist | 14 + .../src/phpDocumentor/Reflection/DocBlock.php | 468 ++ .../Reflection/DocBlock/Context.php | 154 + .../Reflection/DocBlock/Description.php | 223 + .../Reflection/DocBlock/Location.php | 76 + .../Reflection/DocBlock/Serializer.php | 198 + .../phpDocumentor/Reflection/DocBlock/Tag.php | 377 ++ .../Reflection/DocBlock/Tag/AuthorTag.php | 131 + .../Reflection/DocBlock/Tag/CoversTag.php | 24 + .../Reflection/DocBlock/Tag/DeprecatedTag.php | 26 + .../Reflection/DocBlock/Tag/ExampleTag.php | 156 + .../Reflection/DocBlock/Tag/LinkTag.php | 81 + .../Reflection/DocBlock/Tag/MethodTag.php | 209 + .../Reflection/DocBlock/Tag/ParamTag.php | 119 + .../DocBlock/Tag/PropertyReadTag.php | 24 + .../Reflection/DocBlock/Tag/PropertyTag.php | 24 + .../DocBlock/Tag/PropertyWriteTag.php | 24 + .../Reflection/DocBlock/Tag/ReturnTag.php | 99 + .../Reflection/DocBlock/Tag/SeeTag.php | 81 + .../Reflection/DocBlock/Tag/SinceTag.php | 26 + .../Reflection/DocBlock/Tag/SourceTag.php | 137 + .../Reflection/DocBlock/Tag/ThrowsTag.php | 24 + .../Reflection/DocBlock/Tag/UsesTag.php | 24 + .../Reflection/DocBlock/Tag/VarTag.php | 24 + .../Reflection/DocBlock/Tag/VersionTag.php | 108 + .../Reflection/DocBlock/Type/Collection.php | 221 + .../Reflection/DocBlock/DescriptionTest.php | 245 + .../Reflection/DocBlock/Tag/CoversTagTest.php | 86 + .../DocBlock/Tag/DeprecatedTagTest.php | 115 + .../DocBlock/Tag/ExampleTagTest.php | 203 + .../Reflection/DocBlock/Tag/LinkTagTest.php | 87 + .../Reflection/DocBlock/Tag/MethodTagTest.php | 146 + .../Reflection/DocBlock/Tag/ParamTagTest.php | 118 + .../Reflection/DocBlock/Tag/ReturnTagTest.php | 102 + .../Reflection/DocBlock/Tag/SeeTagTest.php | 86 + .../Reflection/DocBlock/Tag/SinceTagTest.php | 115 + .../Reflection/DocBlock/Tag/SourceTagTest.php | 116 + .../Reflection/DocBlock/Tag/ThrowsTagTest.php | 102 + .../Reflection/DocBlock/Tag/UsesTagTest.php | 86 + .../Reflection/DocBlock/Tag/VarTagTest.php | 94 + .../DocBlock/Tag/VersionTagTest.php | 115 + .../Reflection/DocBlock/TagTest.php | 313 ++ .../DocBlock/Type/CollectionTest.php | 195 + .../phpDocumentor/Reflection/DocBlockTest.php | 337 ++ vendor/phpspec/prophecy/.gitignore | 4 + vendor/phpspec/prophecy/.travis.yml | 19 + vendor/phpspec/prophecy/CHANGES.md | 140 + vendor/phpspec/prophecy/CONTRIBUTING.md | 21 + vendor/phpspec/prophecy/LICENSE | 23 + vendor/phpspec/prophecy/README.md | 391 ++ vendor/phpspec/prophecy/composer.json | 42 + vendor/phpspec/prophecy/composer.lock | 720 +++ .../Argument/ArgumentsWildcardSpec.php | 146 + .../Argument/Token/AnyValueTokenSpec.php | 28 + .../Argument/Token/AnyValuesTokenSpec.php | 28 + .../Token/ApproximateValueTokenSpec.php | 55 + .../Argument/Token/ArrayCountTokenSpec.php | 64 + .../Argument/Token/ArrayEntryTokenSpec.php | 229 + .../Token/ArrayEveryEntryTokenSpec.php | 109 + .../Argument/Token/CallbackTokenSpec.php | 42 + .../Argument/Token/ExactValueTokenSpec.php | 155 + .../Token/IdenticalValueTokenSpec.php | 152 + .../Argument/Token/LogicalAndTokenSpec.php | 78 + .../Argument/Token/LogicalNotTokenSpec.php | 65 + .../Argument/Token/ObjectStateTokenSpec.php | 101 + .../Token/StringContainsTokenSpec.php | 49 + .../Prophecy/Argument/Token/TypeTokenSpec.php | 62 + .../prophecy/spec/Prophecy/ArgumentSpec.php | 107 + .../spec/Prophecy/Call/CallCenterSpec.php | 195 + .../prophecy/spec/Prophecy/Call/CallSpec.php | 54 + .../Comparator/ClosureComparatorSpec.php | 39 + .../spec/Prophecy/Comparator/FactorySpec.php | 20 + .../Comparator/ProphecyComparatorSpec.php | 39 + .../DisableConstructorPatchSpec.php | 59 + .../ClassPatch/HhvmExceptionPatchSpec.php | 37 + .../Doubler/ClassPatch/KeywordPatchSpec.php | 44 + .../Doubler/ClassPatch/MagicCallPatchSpec.php | 104 + .../ClassPatch/ProphecySubjectPatchSpec.php | 83 + .../ReflectionClassNewInstancePatchSpec.php | 47 + .../ClassPatch/SplFileInfoPatchSpec.php | 91 + .../ClassPatch/TraversablePatchSpec.php | 61 + .../spec/Prophecy/Doubler/DoublerSpec.php | 122 + .../Generator/ClassCodeGeneratorSpec.php | 323 ++ .../Doubler/Generator/ClassCreatorSpec.php | 44 + .../Doubler/Generator/ClassMirrorSpec.php | 784 ++++ .../Generator/Node/ArgumentNodeSpec.php | 92 + .../Doubler/Generator/Node/ClassNodeSpec.php | 200 + .../Doubler/Generator/Node/MethodNodeSpec.php | 141 + .../spec/Prophecy/Doubler/LazyDoubleSpec.php | 96 + .../Prophecy/Doubler/NameGeneratorSpec.php | 72 + .../Call/UnexpectedCallExceptionSpec.php | 32 + .../Doubler/ClassCreatorExceptionSpec.php | 28 + .../Doubler/ClassMirrorExceptionSpec.php | 27 + .../Doubler/ClassNotFoundExceptionSpec.php | 25 + .../Exception/Doubler/DoubleExceptionSpec.php | 14 + .../InterfaceNotFoundExceptionSpec.php | 24 + .../MethodNotExtendableExceptionSpec.php | 29 + .../Doubler/MethodNotFoundExceptionSpec.php | 40 + .../Prediction/AggregateExceptionSpec.php | 57 + .../Prediction/NoCallsExceptionSpec.php | 29 + .../UnexpectedCallsCountExceptionSpec.php | 31 + .../UnexpectedCallsExceptionSpec.php | 36 + .../Prophecy/MethodProphecyExceptionSpec.php | 30 + .../Prophecy/ObjectProphecyExceptionSpec.php | 27 + .../Prediction/CallPredictionSpec.php | 42 + .../Prediction/CallTimesPredictionSpec.php | 54 + .../Prediction/CallbackPredictionSpec.php | 36 + .../Prediction/NoCallsPredictionSpec.php | 43 + .../Prophecy/Promise/CallbackPromiseSpec.php | 110 + .../Promise/ReturnArgumentPromiseSpec.php | 41 + .../Prophecy/Promise/ReturnPromiseSpec.php | 61 + .../Prophecy/Promise/ThrowPromiseSpec.php | 58 + .../Prophecy/Prophecy/MethodProphecySpec.php | 384 ++ .../Prophecy/Prophecy/ObjectProphecySpec.php | 319 ++ .../spec/Prophecy/Prophecy/RevealerSpec.php | 51 + .../prophecy/spec/Prophecy/ProphetSpec.php | 91 + .../spec/Prophecy/Util/StringUtilSpec.php | 97 + .../prophecy/src/Prophecy/Argument.php | 212 + .../Prophecy/Argument/ArgumentsWildcard.php | 101 + .../Prophecy/Argument/Token/AnyValueToken.php | 52 + .../Argument/Token/AnyValuesToken.php | 52 + .../Argument/Token/ApproximateValueToken.php | 55 + .../Argument/Token/ArrayCountToken.php | 86 + .../Argument/Token/ArrayEntryToken.php | 143 + .../Argument/Token/ArrayEveryEntryToken.php | 82 + .../Prophecy/Argument/Token/CallbackToken.php | 75 + .../Argument/Token/ExactValueToken.php | 116 + .../Argument/Token/IdenticalValueToken.php | 74 + .../Argument/Token/LogicalAndToken.php | 80 + .../Argument/Token/LogicalNotToken.php | 73 + .../Argument/Token/ObjectStateToken.php | 104 + .../Argument/Token/StringContainsToken.php | 67 + .../Argument/Token/TokenInterface.php | 43 + .../src/Prophecy/Argument/Token/TypeToken.php | 76 + .../prophecy/src/Prophecy/Call/Call.php | 127 + .../prophecy/src/Prophecy/Call/CallCenter.php | 162 + .../Prophecy/Comparator/ClosureComparator.php | 42 + .../src/Prophecy/Comparator/Factory.php | 47 + .../Comparator/ProphecyComparator.php | 28 + .../src/Prophecy/Doubler/CachedDoubler.php | 68 + .../ClassPatch/ClassPatchInterface.php | 48 + .../ClassPatch/DisableConstructorPatch.php | 72 + .../Doubler/ClassPatch/HhvmExceptionPatch.php | 63 + .../Doubler/ClassPatch/KeywordPatch.php | 135 + .../Doubler/ClassPatch/MagicCallPatch.php | 79 + .../ClassPatch/ProphecySubjectPatch.php | 98 + .../ReflectionClassNewInstancePatch.php | 57 + .../Doubler/ClassPatch/SplFileInfoPatch.php | 85 + .../Doubler/ClassPatch/TraversablePatch.php | 83 + .../src/Prophecy/Doubler/DoubleInterface.php | 22 + .../prophecy/src/Prophecy/Doubler/Doubler.php | 146 + .../Doubler/Generator/ClassCodeGenerator.php | 112 + .../Doubler/Generator/ClassCreator.php | 67 + .../Doubler/Generator/ClassMirror.php | 254 + .../Doubler/Generator/Node/ArgumentNode.php | 91 + .../Doubler/Generator/Node/ClassNode.php | 166 + .../Doubler/Generator/Node/MethodNode.php | 188 + .../Doubler/Generator/ReflectionInterface.php | 22 + .../src/Prophecy/Doubler/LazyDouble.php | 127 + .../src/Prophecy/Doubler/NameGenerator.php | 52 + .../Call/UnexpectedCallException.php | 40 + .../Doubler/ClassCreatorException.php | 31 + .../Doubler/ClassMirrorException.php | 31 + .../Doubler/ClassNotFoundException.php | 33 + .../Exception/Doubler/DoubleException.php | 18 + .../Exception/Doubler/DoublerException.php | 18 + .../Doubler/InterfaceNotFoundException.php | 20 + .../Doubler/MethodNotExtendableException.php | 47 + .../Doubler/MethodNotFoundException.php | 60 + .../Doubler/ReturnByReferenceException.php | 41 + .../src/Prophecy/Exception/Exception.php | 26 + .../Exception/InvalidArgumentException.php | 16 + .../Prediction/AggregateException.php | 50 + .../Prediction/FailedPredictionException.php | 24 + .../Exception/Prediction/NoCallsException.php | 18 + .../Prediction/PredictionException.php | 18 + .../UnexpectedCallsCountException.php | 31 + .../Prediction/UnexpectedCallsException.php | 32 + .../Prophecy/MethodProphecyException.php | 34 + .../Prophecy/ObjectProphecyException.php | 34 + .../Exception/Prophecy/ProphecyException.php | 18 + .../Prophecy/Prediction/CallPrediction.php | 86 + .../Prediction/CallTimesPrediction.php | 107 + .../Prediction/CallbackPrediction.php | 65 + .../Prophecy/Prediction/NoCallsPrediction.php | 68 + .../Prediction/PredictionInterface.php | 37 + .../src/Prophecy/Promise/CallbackPromise.php | 66 + .../src/Prophecy/Promise/PromiseInterface.php | 35 + .../Promise/ReturnArgumentPromise.php | 61 + .../src/Prophecy/Promise/ReturnPromise.php | 55 + .../src/Prophecy/Promise/ThrowPromise.php | 91 + .../src/Prophecy/Prophecy/MethodProphecy.php | 437 ++ .../src/Prophecy/Prophecy/ObjectProphecy.php | 281 ++ .../Prophecy/Prophecy/ProphecyInterface.php | 27 + .../Prophecy/ProphecySubjectInterface.php | 34 + .../src/Prophecy/Prophecy/Revealer.php | 44 + .../Prophecy/Prophecy/RevealerInterface.php | 29 + .../phpspec/prophecy/src/Prophecy/Prophet.php | 134 + .../prophecy/src/Prophecy/Util/ExportUtil.php | 211 + .../prophecy/src/Prophecy/Util/StringUtil.php | 89 + .../phpunit/php-code-coverage/.gitattributes | 1 + vendor/phpunit/php-code-coverage/.gitignore | 11 + vendor/phpunit/php-code-coverage/.travis.yml | 20 + .../phpunit/php-code-coverage/CONTRIBUTING.md | 5 + .../php-code-coverage/ChangeLog-2.2.md | 56 + vendor/phpunit/php-code-coverage/LICENSE | 33 + vendor/phpunit/php-code-coverage/README.md | 50 + vendor/phpunit/php-code-coverage/build.xml | 41 + .../php-code-coverage/build/travis-ci.xml | 21 + .../phpunit/php-code-coverage/composer.json | 50 + .../php-code-coverage/phpunit.xml.dist | 23 + .../php-code-coverage/scripts/auto_append.php | 5 + .../scripts/auto_prepend.php | 10 + .../php-code-coverage/src/CodeCoverage.php | 920 ++++ .../src/CodeCoverage/Driver.php | 47 + .../src/CodeCoverage/Driver/HHVM.php | 26 + .../src/CodeCoverage/Driver/PHPDBG.php | 105 + .../src/CodeCoverage/Driver/Xdebug.php | 97 + .../src/CodeCoverage/Exception.php | 18 + .../Exception/UnintentionallyCoveredCode.php | 18 + .../src/CodeCoverage/Filter.php | 293 ++ .../src/CodeCoverage/Report/Clover.php | 284 ++ .../src/CodeCoverage/Report/Crap4j.php | 164 + .../src/CodeCoverage/Report/Factory.php | 242 + .../src/CodeCoverage/Report/HTML.php | 182 + .../src/CodeCoverage/Report/HTML/Renderer.php | 271 ++ .../Report/HTML/Renderer/Dashboard.php | 295 ++ .../Report/HTML/Renderer/Directory.php | 97 + .../Report/HTML/Renderer/File.php | 556 +++ .../Renderer/Template/coverage_bar.html.dist | 5 + .../Renderer/Template/css/bootstrap.min.css | 5 + .../HTML/Renderer/Template/css/nv.d3.min.css | 1 + .../HTML/Renderer/Template/css/style.css | 122 + .../Renderer/Template/dashboard.html.dist | 284 ++ .../Renderer/Template/directory.html.dist | 61 + .../Template/directory_item.html.dist | 13 + .../HTML/Renderer/Template/file.html.dist | 90 + .../Renderer/Template/file_item.html.dist | 14 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 ++ .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../Renderer/Template/js/bootstrap.min.js | 7 + .../HTML/Renderer/Template/js/d3.min.js | 5 + .../HTML/Renderer/Template/js/holder.min.js | 12 + .../Renderer/Template/js/html5shiv.min.js | 4 + .../HTML/Renderer/Template/js/jquery.min.js | 5 + .../HTML/Renderer/Template/js/nv.d3.min.js | 8 + .../HTML/Renderer/Template/js/respond.min.js | 5 + .../Renderer/Template/method_item.html.dist | 11 + .../src/CodeCoverage/Report/Node.php | 339 ++ .../CodeCoverage/Report/Node/Directory.php | 478 ++ .../src/CodeCoverage/Report/Node/File.php | 679 +++ .../src/CodeCoverage/Report/Node/Iterator.php | 105 + .../src/CodeCoverage/Report/PHP.php | 50 + .../src/CodeCoverage/Report/Text.php | 246 + .../src/CodeCoverage/Report/XML.php | 234 + .../src/CodeCoverage/Report/XML/Directory.php | 16 + .../src/CodeCoverage/Report/XML/File.php | 73 + .../CodeCoverage/Report/XML/File/Coverage.php | 66 + .../CodeCoverage/Report/XML/File/Method.php | 58 + .../CodeCoverage/Report/XML/File/Report.php | 72 + .../src/CodeCoverage/Report/XML/File/Unit.php | 97 + .../src/CodeCoverage/Report/XML/Node.php | 89 + .../src/CodeCoverage/Report/XML/Project.php | 63 + .../src/CodeCoverage/Report/XML/Tests.php | 45 + .../src/CodeCoverage/Report/XML/Totals.php | 140 + .../src/CodeCoverage/Util.php | 45 + .../Util/InvalidArgumentHelper.php | 39 + .../tests/PHP/CodeCoverage/FilterTest.php | 281 ++ .../PHP/CodeCoverage/Report/CloverTest.php | 66 + .../PHP/CodeCoverage/Report/FactoryTest.php | 222 + .../tests/PHP/CodeCoverage/UtilTest.php | 30 + .../tests/PHP/CodeCoverageTest.php | 487 ++ .../php-code-coverage/tests/TestCase.php | 311 ++ .../tests/_files/BankAccount-clover.xml | 26 + .../tests/_files/BankAccount.php | 33 + .../tests/_files/BankAccountTest.php | 66 + .../_files/CoverageClassExtendedTest.php | 12 + .../tests/_files/CoverageClassTest.php | 12 + .../CoverageFunctionParenthesesTest.php | 11 + ...erageFunctionParenthesesWhitespaceTest.php | 11 + .../tests/_files/CoverageFunctionTest.php | 11 + .../CoverageMethodOneLineAnnotationTest.php | 11 + .../_files/CoverageMethodParenthesesTest.php | 12 + ...overageMethodParenthesesWhitespaceTest.php | 12 + .../tests/_files/CoverageMethodTest.php | 12 + .../tests/_files/CoverageNoneTest.php | 9 + .../tests/_files/CoverageNotPrivateTest.php | 12 + .../tests/_files/CoverageNotProtectedTest.php | 12 + .../tests/_files/CoverageNotPublicTest.php | 12 + .../tests/_files/CoverageNothingTest.php | 13 + .../tests/_files/CoveragePrivateTest.php | 12 + .../tests/_files/CoverageProtectedTest.php | 12 + .../tests/_files/CoveragePublicTest.php | 12 + .../CoverageTwoDefaultClassAnnotations.php | 18 + .../tests/_files/CoveredClass.php | 36 + .../tests/_files/CoveredFunction.php | 4 + .../NamespaceCoverageClassExtendedTest.php | 12 + .../_files/NamespaceCoverageClassTest.php | 12 + ...NamespaceCoverageCoversClassPublicTest.php | 15 + .../NamespaceCoverageCoversClassTest.php | 20 + .../_files/NamespaceCoverageMethodTest.php | 12 + .../NamespaceCoverageNotPrivateTest.php | 12 + .../NamespaceCoverageNotProtectedTest.php | 12 + .../_files/NamespaceCoverageNotPublicTest.php | 12 + .../_files/NamespaceCoveragePrivateTest.php | 12 + .../_files/NamespaceCoverageProtectedTest.php | 12 + .../_files/NamespaceCoveragePublicTest.php | 12 + .../tests/_files/NamespaceCoveredClass.php | 38 + .../_files/NotExistingCoveredElementTest.php | 24 + .../class-with-anonymous-function-clover.xml | 22 + .../tests/_files/ignored-lines-clover.xml | 17 + ...urce_with_class_and_anonymous_function.php | 19 + .../tests/_files/source_with_ignore.php | 37 + .../tests/_files/source_with_namespace.php | 20 + .../source_with_oneline_annotations.php | 36 + .../tests/_files/source_without_ignore.php | 4 + .../tests/_files/source_without_namespace.php | 18 + .../phpunit/php-file-iterator/.gitattributes | 1 + vendor/phpunit/php-file-iterator/.gitignore | 7 + vendor/phpunit/php-file-iterator/ChangeLog.md | 10 + vendor/phpunit/php-file-iterator/LICENSE | 33 + vendor/phpunit/php-file-iterator/README.md | 12 + .../phpunit/php-file-iterator/composer.json | 36 + .../phpunit/php-file-iterator/src/Facade.php | 123 + .../phpunit/php-file-iterator/src/Factory.php | 91 + .../php-file-iterator/src/Iterator.php | 158 + .../phpunit/php-text-template/.gitattributes | 1 + vendor/phpunit/php-text-template/.gitignore | 5 + vendor/phpunit/php-text-template/LICENSE | 33 + vendor/phpunit/php-text-template/README.md | 14 + .../phpunit/php-text-template/composer.json | 29 + .../php-text-template/src/Template.php | 135 + vendor/phpunit/php-timer/.gitattributes | 1 + vendor/phpunit/php-timer/.gitignore | 7 + vendor/phpunit/php-timer/.travis.yml | 22 + vendor/phpunit/php-timer/LICENSE | 33 + vendor/phpunit/php-timer/README.md | 47 + vendor/phpunit/php-timer/composer.json | 29 + vendor/phpunit/php-timer/src/Timer.php | 107 + vendor/phpunit/php-timer/tests/TimerTest.php | 101 + .../phpunit/php-token-stream/.gitattributes | 1 + vendor/phpunit/php-token-stream/.gitignore | 4 + vendor/phpunit/php-token-stream/.travis.yml | 35 + vendor/phpunit/php-token-stream/LICENSE | 33 + vendor/phpunit/php-token-stream/README.md | 13 + vendor/phpunit/php-token-stream/build.xml | 33 + .../php-token-stream/build/phpunit.xml | 17 + vendor/phpunit/php-token-stream/composer.json | 34 + vendor/phpunit/php-token-stream/src/Token.php | 846 ++++ .../php-token-stream/src/Token/Stream.php | 606 +++ .../src/Token/Stream/CachingFactory.php | 51 + .../tests/Token/ClassTest.php | 112 + .../tests/Token/ClosureTest.php | 85 + .../tests/Token/FunctionTest.php | 146 + .../tests/Token/IncludeTest.php | 73 + .../tests/Token/InterfaceTest.php | 191 + .../tests/Token/NamespaceTest.php | 80 + .../php-token-stream/tests/TokenTest.php | 42 + .../_fixture/classExtendsNamespacedClass.php | 10 + .../tests/_fixture/classInNamespace.php | 6 + .../tests/_fixture/classInScopedNamespace.php | 9 + ...h_method_that_declares_anonymous_class.php | 15 + ..._method_that_declares_anonymous_class2.php | 16 + .../tests/_fixture/closure.php | 7 + .../tests/_fixture/issue19.php | 3 + .../tests/_fixture/issue30.php | 8 + ...tipleNamespacesWithOneClassUsingBraces.php | 12 + ...espacesWithOneClassUsingNonBraceSyntax.php | 14 + .../tests/_fixture/source.php | 36 + .../tests/_fixture/source2.php | 6 + .../tests/_fixture/source3.php | 14 + .../tests/_fixture/source4.php | 30 + .../tests/_fixture/source5.php | 5 + .../php-token-stream/tests/bootstrap.php | 7 + .../phpunit-mock-objects/.gitattributes | 1 + .../phpunit/phpunit-mock-objects/.gitignore | 8 + .../phpunit/phpunit-mock-objects/.travis.yml | 26 + .../phpunit-mock-objects/CONTRIBUTING.md | 5 + vendor/phpunit/phpunit-mock-objects/LICENSE | 33 + vendor/phpunit/phpunit-mock-objects/README.md | 21 + vendor/phpunit/phpunit-mock-objects/build.xml | 42 + .../phpunit-mock-objects/build/travis-ci.xml | 12 + .../phpunit-mock-objects/composer.json | 50 + .../phpunit-mock-objects/phpunit.xml.dist | 22 + .../Framework/MockObject/Builder/Identity.php | 30 + .../MockObject/Builder/InvocationMocker.php | 255 + .../Framework/MockObject/Builder/Match.php | 26 + .../MockObject/Builder/MethodNameMatch.php | 28 + .../MockObject/Builder/Namespace.php | 39 + .../MockObject/Builder/ParametersMatch.php | 49 + .../src/Framework/MockObject/Builder/Stub.php | 26 + .../Exception/BadMethodCallException.php | 16 + .../MockObject/Exception/Exception.php | 18 + .../MockObject/Exception/RuntimeException.php | 16 + .../src/Framework/MockObject/Generator.php | 1120 +++++ .../Generator/mocked_class.tpl.dist | 36 + .../Generator/mocked_class_method.tpl.dist | 7 + .../Generator/mocked_clone.tpl.dist | 4 + .../Generator/mocked_method.tpl.dist | 22 + .../Generator/mocked_static_method.tpl.dist | 5 + .../Generator/proxied_method.tpl.dist | 22 + .../MockObject/Generator/trait_class.tpl.dist | 4 + .../Generator/unmocked_clone.tpl.dist | 5 + .../MockObject/Generator/wsdl_class.tpl.dist | 7 + .../MockObject/Generator/wsdl_method.tpl.dist | 4 + .../src/Framework/MockObject/Invocation.php | 18 + .../MockObject/Invocation/Object.php | 35 + .../MockObject/Invocation/Static.php | 152 + .../Framework/MockObject/InvocationMocker.php | 156 + .../src/Framework/MockObject/Invokable.php | 39 + .../src/Framework/MockObject/Matcher.php | 271 ++ .../MockObject/Matcher/AnyInvokedCount.php | 32 + .../MockObject/Matcher/AnyParameters.php | 34 + .../Matcher/ConsecutiveParameters.php | 123 + .../MockObject/Matcher/Invocation.php | 48 + .../MockObject/Matcher/InvokedAtIndex.php | 86 + .../Matcher/InvokedAtLeastCount.php | 57 + .../MockObject/Matcher/InvokedAtLeastOnce.php | 45 + .../MockObject/Matcher/InvokedAtMostCount.php | 57 + .../MockObject/Matcher/InvokedCount.php | 109 + .../MockObject/Matcher/InvokedRecorder.php | 67 + .../MockObject/Matcher/MethodName.php | 66 + .../MockObject/Matcher/Parameters.php | 127 + .../Matcher/StatelessInvocation.php | 56 + .../src/Framework/MockObject/MockBuilder.php | 322 ++ .../src/Framework/MockObject/MockObject.php | 47 + .../src/Framework/MockObject/Stub.php | 31 + .../MockObject/Stub/ConsecutiveCalls.php | 48 + .../Framework/MockObject/Stub/Exception.php | 41 + .../MockObject/Stub/MatcherCollection.php | 26 + .../src/Framework/MockObject/Stub/Return.php | 41 + .../MockObject/Stub/ReturnArgument.php | 38 + .../MockObject/Stub/ReturnCallback.php | 51 + .../Framework/MockObject/Stub/ReturnSelf.php | 34 + .../MockObject/Stub/ReturnValueMap.php | 47 + .../src/Framework/MockObject/Verifiable.php | 25 + .../tests/GeneratorTest.php | 200 + .../tests/MockBuilderTest.php | 107 + .../tests/MockObject/232.phpt | 129 + .../MockObject/Invocation/ObjectTest.php | 85 + .../MockObject/Invocation/StaticTest.php | 54 + .../Matcher/ConsecutiveParametersTest.php | 45 + .../tests/MockObject/abstract_class.phpt | 143 + .../tests/MockObject/class.phpt | 121 + .../MockObject/class_call_parent_clone.phpt | 73 + .../class_call_parent_constructor.phpt | 72 + .../class_dont_call_parent_clone.phpt | 72 + .../class_dont_call_parent_constructor.phpt | 72 + ...ing_interface_call_parent_constructor.phpt | 77 + ...nterface_dont_call_parent_constructor.phpt | 77 + .../tests/MockObject/class_partial.phpt | 99 + .../class_with_method_named_method.phpt | 88 + ...s_with_method_with_variadic_arguments.phpt | 99 + .../tests/MockObject/interface.phpt | 93 + .../invocation_object_clone_object.phpt | 122 + .../tests/MockObject/namespaced_class.phpt | 123 + .../namespaced_class_call_parent_clone.phpt | 75 + ...espaced_class_call_parent_constructor.phpt | 74 + ...mespaced_class_dont_call_parent_clone.phpt | 74 + ...ed_class_dont_call_parent_constructor.phpt | 74 + ...ing_interface_call_parent_constructor.phpt | 79 + ...nterface_dont_call_parent_constructor.phpt | 79 + .../MockObject/namespaced_class_partial.phpt | 101 + .../MockObject/namespaced_interface.phpt | 95 + .../tests/MockObject/nonexistent_class.phpt | 70 + .../nonexistent_class_with_namespace.phpt | 78 + ...ith_namespace_starting_with_separator.phpt | 78 + .../tests/MockObject/proxy.phpt | 117 + .../MockObject/scalar_type_declarations.phpt | 99 + .../tests/MockObject/wsdl_class.phpt | 37 + .../MockObject/wsdl_class_namespace.phpt | 39 + .../tests/MockObject/wsdl_class_partial.phpt | 30 + .../tests/MockObjectTest.php | 842 ++++ .../tests/ProxyObjectTest.php | 40 + .../tests/_fixture/AbstractMockTestClass.php | 10 + .../tests/_fixture/AbstractTrait.php | 15 + .../tests/_fixture/AnInterface.php | 5 + .../tests/_fixture/AnotherInterface.php | 5 + .../tests/_fixture/Bar.php | 8 + .../ClassThatImplementsSerializable.php | 15 + .../tests/_fixture/ClassWithStaticMethod.php | 7 + .../tests/_fixture/Foo.php | 8 + .../tests/_fixture/FunctionCallback.php | 9 + .../tests/_fixture/GoogleSearch.wsdl | 198 + .../_fixture/InterfaceWithStaticMethod.php | 5 + .../tests/_fixture/MethodCallback.php | 21 + .../_fixture/MethodCallbackByReference.php | 13 + .../tests/_fixture/MockTestInterface.php | 6 + .../tests/_fixture/Mockable.php | 28 + .../tests/_fixture/PartialMockTestClass.php | 18 + .../tests/_fixture/SingletonClass.php | 28 + .../tests/_fixture/SomeClass.php | 13 + .../tests/_fixture/StaticMockTestClass.php | 12 + .../_fixture/TraversableMockTestInterface.php | 4 + .../phpunit-mock-objects/tests/bootstrap.php | 3 + vendor/phpunit/phpunit/.gitattributes | 3 + vendor/phpunit/phpunit/.gitignore | 22 + vendor/phpunit/phpunit/.php_cs | 69 + vendor/phpunit/phpunit/.travis.yml | 41 + vendor/phpunit/phpunit/CODE_OF_CONDUCT.md | 28 + vendor/phpunit/phpunit/CONTRIBUTING.md | 67 + vendor/phpunit/phpunit/ChangeLog-4.0.md | 176 + vendor/phpunit/phpunit/ChangeLog-4.1.md | 73 + vendor/phpunit/phpunit/ChangeLog-4.2.md | 56 + vendor/phpunit/phpunit/ChangeLog-4.3.md | 54 + vendor/phpunit/phpunit/ChangeLog-4.4.md | 57 + vendor/phpunit/phpunit/ChangeLog-4.5.md | 28 + vendor/phpunit/phpunit/ChangeLog-4.6.md | 95 + vendor/phpunit/phpunit/ChangeLog-4.7.md | 71 + vendor/phpunit/phpunit/ChangeLog-4.8.md | 196 + vendor/phpunit/phpunit/LICENSE | 33 + vendor/phpunit/phpunit/README.md | 46 + vendor/phpunit/phpunit/build.xml | 287 ++ vendor/phpunit/phpunit/build/bin/phpab | 891 ++++ .../phpunit/build/binary-phar-autoload.php.in | 34 + vendor/phpunit/phpunit/build/ca.pem | 25 + .../build/library-phar-autoload.php.in | 9 + .../phpunit/phpunit/build/phar-manifest.php | 27 + vendor/phpunit/phpunit/build/phar-version.php | 22 + .../phpunit/phpunit/build/travis-ci-fail.xml | 16 + vendor/phpunit/phpunit/composer.json | 74 + vendor/phpunit/phpunit/phpdox.xml.dist | 23 + vendor/phpunit/phpunit/phpunit | 47 + vendor/phpunit/phpunit/phpunit.xml.dist | 34 + vendor/phpunit/phpunit/phpunit.xsd | 262 ++ vendor/phpunit/phpunit/src/Exception.php | 18 + .../phpunit/src/Extensions/GroupTestSuite.php | 60 + .../phpunit/src/Extensions/PhptTestCase.php | 241 + .../phpunit/src/Extensions/PhptTestSuite.php | 40 + .../phpunit/src/Extensions/RepeatedTest.php | 90 + .../phpunit/src/Extensions/TestDecorator.php | 109 + .../phpunit/src/Extensions/TicketListener.php | 204 + .../phpunit/phpunit/src/Framework/Assert.php | 3165 +++++++++++++ .../src/Framework/Assert/Functions.php | 2569 ++++++++++ .../src/Framework/AssertionFailedError.php | 27 + .../src/Framework/BaseTestListener.php | 55 + .../src/Framework/CodeCoverageException.php | 16 + .../phpunit/src/Framework/Constraint.php | 153 + .../phpunit/src/Framework/Constraint/And.php | 125 + .../src/Framework/Constraint/ArrayHasKey.php | 82 + .../src/Framework/Constraint/ArraySubset.php | 85 + .../src/Framework/Constraint/Attribute.php | 87 + .../src/Framework/Constraint/Callback.php | 59 + .../Constraint/ClassHasAttribute.php | 82 + .../Constraint/ClassHasStaticAttribute.php | 56 + .../src/Framework/Constraint/Composite.php | 70 + .../src/Framework/Constraint/Count.php | 104 + .../src/Framework/Constraint/Exception.php | 88 + .../Framework/Constraint/ExceptionCode.php | 69 + .../Framework/Constraint/ExceptionMessage.php | 69 + .../Constraint/ExceptionMessageRegExp.php | 77 + .../src/Framework/Constraint/FileExists.php | 60 + .../src/Framework/Constraint/GreaterThan.php | 55 + .../src/Framework/Constraint/IsAnything.php | 62 + .../src/Framework/Constraint/IsEmpty.php | 66 + .../src/Framework/Constraint/IsEqual.php | 179 + .../src/Framework/Constraint/IsFalse.php | 40 + .../src/Framework/Constraint/IsIdentical.php | 132 + .../src/Framework/Constraint/IsInstanceOf.php | 94 + .../src/Framework/Constraint/IsJson.php | 69 + .../src/Framework/Constraint/IsNull.php | 40 + .../src/Framework/Constraint/IsTrue.php | 40 + .../src/Framework/Constraint/IsType.php | 143 + .../src/Framework/Constraint/JsonMatches.php | 71 + .../JsonMatches/ErrorMessageProvider.php | 69 + .../src/Framework/Constraint/LessThan.php | 55 + .../phpunit/src/Framework/Constraint/Not.php | 160 + .../Constraint/ObjectHasAttribute.php | 35 + .../phpunit/src/Framework/Constraint/Or.php | 117 + .../src/Framework/Constraint/PCREMatch.php | 63 + .../src/Framework/Constraint/SameSize.php | 28 + .../Framework/Constraint/StringContains.php | 81 + .../Framework/Constraint/StringEndsWith.php | 55 + .../Framework/Constraint/StringMatches.php | 101 + .../Framework/Constraint/StringStartsWith.php | 55 + .../Constraint/TraversableContains.php | 127 + .../Constraint/TraversableContainsOnly.php | 95 + .../phpunit/src/Framework/Constraint/Xor.php | 122 + .../phpunit/phpunit/src/Framework/Error.php | 34 + .../src/Framework/Error/Deprecated.php | 24 + .../phpunit/src/Framework/Error/Notice.php | 24 + .../phpunit/src/Framework/Error/Warning.php | 24 + .../phpunit/src/Framework/Exception.php | 77 + .../src/Framework/ExceptionWrapper.php | 91 + .../Framework/ExpectationFailedException.php | 41 + .../phpunit/src/Framework/IncompleteTest.php | 19 + .../src/Framework/IncompleteTestCase.php | 84 + .../src/Framework/IncompleteTestError.php | 19 + .../Framework/InvalidCoversTargetError.php | 19 + .../InvalidCoversTargetException.php | 16 + .../phpunit/src/Framework/OutputError.php | 19 + .../phpunit/src/Framework/RiskyTest.php | 19 + .../phpunit/src/Framework/RiskyTestError.php | 19 + .../phpunit/src/Framework/SelfDescribing.php | 24 + .../phpunit/src/Framework/SkippedTest.php | 18 + .../phpunit/src/Framework/SkippedTestCase.php | 82 + .../src/Framework/SkippedTestError.php | 19 + .../src/Framework/SkippedTestSuiteError.php | 19 + .../phpunit/src/Framework/SyntheticError.php | 80 + vendor/phpunit/phpunit/src/Framework/Test.php | 26 + .../phpunit/src/Framework/TestCase.php | 2203 +++++++++ .../phpunit/src/Framework/TestFailure.php | 167 + .../phpunit/src/Framework/TestListener.php | 99 + .../phpunit/src/Framework/TestResult.php | 1128 +++++ .../phpunit/src/Framework/TestSuite.php | 1036 +++++ .../src/Framework/TestSuite/DataProvider.php | 27 + .../UnintentionallyCoveredCodeError.php | 19 + .../phpunit/phpunit/src/Framework/Warning.php | 81 + .../phpunit/src/Runner/BaseTestRunner.php | 140 + .../phpunit/phpunit/src/Runner/Exception.php | 16 + .../phpunit/src/Runner/Filter/Factory.php | 51 + .../phpunit/src/Runner/Filter/Group.php | 59 + .../src/Runner/Filter/Group/Exclude.php | 20 + .../src/Runner/Filter/Group/Include.php | 20 + .../phpunit/src/Runner/Filter/Test.php | 116 + .../src/Runner/StandardTestSuiteLoader.php | 118 + .../phpunit/src/Runner/TestSuiteLoader.php | 32 + vendor/phpunit/phpunit/src/Runner/Version.php | 81 + vendor/phpunit/phpunit/src/TextUI/Command.php | 1016 ++++ .../phpunit/src/TextUI/ResultPrinter.php | 653 +++ .../phpunit/phpunit/src/TextUI/TestRunner.php | 1061 +++++ vendor/phpunit/phpunit/src/Util/Blacklist.php | 115 + .../phpunit/src/Util/Configuration.php | 1158 +++++ .../phpunit/phpunit/src/Util/ErrorHandler.php | 117 + .../phpunit/phpunit/src/Util/Fileloader.php | 72 + .../phpunit/phpunit/src/Util/Filesystem.php | 42 + vendor/phpunit/phpunit/src/Util/Filter.php | 107 + vendor/phpunit/phpunit/src/Util/Getopt.php | 163 + .../phpunit/phpunit/src/Util/GlobalState.php | 192 + .../src/Util/InvalidArgumentHelper.php | 41 + vendor/phpunit/phpunit/src/Util/Log/JSON.php | 244 + vendor/phpunit/phpunit/src/Util/Log/JUnit.php | 454 ++ vendor/phpunit/phpunit/src/Util/Log/TAP.php | 257 + vendor/phpunit/phpunit/src/Util/PHP.php | 227 + .../phpunit/phpunit/src/Util/PHP/Default.php | 89 + .../Util/PHP/Template/TestCaseMethod.tpl.dist | 89 + .../phpunit/phpunit/src/Util/PHP/Windows.php | 106 + .../phpunit/src/Util/PHP/eval-stdin.php | 3 + vendor/phpunit/phpunit/src/Util/Printer.php | 172 + vendor/phpunit/phpunit/src/Util/Regex.php | 26 + vendor/phpunit/phpunit/src/Util/String.php | 71 + vendor/phpunit/phpunit/src/Util/Test.php | 1084 +++++ .../src/Util/TestDox/NamePrettifier.php | 142 + .../src/Util/TestDox/ResultPrinter.php | 339 ++ .../src/Util/TestDox/ResultPrinter/HTML.php | 80 + .../src/Util/TestDox/ResultPrinter/Text.php | 54 + .../phpunit/src/Util/TestSuiteIterator.php | 103 + vendor/phpunit/phpunit/src/Util/Type.php | 38 + vendor/phpunit/phpunit/src/Util/XML.php | 943 ++++ .../tests/Extensions/PhptTestCaseTest.php | 36 + .../tests/Extensions/RepeatedTestTest.php | 64 + vendor/phpunit/phpunit/tests/Fail/fail.phpt | 5 + .../phpunit/tests/Framework/AssertTest.php | 4130 +++++++++++++++++ .../tests/Framework/BaseTestListenerTest.php | 34 + .../tests/Framework/Constraint/CountTest.php | 63 + .../Constraint/ExceptionMessageRegExpTest.php | 56 + .../Constraint/ExceptionMessageTest.php | 52 + .../JsonMatches/ErrorMessageProviderTest.php | 83 + .../Framework/Constraint/JsonMatchesTest.php | 48 + .../tests/Framework/ConstraintTest.php | 3489 ++++++++++++++ .../phpunit/tests/Framework/SuiteTest.php | 242 + .../phpunit/tests/Framework/TestCaseTest.php | 550 +++ .../tests/Framework/TestFailureTest.php | 27 + .../tests/Framework/TestImplementorTest.php | 30 + .../tests/Framework/TestListenerTest.php | 108 + .../phpunit/tests/Regression/1021.phpt | 19 + .../tests/Regression/1021/Issue1021Test.php | 23 + .../phpunit/phpunit/tests/Regression/523.phpt | 19 + .../tests/Regression/523/Issue523Test.php | 13 + .../phpunit/phpunit/tests/Regression/578.phpt | 37 + .../tests/Regression/578/Issue578Test.php | 20 + .../phpunit/phpunit/tests/Regression/684.phpt | 25 + .../tests/Regression/684/Issue684Test.php | 4 + .../phpunit/phpunit/tests/Regression/783.phpt | 21 + .../tests/Regression/783/ChildSuite.php | 15 + .../phpunit/tests/Regression/783/OneTest.php | 10 + .../tests/Regression/783/ParentSuite.php | 13 + .../phpunit/tests/Regression/783/TwoTest.php | 10 + .../phpunit/tests/Regression/GitHub/1149.phpt | 20 + .../Regression/GitHub/1149/Issue1149Test.php | 18 + .../phpunit/tests/Regression/GitHub/1216.phpt | 25 + .../Regression/GitHub/1216/Issue1216Test.php | 8 + .../Regression/GitHub/1216/bootstrap1216.php | 2 + .../Regression/GitHub/1216/phpunit1216.xml | 8 + .../phpunit/tests/Regression/GitHub/1265.phpt | 21 + .../Regression/GitHub/1265/Issue1265Test.php | 8 + .../Regression/GitHub/1265/phpunit1265.xml | 2 + .../phpunit/tests/Regression/GitHub/1330.phpt | 24 + .../Regression/GitHub/1330/Issue1330Test.php | 8 + .../Regression/GitHub/1330/phpunit1330.xml | 5 + .../phpunit/tests/Regression/GitHub/1335.phpt | 21 + .../Regression/GitHub/1335/Issue1335Test.php | 67 + .../Regression/GitHub/1335/bootstrap1335.php | 13 + .../phpunit/tests/Regression/GitHub/1337.phpt | 21 + .../Regression/GitHub/1337/Issue1337Test.php | 19 + .../phpunit/tests/Regression/GitHub/1348.phpt | 36 + .../Regression/GitHub/1348/Issue1348Test.php | 14 + .../phpunit/tests/Regression/GitHub/1351.phpt | 48 + .../GitHub/1351/ChildProcessClass1351.php | 4 + .../Regression/GitHub/1351/Issue1351Test.php | 48 + .../phpunit/tests/Regression/GitHub/1374.phpt | 21 + .../Regression/GitHub/1374/Issue1374Test.php | 21 + .../phpunit/tests/Regression/GitHub/1437.phpt | 28 + .../Regression/GitHub/1437/Issue1437Test.php | 9 + .../phpunit/tests/Regression/GitHub/1468.phpt | 22 + .../Regression/GitHub/1468/Issue1468Test.php | 11 + .../phpunit/tests/Regression/GitHub/1471.phpt | 28 + .../Regression/GitHub/1471/Issue1471Test.php | 12 + .../phpunit/tests/Regression/GitHub/1472.phpt | 26 + .../Regression/GitHub/1472/Issue1472Test.php | 21 + .../phpunit/tests/Regression/GitHub/1570.phpt | 21 + .../Regression/GitHub/1570/Issue1570Test.php | 8 + .../phpunit/tests/Regression/GitHub/244.phpt | 32 + .../Regression/GitHub/244/Issue244Test.php | 55 + .../phpunit/tests/Regression/GitHub/322.phpt | 26 + .../Regression/GitHub/322/Issue322Test.php | 17 + .../Regression/GitHub/322/phpunit322.xml | 11 + .../phpunit/tests/Regression/GitHub/433.phpt | 31 + .../Regression/GitHub/433/Issue433Test.php | 21 + .../phpunit/tests/Regression/GitHub/445.phpt | 32 + .../Regression/GitHub/445/Issue445Test.php | 21 + .../phpunit/tests/Regression/GitHub/498.phpt | 29 + .../Regression/GitHub/498/Issue498Test.php | 44 + .../phpunit/tests/Regression/GitHub/503.phpt | 33 + .../Regression/GitHub/503/Issue503Test.php | 11 + .../phpunit/tests/Regression/GitHub/581.phpt | 42 + .../Regression/GitHub/581/Issue581Test.php | 11 + .../phpunit/tests/Regression/GitHub/74.phpt | 28 + .../Regression/GitHub/74/Issue74Test.php | 9 + .../Regression/GitHub/74/NewException.php | 4 + .../phpunit/tests/Regression/GitHub/765.phpt | 26 + .../Regression/GitHub/765/Issue765Test.php | 22 + .../phpunit/tests/Regression/GitHub/797.phpt | 22 + .../Regression/GitHub/797/Issue797Test.php | 10 + .../Regression/GitHub/797/bootstrap797.php | 6 + .../phpunit/tests/Regression/GitHub/863.phpt | 24 + .../tests/Regression/GitHub/873-php5.phpt | 22 + .../tests/Regression/GitHub/873-php7.phpt | 22 + .../Regression/GitHub/873/Issue873Test.php | 9 + .../tests/Runner/BaseTestRunnerTest.php | 22 + .../tests/TextUI/abstract-test-class.phpt | 25 + .../phpunit/tests/TextUI/colors-always.phpt | 19 + .../tests/TextUI/concrete-test-class.phpt | 19 + .../tests/TextUI/custom-printer-debug.phpt | 27 + .../tests/TextUI/custom-printer-verbose.phpt | 32 + .../tests/TextUI/dataprovider-debug.phpt | 34 + .../dataprovider-log-xml-isolation.phpt | 47 + .../tests/TextUI/dataprovider-log-xml.phpt | 46 + .../tests/TextUI/dataprovider-testdox.phpt | 17 + .../phpunit/phpunit/tests/TextUI/debug.phpt | 26 + .../tests/TextUI/default-isolation.phpt | 20 + .../phpunit/phpunit/tests/TextUI/default.phpt | 19 + .../tests/TextUI/dependencies-isolation.phpt | 40 + .../phpunit/tests/TextUI/dependencies.phpt | 39 + .../tests/TextUI/dependencies2-isolation.phpt | 20 + .../phpunit/tests/TextUI/dependencies2.phpt | 19 + .../tests/TextUI/dependencies3-isolation.phpt | 20 + .../phpunit/tests/TextUI/dependencies3.phpt | 19 + .../phpunit/tests/TextUI/empty-testcase.phpt | 25 + .../phpunit/tests/TextUI/exception-stack.phpt | 65 + .../tests/TextUI/exclude-group-isolation.phpt | 22 + .../phpunit/tests/TextUI/exclude-group.phpt | 21 + .../tests/TextUI/failure-isolation.phpt | 142 + .../phpunit/phpunit/tests/TextUI/failure.phpt | 141 + .../phpunit/tests/TextUI/fatal-isolation.phpt | 26 + .../tests/TextUI/filter-class-isolation.phpt | 22 + .../phpunit/tests/TextUI/filter-class.phpt | 21 + ...ider-by-classname-and-range-isolation.phpt | 22 + ...r-dataprovider-by-classname-and-range.phpt | 21 + ...lter-dataprovider-by-number-isolation.phpt | 22 + .../TextUI/filter-dataprovider-by-number.phpt | 21 + ...-dataprovider-by-only-range-isolation.phpt | 22 + .../filter-dataprovider-by-only-range.phpt | 21 + ...dataprovider-by-only-regexp-isolation.phpt | 22 + .../filter-dataprovider-by-only-regexp.phpt | 21 + ...dataprovider-by-only-string-isolation.phpt | 22 + .../filter-dataprovider-by-only-string.phpt | 21 + ...ilter-dataprovider-by-range-isolation.phpt | 22 + .../TextUI/filter-dataprovider-by-range.phpt | 21 + ...lter-dataprovider-by-regexp-isolation.phpt | 22 + .../TextUI/filter-dataprovider-by-regexp.phpt | 21 + ...lter-dataprovider-by-string-isolation.phpt | 22 + .../TextUI/filter-dataprovider-by-string.phpt | 21 + .../filter-method-case-insensitive.phpt | 21 + ...ilter-method-case-sensitive-no-result.phpt | 21 + .../tests/TextUI/filter-method-isolation.phpt | 22 + .../phpunit/tests/TextUI/filter-method.phpt | 21 + .../tests/TextUI/filter-no-results.phpt | 21 + .../phpunit/tests/TextUI/group-isolation.phpt | 22 + .../phpunit/phpunit/tests/TextUI/group.phpt | 21 + vendor/phpunit/phpunit/tests/TextUI/help.phpt | 87 + .../phpunit/phpunit/tests/TextUI/help2.phpt | 88 + .../phpunit/tests/TextUI/ini-isolation.phpt | 22 + .../phpunit/tests/TextUI/list-groups.phpt | 19 + .../TextUI/log-json-no-pretty-print.phpt | 27 + .../tests/TextUI/log-json-post-66021.phpt | 72 + .../tests/TextUI/log-json-pre-66021.phpt | 78 + .../phpunit/phpunit/tests/TextUI/log-tap.phpt | 26 + .../phpunit/phpunit/tests/TextUI/log-xml.phpt | 29 + .../tests/TextUI/options-after-arguments.phpt | 19 + .../tests/TextUI/output-isolation.phpt | 21 + .../phpunit/phpunit/tests/TextUI/repeat.phpt | 21 + .../report-useless-tests-incomplete.phpt | 21 + .../report-useless-tests-isolation.phpt | 22 + .../tests/TextUI/report-useless-tests.phpt | 21 + vendor/phpunit/phpunit/tests/TextUI/tap.phpt | 18 + .../tests/TextUI/test-suffix-multiple.phpt | 20 + .../tests/TextUI/test-suffix-single.phpt | 20 + .../phpunit/tests/TextUI/testdox-html.phpt | 21 + .../phpunit/tests/TextUI/testdox-text.phpt | 25 + .../phpunit/phpunit/tests/TextUI/testdox.phpt | 19 + .../phpunit/tests/Util/ConfigurationTest.php | 504 ++ .../phpunit/phpunit/tests/Util/GetoptTest.php | 62 + .../phpunit/tests/Util/GlobalStateTest.php | 35 + .../phpunit/phpunit/tests/Util/RegexTest.php | 52 + .../tests/Util/TestDox/NamePrettifierTest.php | 81 + .../phpunit/phpunit/tests/Util/TestTest.php | 673 +++ vendor/phpunit/phpunit/tests/Util/XMLTest.php | 345 ++ .../phpunit/tests/_files/AbstractTest.php | 7 + .../phpunit/phpunit/tests/_files/Author.php | 27 + .../phpunit/tests/_files/BankAccount.php | 82 + .../phpunit/tests/_files/BankAccountTest.php | 87 + .../tests/_files/BankAccountTest.test.php | 87 + .../tests/_files/BaseTestListenerSample.php | 11 + .../tests/_files/BeforeAndAfterTest.php | 35 + .../_files/BeforeClassAndAfterClassTest.php | 35 + vendor/phpunit/phpunit/tests/_files/Book.php | 20 + .../phpunit/tests/_files/Calculator.php | 14 + .../ChangeCurrentWorkingDirectoryTest.php | 9 + .../_files/ClassWithNonPublicAttributes.php | 29 + .../ClassWithScalarTypeDeclarations.php | 7 + .../tests/_files/ClassWithToString.php | 22 + .../phpunit/tests/_files/ConcreteTest.my.php | 7 + .../phpunit/tests/_files/ConcreteTest.php | 7 + .../_files/CoverageClassExtendedTest.php | 12 + .../tests/_files/CoverageClassTest.php | 12 + .../CoverageFunctionParenthesesTest.php | 11 + ...erageFunctionParenthesesWhitespaceTest.php | 11 + .../tests/_files/CoverageFunctionTest.php | 11 + .../CoverageMethodOneLineAnnotationTest.php | 11 + .../_files/CoverageMethodParenthesesTest.php | 12 + ...overageMethodParenthesesWhitespaceTest.php | 12 + .../tests/_files/CoverageMethodTest.php | 12 + .../_files/CoverageNamespacedFunctionTest.php | 11 + .../phpunit/tests/_files/CoverageNoneTest.php | 9 + .../tests/_files/CoverageNotPrivateTest.php | 12 + .../tests/_files/CoverageNotProtectedTest.php | 12 + .../tests/_files/CoverageNotPublicTest.php | 12 + .../tests/_files/CoverageNothingTest.php | 13 + .../tests/_files/CoveragePrivateTest.php | 12 + .../tests/_files/CoverageProtectedTest.php | 12 + .../tests/_files/CoveragePublicTest.php | 12 + .../CoverageTwoDefaultClassAnnotations.php | 17 + .../phpunit/tests/_files/CoveredClass.php | 36 + .../phpunit/tests/_files/CoveredFunction.php | 4 + .../phpunit/tests/_files/CustomPrinter.php | 4 + .../tests/_files/DataProviderDebugTest.php | 48 + .../tests/_files/DataProviderFilterTest.php | 39 + .../_files/DataProviderIncompleteTest.php | 37 + .../tests/_files/DataProviderSkippedTest.php | 37 + .../phpunit/tests/_files/DataProviderTest.php | 21 + .../tests/_files/DependencyFailureTest.php | 22 + .../tests/_files/DependencySuccessTest.php | 21 + .../tests/_files/DependencyTestSuite.php | 13 + .../phpunit/tests/_files/DoubleTestCase.php | 25 + .../phpunit/tests/_files/DummyException.php | 5 + .../tests/_files/EmptyTestCaseTest.php | 4 + .../ExceptionInAssertPostConditionsTest.php | 35 + .../ExceptionInAssertPreConditionsTest.php | 35 + .../tests/_files/ExceptionInSetUpTest.php | 35 + .../tests/_files/ExceptionInTearDownTest.php | 35 + .../phpunit/tests/_files/ExceptionInTest.php | 35 + .../tests/_files/ExceptionNamespaceTest.php | 38 + .../tests/_files/ExceptionStackTest.php | 21 + .../phpunit/tests/_files/ExceptionTest.php | 139 + .../phpunit/phpunit/tests/_files/Failure.php | 8 + .../phpunit/tests/_files/FailureTest.php | 75 + .../phpunit/tests/_files/FatalTest.php | 13 + .../phpunit/tests/_files/IncompleteTest.php | 8 + .../tests/_files/Inheritance/InheritanceA.php | 7 + .../tests/_files/Inheritance/InheritanceB.php | 8 + .../tests/_files/InheritedTestCase.php | 7 + .../phpunit/phpunit/tests/_files/IniTest.php | 8 + .../phpunit/tests/_files/IsolationTest.php | 13 + .../tests/_files/JsonData/arrayObject.json | 1 + .../tests/_files/JsonData/simpleObject.json | 1 + .../phpunit/tests/_files/MockRunner.php | 7 + .../tests/_files/MultiDependencyTest.php | 23 + .../NamespaceCoverageClassExtendedTest.php | 12 + .../_files/NamespaceCoverageClassTest.php | 12 + ...NamespaceCoverageCoversClassPublicTest.php | 15 + .../NamespaceCoverageCoversClassTest.php | 20 + .../_files/NamespaceCoverageMethodTest.php | 12 + .../NamespaceCoverageNotPrivateTest.php | 12 + .../NamespaceCoverageNotProtectedTest.php | 12 + .../_files/NamespaceCoverageNotPublicTest.php | 12 + .../_files/NamespaceCoveragePrivateTest.php | 12 + .../_files/NamespaceCoverageProtectedTest.php | 12 + .../_files/NamespaceCoveragePublicTest.php | 12 + .../tests/_files/NamespaceCoveredClass.php | 38 + .../tests/_files/NamespaceCoveredFunction.php | 7 + .../tests/_files/NoArgTestCaseTest.php | 7 + .../phpunit/tests/_files/NoTestCaseClass.php | 4 + .../phpunit/tests/_files/NoTestCases.php | 7 + .../phpunit/tests/_files/NonStatic.php | 8 + .../_files/NotExistingCoveredElementTest.php | 24 + .../tests/_files/NotPublicTestCase.php | 11 + .../phpunit/tests/_files/NotVoidTestCase.php | 4 + .../phpunit/tests/_files/NothingTest.php | 7 + .../phpunit/tests/_files/OneTestCase.php | 11 + .../phpunit/tests/_files/OutputTestCase.php | 27 + .../phpunit/tests/_files/OverrideTestCase.php | 7 + .../RequirementsClassBeforeClassHookTest.php | 12 + .../_files/RequirementsClassDocBlockTest.php | 22 + .../phpunit/tests/_files/RequirementsTest.php | 148 + .../tests/_files/SampleArrayAccess.php | 36 + .../phpunit/tests/_files/SampleClass.php | 14 + .../phpunit/tests/_files/Singleton.php | 22 + .../phpunit/tests/_files/StackTest.php | 24 + .../phpunit/phpunit/tests/_files/Struct.php | 10 + .../phpunit/phpunit/tests/_files/Success.php | 7 + .../tests/_files/TemplateMethodsTest.php | 51 + .../phpunit/tests/_files/TestIncomplete.php | 8 + .../phpunit/tests/_files/TestIterator.php | 36 + .../phpunit/tests/_files/TestIterator2.php | 35 + .../phpunit/tests/_files/TestSkipped.php | 8 + .../phpunit/tests/_files/TestTestError.php | 8 + .../phpunit/tests/_files/TestWithTest.php | 24 + .../tests/_files/ThrowExceptionTestCase.php | 8 + .../tests/_files/ThrowNoExceptionTestCase.php | 7 + .../phpunit/phpunit/tests/_files/WasRun.php | 10 + vendor/phpunit/phpunit/tests/_files/bar.xml | 1 + .../_files/configuration.colors.empty.xml | 1 + .../_files/configuration.colors.false.xml | 1 + .../_files/configuration.colors.invalid.xml | 1 + .../_files/configuration.colors.true.xml | 1 + .../_files/configuration.custom-printer.xml | 2 + .../phpunit/tests/_files/configuration.xml | 123 + .../tests/_files/configuration_empty.xml | 57 + .../tests/_files/configuration_xinclude.xml | 75 + .../tests/_files/expectedFileFormat.txt | 1 + vendor/phpunit/phpunit/tests/_files/foo.xml | 1 + ...uctureAttributesAreSameButValuesAreNot.xml | 10 + .../tests/_files/structureExpected.xml | 10 + .../tests/_files/structureIgnoreTextNodes.xml | 13 + .../_files/structureIsSameButDataIsNot.xml | 10 + .../structureWrongNumberOfAttributes.xml | 10 + .../_files/structureWrongNumberOfNodes.xml | 9 + vendor/phpunit/phpunit/tests/bootstrap.php | 6 + vendor/sebastian/comparator/.gitignore | 6 + vendor/sebastian/comparator/.travis.yml | 25 + vendor/sebastian/comparator/LICENSE | 33 + vendor/sebastian/comparator/README.md | 41 + vendor/sebastian/comparator/build.xml | 34 + .../sebastian/comparator/build/travis-ci.xml | 11 + vendor/sebastian/comparator/composer.json | 44 + vendor/sebastian/comparator/phpunit.xml.dist | 21 + .../comparator/src/ArrayComparator.php | 136 + .../sebastian/comparator/src/Comparator.php | 68 + .../comparator/src/ComparisonFailure.php | 129 + .../comparator/src/DOMNodeComparator.php | 110 + .../comparator/src/DateTimeComparator.php | 80 + .../comparator/src/DoubleComparator.php | 60 + .../comparator/src/ExceptionComparator.php | 51 + vendor/sebastian/comparator/src/Factory.php | 107 + .../comparator/src/MockObjectComparator.php | 45 + .../comparator/src/NumericComparator.php | 72 + .../comparator/src/ObjectComparator.php | 109 + .../comparator/src/ResourceComparator.php | 56 + .../comparator/src/ScalarComparator.php | 94 + .../src/SplObjectStorageComparator.php | 73 + .../comparator/src/TypeComparator.php | 63 + .../comparator/tests/ArrayComparatorTest.php | 163 + .../tests/DOMNodeComparatorTest.php | 162 + .../tests/DateTimeComparatorTest.php | 216 + .../comparator/tests/DoubleComparatorTest.php | 134 + .../tests/ExceptionComparatorTest.php | 136 + .../comparator/tests/FactoryTest.php | 115 + .../tests/MockObjectComparatorTest.php | 166 + .../tests/NumericComparatorTest.php | 122 + .../comparator/tests/ObjectComparatorTest.php | 150 + .../tests/ResourceComparatorTest.php | 120 + .../comparator/tests/ScalarComparatorTest.php | 158 + .../tests/SplObjectStorageComparatorTest.php | 137 + .../comparator/tests/TypeComparatorTest.php | 104 + .../comparator/tests/_files/Author.php | 28 + .../comparator/tests/_files/Book.php | 21 + .../tests/_files/ClassWithToString.php | 19 + .../comparator/tests/_files/SampleClass.php | 29 + .../comparator/tests/_files/Struct.php | 25 + .../comparator/tests/_files/TestClass.php | 14 + .../tests/_files/TestClassComparator.php | 14 + .../sebastian/comparator/tests/autoload.php | 38 + .../sebastian/comparator/tests/bootstrap.php | 7 + vendor/sebastian/diff/.gitignore | 10 + vendor/sebastian/diff/.php_cs | 66 + vendor/sebastian/diff/.travis.yml | 16 + vendor/sebastian/diff/LICENSE | 33 + vendor/sebastian/diff/README.md | 126 + vendor/sebastian/diff/build.xml | 26 + vendor/sebastian/diff/composer.json | 33 + vendor/sebastian/diff/phpunit.xml.dist | 17 + vendor/sebastian/diff/src/Chunk.php | 104 + vendor/sebastian/diff/src/Diff.php | 75 + vendor/sebastian/diff/src/Differ.php | 261 ++ .../diff/src/LCS/LongestCommonSubsequence.php | 27 + ...LongestCommonSubsequenceImplementation.php | 93 + ...LongestCommonSubsequenceImplementation.php | 73 + vendor/sebastian/diff/src/Line.php | 56 + vendor/sebastian/diff/src/Parser.php | 99 + vendor/sebastian/diff/tests/DifferTest.php | Bin 0 -> 11492 bytes .../LCS/TimeEfficientImplementationTest.php | 175 + vendor/sebastian/diff/tests/ParserTest.php | 62 + .../sebastian/diff/tests/fixtures/patch.txt | 9 + .../sebastian/diff/tests/fixtures/patch2.txt | 21 + vendor/sebastian/environment/.gitignore | 5 + vendor/sebastian/environment/.travis.yml | 16 + vendor/sebastian/environment/LICENSE | 33 + vendor/sebastian/environment/README.md | 72 + vendor/sebastian/environment/build.xml | 26 + vendor/sebastian/environment/composer.json | 29 + vendor/sebastian/environment/phpunit.xml.dist | 20 + vendor/sebastian/environment/src/Console.php | 81 + vendor/sebastian/environment/src/Runtime.php | 192 + .../environment/tests/ConsoleTest.php | 60 + .../environment/tests/RuntimeTest.php | 112 + vendor/sebastian/exporter/.gitignore | 9 + vendor/sebastian/exporter/.travis.yml | 23 + vendor/sebastian/exporter/LICENSE | 33 + vendor/sebastian/exporter/README.md | 171 + vendor/sebastian/exporter/build.xml | 27 + vendor/sebastian/exporter/composer.json | 47 + vendor/sebastian/exporter/phpunit.xml.dist | 21 + vendor/sebastian/exporter/src/Exporter.php | 296 ++ .../sebastian/exporter/tests/ExporterTest.php | 333 ++ vendor/sebastian/global-state/.gitignore | 6 + vendor/sebastian/global-state/.travis.yml | 20 + vendor/sebastian/global-state/LICENSE | 33 + vendor/sebastian/global-state/README.md | 15 + vendor/sebastian/global-state/build.xml | 33 + vendor/sebastian/global-state/composer.json | 37 + .../sebastian/global-state/phpunit.xml.dist | 21 + .../sebastian/global-state/src/Blacklist.php | 149 + .../global-state/src/CodeExporter.php | 93 + .../sebastian/global-state/src/Exception.php | 17 + .../sebastian/global-state/src/Restorer.php | 141 + .../global-state/src/RuntimeException.php | 17 + .../sebastian/global-state/src/Snapshot.php | 423 ++ .../global-state/tests/BlacklistTest.php | 113 + .../global-state/tests/SnapshotTest.php | 119 + .../tests/_fixture/BlacklistedChildClass.php | 17 + .../tests/_fixture/BlacklistedClass.php | 18 + .../tests/_fixture/BlacklistedImplementor.php | 18 + .../tests/_fixture/BlacklistedInterface.php | 17 + .../tests/_fixture/SnapshotClass.php | 37 + .../tests/_fixture/SnapshotDomDocument.php | 19 + .../tests/_fixture/SnapshotFunctions.php | 15 + .../tests/_fixture/SnapshotTrait.php | 17 + vendor/sebastian/recursion-context/.gitignore | 9 + .../sebastian/recursion-context/.travis.yml | 21 + vendor/sebastian/recursion-context/LICENSE | 33 + vendor/sebastian/recursion-context/README.md | 13 + vendor/sebastian/recursion-context/build.xml | 27 + .../sebastian/recursion-context/composer.json | 36 + .../recursion-context/phpunit.xml.dist | 20 + .../recursion-context/src/Context.php | 153 + .../recursion-context/src/Exception.php | 17 + .../src/InvalidArgumentException.php | 17 + .../recursion-context/tests/ContextTest.php | 144 + vendor/sebastian/version/.gitattributes | 1 + vendor/sebastian/version/.gitignore | 1 + vendor/sebastian/version/LICENSE | 33 + vendor/sebastian/version/README.md | 37 + vendor/sebastian/version/composer.json | 21 + vendor/sebastian/version/src/Version.php | 82 + .../squizlabs/php_codesniffer/.gitattributes | 10 + vendor/squizlabs/php_codesniffer/.gitignore | 5 + .../squizlabs/php_codesniffer/CONTRIBUTING.md | 13 + .../php_codesniffer/CodeSniffer.conf.dist | 9 + .../squizlabs/php_codesniffer/CodeSniffer.php | 2516 ++++++++++ .../php_codesniffer/CodeSniffer/CLI.php | 1322 ++++++ .../CodeSniffer/DocGenerators/Generator.php | 184 + .../CodeSniffer/DocGenerators/HTML.php | 292 ++ .../CodeSniffer/DocGenerators/Markdown.php | 179 + .../CodeSniffer/DocGenerators/Text.php | 265 ++ .../php_codesniffer/CodeSniffer/Exception.php | 31 + .../php_codesniffer/CodeSniffer/File.php | 3660 +++++++++++++++ .../php_codesniffer/CodeSniffer/Fixer.php | 699 +++ .../php_codesniffer/CodeSniffer/Report.php | 83 + .../php_codesniffer/CodeSniffer/Reporting.php | 425 ++ .../CodeSniffer/Reports/Cbf.php | 151 + .../CodeSniffer/Reports/Checkstyle.php | 128 + .../CodeSniffer/Reports/Csv.php | 111 + .../CodeSniffer/Reports/Diff.php | 149 + .../CodeSniffer/Reports/Emacs.php | 110 + .../CodeSniffer/Reports/Full.php | 237 + .../CodeSniffer/Reports/Gitblame.php | 131 + .../CodeSniffer/Reports/Hgblame.php | 132 + .../CodeSniffer/Reports/Info.php | 162 + .../CodeSniffer/Reports/Json.php | 128 + .../CodeSniffer/Reports/Junit.php | 149 + .../CodeSniffer/Reports/Notifysend.php | 262 ++ .../CodeSniffer/Reports/Source.php | 334 ++ .../CodeSniffer/Reports/Summary.php | 189 + .../CodeSniffer/Reports/Svnblame.php | 98 + .../CodeSniffer/Reports/VersionControl.php | 296 ++ .../CodeSniffer/Reports/Xml.php | 132 + .../php_codesniffer/CodeSniffer/Sniff.php | 94 + .../Standards/AbstractPatternSniff.php | 962 ++++ .../Standards/AbstractScopeSniff.php | 199 + .../Standards/AbstractVariableSniff.php | 244 + .../Classes/DuplicateClassNameStandard.xml | 27 + .../CodeAnalysis/EmptyStatementStandard.xml | 23 + .../ForLoopShouldBeWhileLoopStandard.xml | 23 + .../ForLoopWithTestFunctionCallStandard.xml | 24 + .../JumbledIncrementerStandard.xml | 25 + .../UnconditionalIfStatementStandard.xml | 39 + .../UnnecessaryFinalModifierStandard.xml | 29 + .../UnusedFunctionParameterStandard.xml | 25 + .../UselessOverridingMethodStandard.xml | 32 + .../Generic/Docs/Commenting/FixmeStandard.xml | 25 + .../Generic/Docs/Commenting/TodoStandard.xml | 25 + .../InlineControlStructureStandard.xml | 22 + .../Generic/Docs/Debug/CSSLintStandard.xml | 19 + .../Docs/Debug/ClosureLinterStandard.xml | 19 + .../Generic/Docs/Debug/JSHintStandard.xml | 19 + .../Docs/Files/ByteOrderMarkStandard.xml | 7 + .../Docs/Files/EndFileNewlineStandard.xml | 7 + .../Docs/Files/EndFileNoNewlineStandard.xml | 7 + .../Generic/Docs/Files/InlineHTMLStandard.xml | 24 + .../Docs/Files/LineEndingsStandard.xml | 7 + .../Generic/Docs/Files/LineLengthStandard.xml | 7 + .../Docs/Files/LowercasedFilenameStandard.xml | 7 + .../Docs/Files/OneClassPerFileStandard.xml | 29 + .../Files/OneInterfacePerFileStandard.xml | 29 + .../DisallowMultipleStatementsStandard.xml | 20 + .../MultipleStatementAlignmentStandard.xml | 56 + .../Formatting/NoSpaceAfterCastStandard.xml | 19 + .../Formatting/SpaceAfterCastStandard.xml | 19 + .../CallTimePassByReferenceStandard.xml | 31 + .../FunctionCallArgumentSpacingStandard.xml | 39 + .../OpeningFunctionBraceBsdAllmanStandard.xml | 24 + ...gFunctionBraceKernighanRitchieStandard.xml | 24 + .../Metrics/CyclomaticComplexityStandard.xml | 7 + .../Docs/Metrics/NestingLevelStandard.xml | 7 + .../CamelCapsFunctionNameStandard.xml | 23 + .../ConstructorNameStandard.xml | 29 + .../UpperCaseConstantNameStandard.xml | 29 + .../CharacterBeforePHPOpeningTagStandard.xml | 22 + .../Docs/PHP/ClosingPHPTagStandard.xml | 22 + .../Docs/PHP/DeprecatedFunctionsStandard.xml | 19 + .../Docs/PHP/DisallowShortOpenTagStandard.xml | 7 + .../Docs/PHP/ForbiddenFunctionsStandard.xml | 19 + .../Docs/PHP/LowerCaseConstantStandard.xml | 23 + .../Docs/PHP/LowerCaseKeywordStandard.xml | 19 + .../Docs/PHP/NoSilencedErrorsStandard.xml | 23 + .../Generic/Docs/PHP/SAPIUsageStandard.xml | 23 + .../Docs/PHP/UpperCaseConstantStandard.xml | 23 + .../UnnecessaryStringConcatStandard.xml | 19 + .../SubversionPropertiesStandard.xml | 7 + .../DisallowSpaceIndentStandard.xml | 7 + .../WhiteSpace/DisallowTabIndentStandard.xml | 7 + .../Docs/WhiteSpace/ScopeIndentStandard.xml | 23 + .../Arrays/DisallowLongArraySyntaxSniff.php | 79 + .../Arrays/DisallowShortArraySyntaxSniff.php | 72 + .../Classes/DuplicateClassNameSniff.php | 127 + .../CodeAnalysis/EmptyStatementSniff.php | 106 + .../ForLoopShouldBeWhileLoopSniff.php | 102 + .../ForLoopWithTestFunctionCallSniff.php | 111 + .../CodeAnalysis/JumbledIncrementerSniff.php | 146 + .../UnconditionalIfStatementSniff.php | 104 + .../UnnecessaryFinalModifierSniff.php | 96 + .../UnusedFunctionParameterSniff.php | 184 + .../UselessOverridingMethodSniff.php | 178 + .../Sniffs/Commenting/DocCommentSniff.php | 350 ++ .../Generic/Sniffs/Commenting/FixmeSniff.php | 91 + .../Generic/Sniffs/Commenting/TodoSniff.php | 89 + .../InlineControlStructureSniff.php | 241 + .../Generic/Sniffs/Debug/CSSLintSniff.php | 107 + .../Sniffs/Debug/ClosureLinterSniff.php | 127 + .../Generic/Sniffs/Debug/JSHintSniff.php | 96 + .../Sniffs/Files/ByteOrderMarkSniff.php | 94 + .../Sniffs/Files/EndFileNewlineSniff.php | 94 + .../Sniffs/Files/EndFileNoNewlineSniff.php | 91 + .../Generic/Sniffs/Files/InlineHTMLSniff.php | 70 + .../Generic/Sniffs/Files/LineEndingsSniff.php | 145 + .../Generic/Sniffs/Files/LineLengthSniff.php | 153 + .../Sniffs/Files/LowercasedFilenameSniff.php | 78 + .../Sniffs/Files/OneClassPerFileSniff.php | 62 + .../Sniffs/Files/OneInterfacePerFileSniff.php | 62 + .../Sniffs/Files/OneTraitPerFileSniff.php | 62 + .../DisallowMultipleStatementsSniff.php | 99 + .../MultipleStatementAlignmentSniff.php | 326 ++ .../Formatting/NoSpaceAfterCastSniff.php | 72 + .../Sniffs/Formatting/SpaceAfterCastSniff.php | 83 + .../CallTimePassByReferenceSniff.php | 152 + .../FunctionCallArgumentSpacingSniff.php | 173 + .../OpeningFunctionBraceBsdAllmanSniff.php | 191 + ...ningFunctionBraceKernighanRitchieSniff.php | 162 + .../Metrics/CyclomaticComplexitySniff.php | 127 + .../Sniffs/Metrics/NestingLevelSniff.php | 112 + .../CamelCapsFunctionNameSniff.php | 221 + .../ConstructorNameSniff.php | 148 + .../UpperCaseConstantNameSniff.php | 180 + .../PHP/CharacterBeforePHPOpeningTagSniff.php | 74 + .../Generic/Sniffs/PHP/ClosingPHPTagSniff.php | 62 + .../Sniffs/PHP/DeprecatedFunctionsSniff.php | 95 + .../Sniffs/PHP/DisallowShortOpenTagSniff.php | 86 + .../Sniffs/PHP/ForbiddenFunctionsSniff.php | 240 + .../Sniffs/PHP/LowerCaseConstantSniff.php | 98 + .../Sniffs/PHP/LowerCaseKeywordSniff.php | 148 + .../Sniffs/PHP/NoSilencedErrorsSniff.php | 79 + .../Generic/Sniffs/PHP/SAPIUsageSniff.php | 79 + .../Generic/Sniffs/PHP/SyntaxSniff.php | 79 + .../Sniffs/PHP/UpperCaseConstantSniff.php | 88 + .../Strings/UnnecessaryStringConcatSniff.php | 138 + .../SubversionPropertiesSniff.php | 204 + .../WhiteSpace/DisallowSpaceIndentSniff.php | 140 + .../WhiteSpace/DisallowTabIndentSniff.php | 148 + .../Sniffs/WhiteSpace/ScopeIndentSniff.php | 1133 +++++ .../CodeSniffer/Standards/Generic/ruleset.xml | 4 + .../Standards/IncorrectPatternException.php | 33 + .../Sniffs/CSS/BrowserSpecificStylesSniff.php | 100 + .../Channels/DisallowSelfActionsSniff.php | 135 + .../Sniffs/Channels/IncludeOwnSystemSniff.php | 109 + .../Sniffs/Channels/IncludeSystemSniff.php | 335 ++ .../Sniffs/Channels/UnusedSystemSniff.php | 152 + .../Commenting/FunctionCommentSniff.php | 100 + .../MySource/Sniffs/Debug/DebugCodeSniff.php | 66 + .../Sniffs/Debug/FirebugConsoleSniff.php | 75 + .../Sniffs/Objects/AssignThisSniff.php | 92 + .../Objects/CreateWidgetTypeCallbackSniff.php | 227 + .../Sniffs/Objects/DisallowNewWidgetSniff.php | 70 + .../Sniffs/PHP/AjaxNullComparisonSniff.php | 109 + .../Sniffs/PHP/EvalObjectFactorySniff.php | 124 + .../Sniffs/PHP/GetRequestDataSniff.php | 117 + .../Sniffs/PHP/ReturnFunctionValueSniff.php | 74 + .../Sniffs/Strings/JoinStringsSniff.php | 86 + .../Standards/MySource/ruleset.xml | 18 + .../Docs/Classes/ClassDeclarationStandard.xml | 22 + .../Docs/Commenting/ClassCommentStandard.xml | 177 + .../Docs/Commenting/FileCommentStandard.xml | 286 ++ .../Commenting/FunctionCommentStandard.xml | 230 + .../Docs/Commenting/InlineCommentStandard.xml | 19 + .../ControlSignatureStandard.xml | 36 + .../MultiLineConditionStandard.xml | 60 + .../PEAR/Docs/Files/IncludingFileStandard.xml | 24 + .../PEAR/Docs/Files/LineLengthStandard.xml | 7 + .../MultiLineAssignmentStandard.xml | 35 + .../FunctionCallSignatureStandard.xml | 19 + .../Functions/FunctionDeclarationStandard.xml | 41 + .../Functions/ValidDefaultValueStandard.xml | 25 + .../ValidClassNameStandard.xml | 23 + .../ValidFunctionNameStandard.xml | 23 + .../ValidVariableNameStandard.xml | 29 + .../ObjectOperatorIndentStandard.xml | 39 + .../WhiteSpace/ScopeClosingBraceStandard.xml | 23 + .../Docs/WhiteSpace/ScopeIndentStandard.xml | 29 + .../Sniffs/Classes/ClassDeclarationSniff.php | 164 + .../Sniffs/Commenting/ClassCommentSniff.php | 137 + .../Sniffs/Commenting/FileCommentSniff.php | 552 +++ .../Commenting/FunctionCommentSniff.php | 389 ++ .../Sniffs/Commenting/InlineCommentSniff.php | 83 + .../ControlSignatureSniff.php | 65 + .../MultiLineConditionSniff.php | 274 ++ .../PEAR/Sniffs/Files/IncludingFileSniff.php | 150 + .../Formatting/MultiLineAssignmentSniff.php | 119 + .../Functions/FunctionCallSignatureSniff.php | 505 ++ .../Functions/FunctionDeclarationSniff.php | 409 ++ .../Functions/ValidDefaultValueSniff.php | 110 + .../NamingConventions/ValidClassNameSniff.php | 112 + .../ValidFunctionNameSniff.php | 298 ++ .../ValidVariableNameSniff.php | 121 + .../WhiteSpace/ObjectOperatorIndentSniff.php | 193 + .../WhiteSpace/ScopeClosingBraceSniff.php | 193 + .../Sniffs/WhiteSpace/ScopeIndentSniff.php | 46 + .../CodeSniffer/Standards/PEAR/ruleset.xml | 40 + .../CodeSniffer/Standards/PHPCS/ruleset.xml | 55 + .../Docs/Classes/ClassDeclarationStandard.xml | 48 + .../PSR1/Docs/Files/SideEffectsStandard.xml | 27 + .../Sniffs/Classes/ClassDeclarationSniff.php | 89 + .../PSR1/Sniffs/Files/SideEffectsSniff.php | 227 + .../Methods/CamelCapsMethodNameSniff.php | 93 + .../CodeSniffer/Standards/PSR1/ruleset.xml | 45 + .../Docs/Classes/ClassDeclarationStandard.xml | 23 + .../Classes/PropertyDeclarationStandard.xml | 62 + .../ControlStructureSpacingStandard.xml | 23 + .../ElseIfDeclarationStandard.xml | 27 + .../SwitchDeclarationStandard.xml | 104 + .../Docs/Files/EndFileNewlineStandard.xml | 7 + .../Methods/MethodDeclarationStandard.xml | 51 + .../NamespaceDeclarationStandard.xml | 22 + .../Namespaces/UseDeclarationStandard.xml | 57 + .../Sniffs/Classes/ClassDeclarationSniff.php | 453 ++ .../Classes/PropertyDeclarationSniff.php | 117 + .../ControlStructureSpacingSniff.php | 152 + .../ElseIfDeclarationSniff.php | 85 + .../SwitchDeclarationSniff.php | 248 + .../PSR2/Sniffs/Files/ClosingTagSniff.php | 100 + .../PSR2/Sniffs/Files/EndFileNewlineSniff.php | 111 + .../Methods/FunctionCallSignatureSniff.php | 89 + .../Sniffs/Methods/MethodDeclarationSniff.php | 155 + .../Namespaces/NamespaceDeclarationSniff.php | 105 + .../Sniffs/Namespaces/UseDeclarationSniff.php | 170 + .../CodeSniffer/Standards/PSR2/ruleset.xml | 187 + .../Arrays/ArrayBracketSpacingStandard.xml | 19 + .../Docs/Arrays/ArrayDeclarationStandard.xml | 117 + .../LowercaseClassKeywordsStandard.xml | 23 + .../Classes/SelfMemberReferenceStandard.xml | 63 + .../DocCommentAlignmentStandard.xml | 39 + .../FunctionCommentThrowTagStandard.xml | 32 + .../ForEachLoopDeclarationStandard.xml | 39 + .../ForLoopDeclarationStandard.xml | 55 + .../LowercaseDeclarationStandard.xml | 23 + .../FunctionDuplicateArgumentStandard.xml | 23 + .../LowercaseFunctionKeywordsStandard.xml | 25 + .../Docs/Scope/StaticThisUsageStandard.xml | 31 + .../Docs/Strings/EchoedStringsStandard.xml | 19 + .../Docs/WhiteSpace/CastSpacingStandard.xml | 19 + .../FunctionOpeningBraceStandard.xml | 41 + .../LanguageConstructSpacingStandard.xml | 19 + .../ObjectOperatorSpacingStandard.xml | 19 + .../ScopeKeywordSpacingStandard.xml | 23 + .../WhiteSpace/SemicolonSpacingStandard.xml | 19 + .../Arrays/ArrayBracketSpacingSniff.php | 115 + .../Sniffs/Arrays/ArrayDeclarationSniff.php | 888 ++++ .../ClassDefinitionClosingBraceSpaceSniff.php | 122 + .../CSS/ClassDefinitionNameSpacingSniff.php | 116 + .../ClassDefinitionOpeningBraceSpaceSniff.php | 140 + .../Squiz/Sniffs/CSS/ColonSpacingSniff.php | 118 + .../Sniffs/CSS/ColourDefinitionSniff.php | 101 + .../DisallowMultipleStyleDefinitionsSniff.php | 84 + .../CSS/DuplicateClassDefinitionSniff.php | 112 + .../CSS/DuplicateStyleDefinitionSniff.php | 96 + .../Sniffs/CSS/EmptyClassDefinitionSniff.php | 73 + .../Sniffs/CSS/EmptyStyleDefinitionSniff.php | 73 + .../Squiz/Sniffs/CSS/ForbiddenStylesSniff.php | 190 + .../Squiz/Sniffs/CSS/IndentationSniff.php | 151 + .../CSS/LowercaseStyleDefinitionSniff.php | 110 + .../Squiz/Sniffs/CSS/MissingColonSniff.php | 99 + .../Squiz/Sniffs/CSS/NamedColoursSniff.php | 107 + .../Squiz/Sniffs/CSS/OpacitySniff.php | 110 + .../Sniffs/CSS/SemicolonSpacingSniff.php | 84 + .../Squiz/Sniffs/CSS/ShorthandSizeSniff.php | 191 + .../Sniffs/Classes/ClassDeclarationSniff.php | 219 + .../Sniffs/Classes/ClassFileNameSniff.php | 84 + .../Sniffs/Classes/DuplicatePropertySniff.php | 95 + .../Classes/LowercaseClassKeywordsSniff.php | 87 + .../Classes/SelfMemberReferenceSniff.php | 188 + .../Sniffs/Classes/ValidClassNameSniff.php | 99 + .../Sniffs/Commenting/BlockCommentSniff.php | 315 ++ .../Sniffs/Commenting/ClassCommentSniff.php | 119 + .../ClosingDeclarationCommentSniff.php | 149 + .../Commenting/DocCommentAlignmentSniff.php | 166 + .../Commenting/EmptyCatchCommentSniff.php | 70 + .../Sniffs/Commenting/FileCommentSniff.php | 185 + .../Commenting/FunctionCommentSniff.php | 575 +++ .../FunctionCommentThrowTagSniff.php | 206 + .../Sniffs/Commenting/InlineCommentSniff.php | 322 ++ .../LongConditionClosingCommentSniff.php | 208 + .../Commenting/PostStatementCommentSniff.php | 103 + .../Commenting/VariableCommentSniff.php | 169 + .../ControlSignatureSniff.php | 262 ++ .../ElseIfDeclarationSniff.php | 67 + .../ForEachLoopDeclarationSniff.php | 252 + .../ForLoopDeclarationSniff.php | 232 + .../InlineIfDeclarationSniff.php | 128 + .../LowercaseDeclarationSniff.php | 88 + .../SwitchDeclarationSniff.php | 319 ++ .../Squiz/Sniffs/Debug/JSLintSniff.php | 94 + .../Sniffs/Debug/JavaScriptLintSniff.php | 98 + .../Squiz/Sniffs/Files/FileExtensionSniff.php | 83 + .../Formatting/OperatorBracketSniff.php | 358 ++ ...unctionDeclarationArgumentSpacingSniff.php | 404 ++ .../Functions/FunctionDeclarationSniff.php | 54 + .../FunctionDuplicateArgumentSniff.php | 79 + .../Sniffs/Functions/GlobalFunctionSniff.php | 76 + .../LowercaseFunctionKeywordsSniff.php | 79 + .../MultiLineFunctionDeclarationSniff.php | 153 + .../ValidFunctionNameSniff.php | 72 + .../ValidVariableNameSniff.php | 234 + .../DisallowObjectStringIndexSniff.php | 96 + .../Objects/ObjectInstantiationSniff.php | 81 + .../Sniffs/Objects/ObjectMemberCommaSniff.php | 76 + .../ComparisonOperatorUsageSniff.php | 237 + .../IncrementDecrementUsageSniff.php | 236 + .../Operators/ValidLogicalOperatorsSniff.php | 83 + .../Sniffs/PHP/CommentedOutCodeSniff.php | 237 + .../PHP/DisallowBooleanStatementSniff.php | 72 + .../PHP/DisallowComparisonAssignmentSniff.php | 125 + .../Sniffs/PHP/DisallowInlineIfSniff.php | 72 + .../PHP/DisallowMultipleAssignmentsSniff.php | 178 + .../Sniffs/PHP/DisallowObEndFlushSniff.php | 66 + .../PHP/DisallowSizeFunctionsInLoopsSniff.php | 127 + .../Sniffs/PHP/DiscouragedFunctionsSniff.php | 56 + .../Squiz/Sniffs/PHP/EmbeddedPhpSniff.php | 400 ++ .../Standards/Squiz/Sniffs/PHP/EvalSniff.php | 63 + .../Sniffs/PHP/ForbiddenFunctionsSniff.php | 54 + .../Squiz/Sniffs/PHP/GlobalKeywordSniff.php | 68 + .../Squiz/Sniffs/PHP/HeredocSniff.php | 66 + .../Squiz/Sniffs/PHP/InnerFunctionsSniff.php | 73 + .../Sniffs/PHP/LowercasePHPFunctionsSniff.php | 122 + .../Sniffs/PHP/NonExecutableCodeSniff.php | 270 ++ .../Sniffs/Scope/MemberVarScopeSniff.php | 101 + .../Squiz/Sniffs/Scope/MethodScopeSniff.php | 89 + .../Sniffs/Scope/StaticThisUsageSniff.php | 95 + .../Strings/ConcatenationSpacingSniff.php | 141 + .../Sniffs/Strings/DoubleQuoteUsageSniff.php | 151 + .../Sniffs/Strings/EchoedStringsSniff.php | 99 + .../Sniffs/WhiteSpace/CastSpacingSniff.php | 79 + .../ControlStructureSpacingSniff.php | 316 ++ .../FunctionClosingBraceSpaceSniff.php | 182 + .../FunctionOpeningBraceSpaceSniff.php | 113 + .../WhiteSpace/FunctionSpacingSniff.php | 239 + .../LanguageConstructSpacingSniff.php | 100 + .../LogicalOperatorSpacingSniff.php | 116 + .../WhiteSpace/MemberVarSpacingSniff.php | 161 + .../WhiteSpace/ObjectOperatorSpacingSniff.php | 100 + .../WhiteSpace/OperatorSpacingSniff.php | 324 ++ .../WhiteSpace/PropertyLabelSpacingSniff.php | 93 + .../WhiteSpace/ScopeClosingBraceSniff.php | 114 + .../WhiteSpace/ScopeKeywordSpacingSniff.php | 92 + .../WhiteSpace/SemicolonSpacingSniff.php | 101 + .../WhiteSpace/SuperfluousWhitespaceSniff.php | 265 ++ .../CodeSniffer/Standards/Squiz/ruleset.xml | 76 + .../Zend/Docs/Debug/CodeAnalyzerStandard.xml | 25 + .../Zend/Docs/Files/ClosingTagStandard.xml | 22 + .../ValidVariableNameStandard.xml | 37 + .../Zend/Sniffs/Debug/CodeAnalyzerSniff.php | 107 + .../Zend/Sniffs/Files/ClosingTagSniff.php | 83 + .../ValidVariableNameSniff.php | 245 + .../CodeSniffer/Standards/Zend/ruleset.xml | 32 + .../CodeSniffer/Tokenizers/CSS.php | 505 ++ .../CodeSniffer/Tokenizers/Comment.php | 284 ++ .../CodeSniffer/Tokenizers/JS.php | 1150 +++++ .../CodeSniffer/Tokenizers/PHP.php | 1504 ++++++ .../php_codesniffer/CodeSniffer/Tokens.php | 749 +++ vendor/squizlabs/php_codesniffer/README.md | 75 + .../squizlabs/php_codesniffer/composer.json | 66 + vendor/squizlabs/php_codesniffer/licence.txt | 24 + .../squizlabs/php_codesniffer/phpcs.xml.dist | 15 + .../php_codesniffer/phpunit.xml.dist | 8 + .../php_codesniffer/scripts/build-phar.php | 128 + .../squizlabs/php_codesniffer/scripts/phpcbf | 23 + .../php_codesniffer/scripts/phpcbf.bat | 19 + .../squizlabs/php_codesniffer/scripts/phpcs | 25 + .../scripts/phpcs-svn-pre-commit | 229 + .../php_codesniffer/scripts/phpcs.bat | 21 + vendor/symfony/console/.gitignore | 3 + vendor/symfony/console/Application.php | 1177 +++++ vendor/symfony/console/CHANGELOG.md | 62 + vendor/symfony/console/Command/Command.php | 697 +++ .../symfony/console/Command/HelpCommand.php | 93 + .../symfony/console/Command/ListCommand.php | 97 + vendor/symfony/console/ConsoleEvents.php | 61 + .../Descriptor/ApplicationDescription.php | 157 + .../symfony/console/Descriptor/Descriptor.php | 121 + .../Descriptor/DescriptorInterface.php | 31 + .../console/Descriptor/JsonDescriptor.php | 166 + .../console/Descriptor/MarkdownDescriptor.php | 143 + .../console/Descriptor/TextDescriptor.php | 282 ++ .../console/Descriptor/XmlDescriptor.php | 263 ++ .../console/Event/ConsoleCommandEvent.php | 62 + vendor/symfony/console/Event/ConsoleEvent.php | 67 + .../console/Event/ConsoleExceptionEvent.php | 67 + .../console/Event/ConsoleTerminateEvent.php | 58 + .../console/Formatter/OutputFormatter.php | 242 + .../Formatter/OutputFormatterInterface.php | 83 + .../Formatter/OutputFormatterStyle.php | 227 + .../OutputFormatterStyleInterface.php | 72 + .../Formatter/OutputFormatterStyleStack.php | 121 + .../console/Helper/DebugFormatterHelper.php | 127 + .../console/Helper/DescriptorHelper.php | 96 + .../symfony/console/Helper/DialogHelper.php | 483 ++ .../console/Helper/FormatterHelper.php | 82 + vendor/symfony/console/Helper/Helper.php | 121 + .../console/Helper/HelperInterface.php | 49 + vendor/symfony/console/Helper/HelperSet.php | 116 + .../console/Helper/InputAwareHelper.php | 33 + .../symfony/console/Helper/ProcessHelper.php | 142 + vendor/symfony/console/Helper/ProgressBar.php | 615 +++ .../symfony/console/Helper/ProgressHelper.php | 465 ++ .../symfony/console/Helper/QuestionHelper.php | 441 ++ .../console/Helper/SymfonyQuestionHelper.php | 106 + vendor/symfony/console/Helper/Table.php | 605 +++ vendor/symfony/console/Helper/TableCell.php | 77 + vendor/symfony/console/Helper/TableHelper.php | 268 ++ .../symfony/console/Helper/TableSeparator.php | 29 + vendor/symfony/console/Helper/TableStyle.php | 255 + vendor/symfony/console/Input/ArgvInput.php | 353 ++ vendor/symfony/console/Input/ArrayInput.php | 211 + vendor/symfony/console/Input/Input.php | 226 + .../symfony/console/Input/InputArgument.php | 132 + .../console/Input/InputAwareInterface.php | 28 + .../symfony/console/Input/InputDefinition.php | 485 ++ .../symfony/console/Input/InputInterface.php | 152 + vendor/symfony/console/Input/InputOption.php | 213 + vendor/symfony/console/Input/StringInput.php | 87 + vendor/symfony/console/LICENSE | 19 + .../symfony/console/Logger/ConsoleLogger.php | 118 + .../symfony/console/Output/BufferedOutput.php | 48 + .../symfony/console/Output/ConsoleOutput.php | 113 + .../console/Output/ConsoleOutputInterface.php | 35 + vendor/symfony/console/Output/NullOutput.php | 113 + vendor/symfony/console/Output/Output.php | 165 + .../console/Output/OutputInterface.php | 113 + .../symfony/console/Output/StreamOutput.php | 103 + .../console/Question/ChoiceQuestion.php | 174 + .../console/Question/ConfirmationQuestion.php | 61 + vendor/symfony/console/Question/Question.php | 247 + vendor/symfony/console/README.md | 67 + .../console/Resources/bin/hiddeninput.exe | Bin 0 -> 9216 bytes vendor/symfony/console/Shell.php | 228 + vendor/symfony/console/Style/OutputStyle.php | 116 + .../symfony/console/Style/StyleInterface.php | 159 + vendor/symfony/console/Style/SymfonyStyle.php | 323 ++ .../console/Tester/ApplicationTester.php | 128 + .../symfony/console/Tester/CommandTester.php | 132 + .../symfony/console/Tests/ApplicationTest.php | 1060 +++++ .../console/Tests/Command/CommandTest.php | 339 ++ .../console/Tests/Command/HelpCommandTest.php | 70 + .../console/Tests/Command/ListCommandTest.php | 64 + .../Descriptor/AbstractDescriptorTest.php | 105 + .../Tests/Descriptor/JsonDescriptorTest.php | 35 + .../Descriptor/MarkdownDescriptorTest.php | 27 + .../Tests/Descriptor/ObjectsProvider.php | 76 + .../Tests/Descriptor/TextDescriptorTest.php | 27 + .../Tests/Descriptor/XmlDescriptorTest.php | 27 + .../console/Tests/Fixtures/BarBucCommand.php | 11 + .../Tests/Fixtures/DescriptorApplication1.php | 18 + .../Tests/Fixtures/DescriptorApplication2.php | 24 + .../Tests/Fixtures/DescriptorCommand1.php | 27 + .../Tests/Fixtures/DescriptorCommand2.php | 32 + .../console/Tests/Fixtures/DummyOutput.php | 36 + .../console/Tests/Fixtures/Foo1Command.php | 26 + .../console/Tests/Fixtures/Foo2Command.php | 21 + .../console/Tests/Fixtures/Foo3Command.php | 29 + .../console/Tests/Fixtures/Foo4Command.php | 11 + .../console/Tests/Fixtures/Foo5Command.php | 10 + .../console/Tests/Fixtures/FooCommand.php | 33 + .../Fixtures/FooSubnamespaced1Command.php | 26 + .../Fixtures/FooSubnamespaced2Command.php | 26 + .../console/Tests/Fixtures/FoobarCommand.php | 25 + .../console/Tests/Fixtures/TestCommand.php | 28 + .../console/Tests/Fixtures/application_1.json | 1 + .../console/Tests/Fixtures/application_1.md | 201 + .../console/Tests/Fixtures/application_1.txt | 17 + .../console/Tests/Fixtures/application_1.xml | 110 + .../console/Tests/Fixtures/application_2.json | 1 + .../console/Tests/Fixtures/application_2.md | 396 ++ .../console/Tests/Fixtures/application_2.txt | 22 + .../console/Tests/Fixtures/application_2.xml | 190 + .../Tests/Fixtures/application_astext1.txt | 20 + .../Tests/Fixtures/application_astext2.txt | 16 + .../Tests/Fixtures/application_asxml1.txt | 146 + .../Tests/Fixtures/application_asxml2.txt | 37 + .../Tests/Fixtures/application_gethelp.txt | 1 + .../Fixtures/application_renderexception1.txt | 8 + .../Fixtures/application_renderexception2.txt | 11 + .../Fixtures/application_renderexception3.txt | 27 + .../application_renderexception3decorated.txt | 27 + .../Fixtures/application_renderexception4.txt | 9 + ...plication_renderexception_doublewidth1.txt | 11 + ..._renderexception_doublewidth1decorated.txt | 11 + ...plication_renderexception_doublewidth2.txt | 12 + .../Tests/Fixtures/application_run1.txt | 17 + .../Tests/Fixtures/application_run2.txt | 29 + .../Tests/Fixtures/application_run3.txt | 27 + .../Tests/Fixtures/application_run4.txt | 1 + .../console/Tests/Fixtures/command_1.json | 1 + .../console/Tests/Fixtures/command_1.md | 11 + .../console/Tests/Fixtures/command_1.txt | 7 + .../console/Tests/Fixtures/command_1.xml | 12 + .../console/Tests/Fixtures/command_2.json | 1 + .../console/Tests/Fixtures/command_2.md | 33 + .../console/Tests/Fixtures/command_2.txt | 13 + .../console/Tests/Fixtures/command_2.xml | 21 + .../console/Tests/Fixtures/command_astext.txt | 18 + .../console/Tests/Fixtures/command_asxml.txt | 38 + .../Tests/Fixtures/definition_astext.txt | 11 + .../Tests/Fixtures/definition_asxml.txt | 39 + .../Tests/Fixtures/input_argument_1.json | 1 + .../Tests/Fixtures/input_argument_1.md | 7 + .../Tests/Fixtures/input_argument_1.txt | 1 + .../Tests/Fixtures/input_argument_1.xml | 5 + .../Tests/Fixtures/input_argument_2.json | 1 + .../Tests/Fixtures/input_argument_2.md | 7 + .../Tests/Fixtures/input_argument_2.txt | 1 + .../Tests/Fixtures/input_argument_2.xml | 5 + .../Tests/Fixtures/input_argument_3.json | 1 + .../Tests/Fixtures/input_argument_3.md | 7 + .../Tests/Fixtures/input_argument_3.txt | 1 + .../Tests/Fixtures/input_argument_3.xml | 7 + .../Tests/Fixtures/input_argument_4.json | 1 + .../Tests/Fixtures/input_argument_4.md | 8 + .../Tests/Fixtures/input_argument_4.txt | 2 + .../Tests/Fixtures/input_argument_4.xml | 6 + .../Tests/Fixtures/input_definition_1.json | 1 + .../Tests/Fixtures/input_definition_1.md | 0 .../Tests/Fixtures/input_definition_1.txt | 0 .../Tests/Fixtures/input_definition_1.xml | 5 + .../Tests/Fixtures/input_definition_2.json | 1 + .../Tests/Fixtures/input_definition_2.md | 9 + .../Tests/Fixtures/input_definition_2.txt | 2 + .../Tests/Fixtures/input_definition_2.xml | 10 + .../Tests/Fixtures/input_definition_3.json | 1 + .../Tests/Fixtures/input_definition_3.md | 11 + .../Tests/Fixtures/input_definition_3.txt | 2 + .../Tests/Fixtures/input_definition_3.xml | 9 + .../Tests/Fixtures/input_definition_4.json | 1 + .../Tests/Fixtures/input_definition_4.md | 21 + .../Tests/Fixtures/input_definition_4.txt | 5 + .../Tests/Fixtures/input_definition_4.xml | 14 + .../Tests/Fixtures/input_option_1.json | 1 + .../console/Tests/Fixtures/input_option_1.md | 9 + .../console/Tests/Fixtures/input_option_1.txt | 1 + .../console/Tests/Fixtures/input_option_1.xml | 4 + .../Tests/Fixtures/input_option_2.json | 1 + .../console/Tests/Fixtures/input_option_2.md | 9 + .../console/Tests/Fixtures/input_option_2.txt | 1 + .../console/Tests/Fixtures/input_option_2.xml | 7 + .../Tests/Fixtures/input_option_3.json | 1 + .../console/Tests/Fixtures/input_option_3.md | 9 + .../console/Tests/Fixtures/input_option_3.txt | 1 + .../console/Tests/Fixtures/input_option_3.xml | 5 + .../Tests/Fixtures/input_option_4.json | 1 + .../console/Tests/Fixtures/input_option_4.md | 9 + .../console/Tests/Fixtures/input_option_4.txt | 1 + .../console/Tests/Fixtures/input_option_4.xml | 5 + .../Tests/Fixtures/input_option_5.json | 1 + .../console/Tests/Fixtures/input_option_5.md | 10 + .../console/Tests/Fixtures/input_option_5.txt | 2 + .../console/Tests/Fixtures/input_option_5.xml | 6 + .../OutputFormatterStyleStackTest.php | 70 + .../Formatter/OutputFormatterStyleTest.php | 93 + .../Tests/Formatter/OutputFormatterTest.php | 273 ++ .../Tests/Helper/FormatterHelperTest.php | 99 + .../console/Tests/Helper/HelperSetTest.php | 153 + .../Tests/Helper/LegacyDialogHelperTest.php | 200 + .../Tests/Helper/LegacyProgressHelperTest.php | 232 + .../Tests/Helper/LegacyTableHelperTest.php | 325 ++ .../Tests/Helper/ProcessHelperTest.php | 118 + .../console/Tests/Helper/ProgressBarTest.php | 598 +++ .../Tests/Helper/QuestionHelperTest.php | 376 ++ .../console/Tests/Helper/TableStyleTest.php | 27 + .../console/Tests/Helper/TableTest.php | 566 +++ .../console/Tests/Input/ArgvInputTest.php | 317 ++ .../console/Tests/Input/ArrayInputTest.php | 138 + .../console/Tests/Input/InputArgumentTest.php | 111 + .../Tests/Input/InputDefinitionTest.php | 441 ++ .../console/Tests/Input/InputOptionTest.php | 204 + .../symfony/console/Tests/Input/InputTest.php | 121 + .../console/Tests/Input/StringInputTest.php | 101 + .../Tests/Logger/ConsoleLoggerTest.php | 58 + .../Tests/Output/ConsoleOutputTest.php | 25 + .../console/Tests/Output/NullOutputTest.php | 39 + .../console/Tests/Output/OutputTest.php | 156 + .../console/Tests/Output/StreamOutputTest.php | 60 + .../Tests/Tester/ApplicationTesterTest.php | 69 + .../Tests/Tester/CommandTesterTest.php | 84 + vendor/symfony/console/composer.json | 41 + vendor/symfony/console/phpunit.xml.dist | 29 + vendor/symfony/yaml/.gitignore | 3 + vendor/symfony/yaml/CHANGELOG.md | 8 + vendor/symfony/yaml/Dumper.php | 73 + vendor/symfony/yaml/Escaper.php | 97 + .../symfony/yaml/Exception/DumpException.php | 23 + .../yaml/Exception/ExceptionInterface.php | 23 + .../symfony/yaml/Exception/ParseException.php | 148 + .../yaml/Exception/RuntimeException.php | 23 + vendor/symfony/yaml/Inline.php | 546 +++ vendor/symfony/yaml/LICENSE | 19 + vendor/symfony/yaml/Parser.php | 697 +++ vendor/symfony/yaml/README.md | 21 + vendor/symfony/yaml/Tests/DumperTest.php | 236 + .../yaml/Tests/Fixtures/YtsAnchorAlias.yml | 31 + .../yaml/Tests/Fixtures/YtsBasicTests.yml | 202 + .../yaml/Tests/Fixtures/YtsBlockMapping.yml | 51 + .../Tests/Fixtures/YtsDocumentSeparator.yml | 85 + .../yaml/Tests/Fixtures/YtsErrorTests.yml | 25 + .../Tests/Fixtures/YtsFlowCollections.yml | 60 + .../yaml/Tests/Fixtures/YtsFoldedScalars.yml | 176 + .../Tests/Fixtures/YtsNullsAndEmpties.yml | 45 + .../Fixtures/YtsSpecificationExamples.yml | 1697 +++++++ .../yaml/Tests/Fixtures/YtsTypeTransfers.yml | 244 + .../yaml/Tests/Fixtures/embededPhp.yml | 1 + .../yaml/Tests/Fixtures/escapedCharacters.yml | 147 + vendor/symfony/yaml/Tests/Fixtures/index.yml | 18 + .../yaml/Tests/Fixtures/sfComments.yml | 73 + .../symfony/yaml/Tests/Fixtures/sfCompact.yml | 159 + .../yaml/Tests/Fixtures/sfMergeKey.yml | 45 + .../symfony/yaml/Tests/Fixtures/sfObjects.yml | 11 + .../symfony/yaml/Tests/Fixtures/sfQuotes.yml | 33 + .../symfony/yaml/Tests/Fixtures/sfTests.yml | 135 + .../Tests/Fixtures/unindentedCollections.yml | 82 + vendor/symfony/yaml/Tests/InlineTest.php | 380 ++ .../symfony/yaml/Tests/ParseExceptionTest.php | 41 + vendor/symfony/yaml/Tests/ParserTest.php | 740 +++ vendor/symfony/yaml/Tests/YamlTest.php | 39 + vendor/symfony/yaml/Unescaper.php | 146 + vendor/symfony/yaml/Yaml.php | 105 + vendor/symfony/yaml/composer.json | 33 + vendor/symfony/yaml/phpunit.xml.dist | 28 + 2018 files changed, 213248 insertions(+), 68 deletions(-) create mode 100644 composer.lock create mode 120000 root/app/code/community/Hackathon/PSR0Autoloader create mode 120000 root/app/etc/modules/Hackathon_PSR0Autoloader.xml create mode 120000 root/shell/autoloader_initializer.php create mode 100644 src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/AbstractMagentoPatchFactory.php create mode 100644 src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatch1_9_2_2.php create mode 100644 src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatch1_9_2_3.php create mode 100644 src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatchFactory.php create mode 100644 src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/Observer.php create mode 100644 src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/PatchInterface.php rename src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/{ => Magento/1_9_2_2}/observerstimes_dispatchEvent (100%) rename src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/{ => Magento/1_9_2_2}/observerstimes_mageRun (100%) rename src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/{ => Magento/1_9_2_2}/observerstimes_mageRunEnd (100%) rename src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/{ => Magento/1_9_2_2}/observerstimes_observer (100%) create mode 100644 vendor/autoload.php create mode 120000 vendor/bin/magento-composer-installer.php create mode 120000 vendor/bin/phpcbf create mode 120000 vendor/bin/phpcs create mode 120000 vendor/bin/phpunit create mode 120000 vendor/bin/validate-json create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/doctrine/instantiator/.gitignore create mode 100644 vendor/doctrine/instantiator/.scrutinizer.yml create mode 100755 vendor/doctrine/instantiator/.travis.install.sh create mode 100644 vendor/doctrine/instantiator/.travis.yml create mode 100644 vendor/doctrine/instantiator/CONTRIBUTING.md create mode 100644 vendor/doctrine/instantiator/LICENSE create mode 100644 vendor/doctrine/instantiator/README.md create mode 100644 vendor/doctrine/instantiator/composer.json create mode 100644 vendor/doctrine/instantiator/phpmd.xml.dist create mode 100644 vendor/doctrine/instantiator/phpunit.xml.dist create mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php create mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php create mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php create mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php create mode 100644 vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php create mode 100644 vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php create mode 100644 vendor/eloquent/composer-config-reader/CHANGELOG.md create mode 100644 vendor/eloquent/composer-config-reader/CONTRIBUTING.md create mode 100644 vendor/eloquent/composer-config-reader/LICENSE create mode 100644 vendor/eloquent/composer-config-reader/README.md create mode 100644 vendor/eloquent/composer-config-reader/composer.json create mode 100644 vendor/eloquent/composer-config-reader/composer.lock create mode 100644 vendor/eloquent/composer-config-reader/etc/composer-schema.json create mode 100644 vendor/eloquent/composer-config-reader/src/ConfigurationReader.php create mode 100644 vendor/eloquent/composer-config-reader/src/ConfigurationValidator.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/AbstractRepository.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/ArchiveConfiguration.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/Author.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/Configuration.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/InstallationMethod.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/PackageRepository.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/ProjectConfiguration.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/Repository.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/RepositoryInterface.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/ScriptConfiguration.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/Stability.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/SupportInformation.php create mode 100644 vendor/eloquent/composer-config-reader/src/Element/VcsChangePolicy.php create mode 100644 vendor/eloquent/composer-config-reader/src/Exception/ConfigurationExceptionInterface.php create mode 100644 vendor/eloquent/composer-config-reader/src/Exception/ConfigurationReadException.php create mode 100644 vendor/eloquent/composer-config-reader/src/Exception/InvalidConfigurationException.php create mode 100644 vendor/eloquent/composer-config-reader/src/Exception/InvalidJsonException.php create mode 100644 vendor/eloquent/composer-config-reader/src/Exception/UndefinedPropertyException.php create mode 100644 vendor/eloquent/composer-config-reader/src/ObjectAccess.php create mode 100644 vendor/eloquent/enumeration/.php_cs create mode 100644 vendor/eloquent/enumeration/.sami create mode 100644 vendor/eloquent/enumeration/CHANGELOG.md create mode 100644 vendor/eloquent/enumeration/CONTRIBUTING.md create mode 100644 vendor/eloquent/enumeration/LICENSE create mode 100644 vendor/eloquent/enumeration/README.md create mode 100644 vendor/eloquent/enumeration/composer.json create mode 100644 vendor/eloquent/enumeration/composer.lock create mode 100644 vendor/eloquent/enumeration/src/AbstractEnumeration.php create mode 100644 vendor/eloquent/enumeration/src/AbstractMultiton.php create mode 100644 vendor/eloquent/enumeration/src/AbstractValueMultiton.php create mode 100644 vendor/eloquent/enumeration/src/EnumerationInterface.php create mode 100644 vendor/eloquent/enumeration/src/Exception/AbstractUndefinedMemberException.php create mode 100644 vendor/eloquent/enumeration/src/Exception/ExtendsConcreteException.php create mode 100644 vendor/eloquent/enumeration/src/Exception/UndefinedMemberException.php create mode 100644 vendor/eloquent/enumeration/src/Exception/UndefinedMemberExceptionInterface.php create mode 100644 vendor/eloquent/enumeration/src/MultitonInterface.php create mode 100644 vendor/eloquent/enumeration/src/ValueMultitonInterface.php create mode 100644 vendor/eloquent/liberator/CHANGELOG.md create mode 100644 vendor/eloquent/liberator/CONTRIBUTING.md create mode 100644 vendor/eloquent/liberator/LICENSE create mode 100644 vendor/eloquent/liberator/README.md create mode 100644 vendor/eloquent/liberator/composer.json create mode 100644 vendor/eloquent/liberator/composer.lock create mode 100644 vendor/eloquent/liberator/src/Eloquent/Liberator/Liberator.php create mode 100644 vendor/eloquent/liberator/src/Eloquent/Liberator/LiberatorArray.php create mode 100644 vendor/eloquent/liberator/src/Eloquent/Liberator/LiberatorClass.php create mode 100644 vendor/eloquent/liberator/src/Eloquent/Liberator/LiberatorObject.php create mode 100644 vendor/eloquent/liberator/src/Eloquent/Liberator/LiberatorProxy.php create mode 100644 vendor/eloquent/pops/CHANGELOG.md create mode 100644 vendor/eloquent/pops/CONTRIBUTING.md create mode 100644 vendor/eloquent/pops/LICENSE create mode 100644 vendor/eloquent/pops/README.md create mode 100644 vendor/eloquent/pops/composer.json create mode 100644 vendor/eloquent/pops/composer.lock create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/Pops.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/Proxy.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/ProxyArray.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/ProxyClass.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/ProxyObject.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/ProxyPrimitive.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/Safe/Safe.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/Safe/SafeProxy.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/Safe/SafeProxyArray.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/Safe/SafeProxyClass.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/Safe/SafeProxyObject.php create mode 100644 vendor/eloquent/pops/src/Eloquent/Pops/Safe/SafeProxyPrimitive.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/.gitignore create mode 100644 vendor/escapestudios/symfony2-coding-standard/.travis.yml create mode 100644 vendor/escapestudios/symfony2-coding-standard/CONTRIBUTING.md create mode 100644 vendor/escapestudios/symfony2-coding-standard/README.md create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Arrays/MultiLineArrayCommaSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Classes/MultipleClassesOneFileSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Classes/PropertyDeclarationSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Commenting/ClassCommentSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Commenting/FunctionCommentSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Formatting/BlankLineBeforeReturnSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Functions/ScopeOrderSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/NamingConventions/ValidClassNameSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Objects/ObjectInstantiationSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Scope/MethodScopeSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/AssignmentSpacingSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/BinaryOperatorSpacingSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/CommaSpacingSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/DiscourageFitzinatorSniff.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Arrays/MultiLineArrayCommaUnitTest.inc create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Arrays/MultiLineArrayCommaUnitTest.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Commenting/FunctionCommentUnitTest.inc create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Commenting/FunctionCommentUnitTest.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Formatting/BlankLineBeforeReturnUnitTest.inc create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Formatting/BlankLineBeforeReturnUnitTest.php create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Objects/ObjectInstantiationUnitTest.inc create mode 100644 vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Objects/ObjectInstantiationUnitTest.php create mode 100755 vendor/escapestudios/symfony2-coding-standard/Symfony2/ruleset.xml create mode 100644 vendor/escapestudios/symfony2-coding-standard/TESTING.md create mode 100644 vendor/escapestudios/symfony2-coding-standard/build.properties create mode 100644 vendor/escapestudios/symfony2-coding-standard/build.xml create mode 100644 vendor/escapestudios/symfony2-coding-standard/composer.json create mode 160000 vendor/firegento/psr0autoloader create mode 100644 vendor/icecave/isolator/CHANGELOG.md create mode 100644 vendor/icecave/isolator/CONTRIBUTING.md create mode 100644 vendor/icecave/isolator/LICENSE.md create mode 100644 vendor/icecave/isolator/README.md create mode 100644 vendor/icecave/isolator/composer.json create mode 100644 vendor/icecave/isolator/composer.lock create mode 100644 vendor/icecave/isolator/src/Generator.php create mode 100644 vendor/icecave/isolator/src/Isolator.php create mode 100644 vendor/icecave/isolator/src/IsolatorTrait.php create mode 100644 vendor/icecave/isolator/src/PackageInfo.php create mode 100644 vendor/installed.json create mode 100644 vendor/justinrainbow/json-schema/.gitattributes create mode 100644 vendor/justinrainbow/json-schema/LICENSE create mode 100644 vendor/justinrainbow/json-schema/README.md create mode 100755 vendor/justinrainbow/json-schema/bin/validate-json create mode 100644 vendor/justinrainbow/json-schema/composer.json create mode 100644 vendor/justinrainbow/json-schema/phpunit.xml.dist create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSchemaMediaTypeException.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidSourceUriException.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Exception/JsonDecodingException.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Exception/ResourceNotFoundException.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Exception/UriResolverException.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/RefResolver.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php create mode 100644 vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/.travis.yml create mode 100644 vendor/magento-hackathon/magento-composer-installer/CHANGELOG.md create mode 100644 vendor/magento-hackathon/magento-composer-installer/CONTRIBUTING.md create mode 100644 vendor/magento-hackathon/magento-composer-installer/README.md create mode 100644 vendor/magento-hackathon/magento-composer-installer/appveyor.yml create mode 100755 vendor/magento-hackathon/magento-composer-installer/bin/magento-composer-installer.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/composer.json create mode 100644 vendor/magento-hackathon/magento-composer-installer/res/target.xml create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Helper.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploy/Manager/Entry.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/DeployManager.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/Copy.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/DeploystrategyAbstract.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/Link.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/None.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/Symlink.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/EventManager.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackageDeployEvent.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackagePreInstallEvent.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackageUnInstallEvent.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/DeploystrategyFactory.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/EntryFactory.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/InstallStrategyFactory.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/ParserFactory.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/ParserFactoryInterface.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/PathTranslationParserFactory.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/GitIgnore.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/GitIgnoreListener.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/InstalledPackage.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/InstalledPackageDumper.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/ModuleManager.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/MapParser.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/ModmanParser.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/PackageXmlParser.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/Parser.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/PathTranslationParser.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Patcher/Bootstrap.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Plugin.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/ProjectConfig.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Repository/InstalledPackageFileSystemRepository.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Repository/InstalledPackageRepositoryInterface.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/UnInstallStrategy/UnInstallStrategy.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/UnInstallStrategy/UnInstallStrategyInterface.php create mode 100644 vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Util/FileSystem.php create mode 100644 vendor/mothership/component_base/LICENSE create mode 100644 vendor/mothership/component_base/README.md create mode 100644 vendor/mothership/component_base/composer.json create mode 100644 vendor/mothership/component_base/src-tests/Tests/BaseTestCase.php create mode 100644 vendor/mothership/component_base/src-tests/Tests/DatabaseTestCase.php create mode 100644 vendor/mothership/component_base/src-tests/Tests/README.md create mode 100644 vendor/mothership/component_base/src-tests/Tests/exemple.yaml create mode 100644 vendor/mothership/component_base/src-tests/Tests/phpunit.xml create mode 100644 vendor/mothership/component_base/src/Mothership/Exception/ExceptionAbstract.php create mode 100644 vendor/mothership/component_base/src/Mothership/Tests/TraitBase.php create mode 100644 vendor/mothership/state_machine/.gitignore create mode 100644 vendor/mothership/state_machine/.travis.yml create mode 100644 vendor/mothership/state_machine/LICENSE create mode 100755 vendor/mothership/state_machine/README.md create mode 100755 vendor/mothership/state_machine/composer.json create mode 100644 vendor/mothership/state_machine/phpunit.composer.xml create mode 100755 vendor/mothership/state_machine/src/CollectionWorkflowAbstract.php create mode 100755 vendor/mothership/state_machine/src/Examples/Advanced/AdvancedStateMachine.php create mode 100755 vendor/mothership/state_machine/src/Examples/Advanced/AdvancedWorkflow.php create mode 100755 vendor/mothership/state_machine/src/Examples/Advanced/Workflow.yml create mode 100644 vendor/mothership/state_machine/src/Examples/Advanced/workflow.png create mode 100755 vendor/mothership/state_machine/src/Examples/BooleanConditions/BooleanConditionsStateMachine.php create mode 100755 vendor/mothership/state_machine/src/Examples/BooleanConditions/BooleanConditionsWorkflow.php create mode 100755 vendor/mothership/state_machine/src/Examples/BooleanConditions/Workflow.yml create mode 100755 vendor/mothership/state_machine/src/Examples/BooleanConditions/workflow.png create mode 100755 vendor/mothership/state_machine/src/Examples/Fail/FailStateMachine.php create mode 100755 vendor/mothership/state_machine/src/Examples/Fail/FailWorkflow.php create mode 100755 vendor/mothership/state_machine/src/Examples/Fail/Workflow.yml create mode 100755 vendor/mothership/state_machine/src/Examples/IfConditions/IfConditionsStateMachine.php create mode 100755 vendor/mothership/state_machine/src/Examples/IfConditions/IfConditionsWorkflow.php create mode 100755 vendor/mothership/state_machine/src/Examples/IfConditions/Workflow.yml create mode 100755 vendor/mothership/state_machine/src/Examples/IfConditions/workflow.png create mode 100755 vendor/mothership/state_machine/src/Examples/Simple/SimpleStateMachine.php create mode 100755 vendor/mothership/state_machine/src/Examples/Simple/SimpleWorkflow.php create mode 100755 vendor/mothership/state_machine/src/Examples/Simple/Workflow.yml create mode 100755 vendor/mothership/state_machine/src/Examples/Simple/workflow.png create mode 100755 vendor/mothership/state_machine/src/Exception/StateMachineException.php create mode 100755 vendor/mothership/state_machine/src/Exception/StatusException.php create mode 100755 vendor/mothership/state_machine/src/Exception/TransitionException.php create mode 100755 vendor/mothership/state_machine/src/Exception/WorkflowException.php create mode 100644 vendor/mothership/state_machine/src/StateMachine.php create mode 100755 vendor/mothership/state_machine/src/StateMachineAbstract.php create mode 100755 vendor/mothership/state_machine/src/StateMachineInterface.php create mode 100755 vendor/mothership/state_machine/src/Status.php create mode 100755 vendor/mothership/state_machine/src/StatusInterface.php create mode 100755 vendor/mothership/state_machine/src/Tests/StateMachineTest.php create mode 100755 vendor/mothership/state_machine/src/Tests/StateMachineTestCase.php create mode 100755 vendor/mothership/state_machine/src/Tests/WorkflowTest.php create mode 100755 vendor/mothership/state_machine/src/Transition.php create mode 100755 vendor/mothership/state_machine/src/TransitionInterface.php create mode 100755 vendor/mothership/state_machine/src/WorkflowAbstract.php create mode 100755 vendor/mothership/state_machine/src/WorkflowInterface.php create mode 100644 vendor/phpdocumentor/reflection-docblock/.gitignore create mode 100644 vendor/phpdocumentor/reflection-docblock/.travis.yml create mode 100644 vendor/phpdocumentor/reflection-docblock/LICENSE create mode 100644 vendor/phpdocumentor/reflection-docblock/README.md create mode 100644 vendor/phpdocumentor/reflection-docblock/composer.json create mode 100644 vendor/phpdocumentor/reflection-docblock/composer.lock create mode 100644 vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php create mode 100644 vendor/phpspec/prophecy/.gitignore create mode 100644 vendor/phpspec/prophecy/.travis.yml create mode 100644 vendor/phpspec/prophecy/CHANGES.md create mode 100644 vendor/phpspec/prophecy/CONTRIBUTING.md create mode 100644 vendor/phpspec/prophecy/LICENSE create mode 100644 vendor/phpspec/prophecy/README.md create mode 100644 vendor/phpspec/prophecy/composer.json create mode 100644 vendor/phpspec/prophecy/composer.lock create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php create mode 100644 vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Call/Call.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Prophet.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php create mode 100644 vendor/phpunit/php-code-coverage/.gitattributes create mode 100644 vendor/phpunit/php-code-coverage/.gitignore create mode 100644 vendor/phpunit/php-code-coverage/.travis.yml create mode 100644 vendor/phpunit/php-code-coverage/CONTRIBUTING.md create mode 100644 vendor/phpunit/php-code-coverage/ChangeLog-2.2.md create mode 100644 vendor/phpunit/php-code-coverage/LICENSE create mode 100644 vendor/phpunit/php-code-coverage/README.md create mode 100644 vendor/phpunit/php-code-coverage/build.xml create mode 100644 vendor/phpunit/php-code-coverage/build/travis-ci.xml create mode 100644 vendor/phpunit/php-code-coverage/composer.json create mode 100644 vendor/phpunit/php-code-coverage/phpunit.xml.dist create mode 100644 vendor/phpunit/php-code-coverage/scripts/auto_append.php create mode 100644 vendor/phpunit/php-code-coverage/scripts/auto_prepend.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/HHVM.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/Xdebug.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Exception.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Filter.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Clover.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Crap4j.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Directory.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/File.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/nv.d3.min.css create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/style.css create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/directory.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/file.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.eot create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.svg create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.ttf create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/d3.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/holder.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/html5shiv.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/nv.d3.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/respond.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/method_item.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Node.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Directory.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/File.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Iterator.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/PHP.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Text.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Directory.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Coverage.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Method.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Report.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Unit.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Node.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Project.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Tests.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Totals.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Util.php create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage/Util/InvalidArgumentHelper.php create mode 100644 vendor/phpunit/php-code-coverage/tests/PHP/CodeCoverage/FilterTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/PHP/CodeCoverage/Report/CloverTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/PHP/CodeCoverage/Report/FactoryTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/PHP/CodeCoverage/UtilTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/PHP/CodeCoverageTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/TestCase.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/BankAccount-clover.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/BankAccount.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/BankAccountTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageClassExtendedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageClassTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesWhitespaceTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodOneLineAnnotationTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesWhitespaceTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageNoneTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPrivateTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageNotProtectedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPublicTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageNothingTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoveragePrivateTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageProtectedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoveragePublicTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoverageTwoDefaultClassAnnotations.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoveredClass.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/CoveredFunction.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassExtendedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassPublicTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageMethodTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPrivateTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotProtectedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPublicTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePrivateTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageProtectedTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePublicTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveredClass.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/NotExistingCoveredElementTest.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_with_class_and_anonymous_function.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_with_ignore.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_with_namespace.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_with_oneline_annotations.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_without_ignore.php create mode 100644 vendor/phpunit/php-code-coverage/tests/_files/source_without_namespace.php create mode 100644 vendor/phpunit/php-file-iterator/.gitattributes create mode 100644 vendor/phpunit/php-file-iterator/.gitignore create mode 100644 vendor/phpunit/php-file-iterator/ChangeLog.md create mode 100644 vendor/phpunit/php-file-iterator/LICENSE create mode 100644 vendor/phpunit/php-file-iterator/README.md create mode 100644 vendor/phpunit/php-file-iterator/composer.json create mode 100644 vendor/phpunit/php-file-iterator/src/Facade.php create mode 100644 vendor/phpunit/php-file-iterator/src/Factory.php create mode 100644 vendor/phpunit/php-file-iterator/src/Iterator.php create mode 100644 vendor/phpunit/php-text-template/.gitattributes create mode 100644 vendor/phpunit/php-text-template/.gitignore create mode 100644 vendor/phpunit/php-text-template/LICENSE create mode 100644 vendor/phpunit/php-text-template/README.md create mode 100644 vendor/phpunit/php-text-template/composer.json create mode 100644 vendor/phpunit/php-text-template/src/Template.php create mode 100644 vendor/phpunit/php-timer/.gitattributes create mode 100644 vendor/phpunit/php-timer/.gitignore create mode 100644 vendor/phpunit/php-timer/.travis.yml create mode 100644 vendor/phpunit/php-timer/LICENSE create mode 100644 vendor/phpunit/php-timer/README.md create mode 100644 vendor/phpunit/php-timer/composer.json create mode 100644 vendor/phpunit/php-timer/src/Timer.php create mode 100644 vendor/phpunit/php-timer/tests/TimerTest.php create mode 100644 vendor/phpunit/php-token-stream/.gitattributes create mode 100644 vendor/phpunit/php-token-stream/.gitignore create mode 100644 vendor/phpunit/php-token-stream/.travis.yml create mode 100644 vendor/phpunit/php-token-stream/LICENSE create mode 100644 vendor/phpunit/php-token-stream/README.md create mode 100644 vendor/phpunit/php-token-stream/build.xml create mode 100644 vendor/phpunit/php-token-stream/build/phpunit.xml create mode 100644 vendor/phpunit/php-token-stream/composer.json create mode 100644 vendor/phpunit/php-token-stream/src/Token.php create mode 100644 vendor/phpunit/php-token-stream/src/Token/Stream.php create mode 100644 vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/ClassTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/TokenTest.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/classExtendsNamespacedClass.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/classInNamespace.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/classInScopedNamespace.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_that_declares_anonymous_class.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_that_declares_anonymous_class2.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/closure.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/issue19.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/issue30.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/multipleNamespacesWithOneClassUsingBraces.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/multipleNamespacesWithOneClassUsingNonBraceSyntax.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/source.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/source2.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/source3.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/source4.php create mode 100644 vendor/phpunit/php-token-stream/tests/_fixture/source5.php create mode 100644 vendor/phpunit/php-token-stream/tests/bootstrap.php create mode 100644 vendor/phpunit/phpunit-mock-objects/.gitattributes create mode 100644 vendor/phpunit/phpunit-mock-objects/.gitignore create mode 100644 vendor/phpunit/phpunit-mock-objects/.travis.yml create mode 100644 vendor/phpunit/phpunit-mock-objects/CONTRIBUTING.md create mode 100644 vendor/phpunit/phpunit-mock-objects/LICENSE create mode 100644 vendor/phpunit/phpunit-mock-objects/README.md create mode 100644 vendor/phpunit/phpunit-mock-objects/build.xml create mode 100644 vendor/phpunit/phpunit-mock-objects/build/travis-ci.xml create mode 100644 vendor/phpunit/phpunit-mock-objects/composer.json create mode 100644 vendor/phpunit/phpunit-mock-objects/phpunit.xml.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator/mocked_class.tpl.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator/mocked_class_method.tpl.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator/mocked_clone.tpl.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator/mocked_method.tpl.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator/mocked_static_method.tpl.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator/proxied_method.tpl.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator/trait_class.tpl.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator/unmocked_clone.tpl.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator/wsdl_class.tpl.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator/wsdl_method.tpl.dist create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php create mode 100644 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/GeneratorTest.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockBuilderTest.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/232.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/Invocation/ObjectTest.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/Invocation/StaticTest.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/Matcher/ConsecutiveParametersTest.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/abstract_class.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/class.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/class_call_parent_clone.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/class_call_parent_constructor.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/class_dont_call_parent_clone.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/class_dont_call_parent_constructor.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/class_implementing_interface_call_parent_constructor.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/class_implementing_interface_dont_call_parent_constructor.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/class_partial.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/class_with_method_named_method.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/class_with_method_with_variadic_arguments.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/interface.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/invocation_object_clone_object.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/namespaced_class.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/namespaced_class_call_parent_clone.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/namespaced_class_call_parent_constructor.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/namespaced_class_dont_call_parent_clone.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/namespaced_class_dont_call_parent_constructor.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/namespaced_class_implementing_interface_call_parent_constructor.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/namespaced_class_implementing_interface_dont_call_parent_constructor.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/namespaced_class_partial.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/namespaced_interface.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/nonexistent_class.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/nonexistent_class_with_namespace.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/nonexistent_class_with_namespace_starting_with_separator.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/proxy.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/scalar_type_declarations.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/wsdl_class.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/wsdl_class_namespace.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObject/wsdl_class_partial.phpt create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/MockObjectTest.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/ProxyObjectTest.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/AbstractMockTestClass.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/AbstractTrait.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/AnInterface.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/AnotherInterface.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/Bar.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/ClassThatImplementsSerializable.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/ClassWithStaticMethod.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/Foo.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/FunctionCallback.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/GoogleSearch.wsdl create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/InterfaceWithStaticMethod.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/MethodCallback.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/MethodCallbackByReference.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/MockTestInterface.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/Mockable.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/PartialMockTestClass.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/SingletonClass.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/SomeClass.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/StaticMockTestClass.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/_fixture/TraversableMockTestInterface.php create mode 100644 vendor/phpunit/phpunit-mock-objects/tests/bootstrap.php create mode 100644 vendor/phpunit/phpunit/.gitattributes create mode 100644 vendor/phpunit/phpunit/.gitignore create mode 100644 vendor/phpunit/phpunit/.php_cs create mode 100644 vendor/phpunit/phpunit/.travis.yml create mode 100644 vendor/phpunit/phpunit/CODE_OF_CONDUCT.md create mode 100644 vendor/phpunit/phpunit/CONTRIBUTING.md create mode 100644 vendor/phpunit/phpunit/ChangeLog-4.0.md create mode 100644 vendor/phpunit/phpunit/ChangeLog-4.1.md create mode 100644 vendor/phpunit/phpunit/ChangeLog-4.2.md create mode 100644 vendor/phpunit/phpunit/ChangeLog-4.3.md create mode 100644 vendor/phpunit/phpunit/ChangeLog-4.4.md create mode 100644 vendor/phpunit/phpunit/ChangeLog-4.5.md create mode 100644 vendor/phpunit/phpunit/ChangeLog-4.6.md create mode 100644 vendor/phpunit/phpunit/ChangeLog-4.7.md create mode 100644 vendor/phpunit/phpunit/ChangeLog-4.8.md create mode 100644 vendor/phpunit/phpunit/LICENSE create mode 100644 vendor/phpunit/phpunit/README.md create mode 100644 vendor/phpunit/phpunit/build.xml create mode 100755 vendor/phpunit/phpunit/build/bin/phpab create mode 100644 vendor/phpunit/phpunit/build/binary-phar-autoload.php.in create mode 100644 vendor/phpunit/phpunit/build/ca.pem create mode 100644 vendor/phpunit/phpunit/build/library-phar-autoload.php.in create mode 100755 vendor/phpunit/phpunit/build/phar-manifest.php create mode 100755 vendor/phpunit/phpunit/build/phar-version.php create mode 100644 vendor/phpunit/phpunit/build/travis-ci-fail.xml create mode 100644 vendor/phpunit/phpunit/composer.json create mode 100644 vendor/phpunit/phpunit/phpdox.xml.dist create mode 100755 vendor/phpunit/phpunit/phpunit create mode 100644 vendor/phpunit/phpunit/phpunit.xml.dist create mode 100644 vendor/phpunit/phpunit/phpunit.xsd create mode 100644 vendor/phpunit/phpunit/src/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Extensions/GroupTestSuite.php create mode 100644 vendor/phpunit/phpunit/src/Extensions/PhptTestCase.php create mode 100644 vendor/phpunit/phpunit/src/Extensions/PhptTestSuite.php create mode 100644 vendor/phpunit/phpunit/src/Extensions/RepeatedTest.php create mode 100644 vendor/phpunit/phpunit/src/Extensions/TestDecorator.php create mode 100644 vendor/phpunit/phpunit/src/Extensions/TicketListener.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Assert.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Assert/Functions.php create mode 100644 vendor/phpunit/phpunit/src/Framework/AssertionFailedError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/BaseTestListener.php create mode 100644 vendor/phpunit/phpunit/src/Framework/CodeCoverageException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/And.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Attribute.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Composite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Count.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/FileExists.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsFalse.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsJson.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsNull.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsTrue.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsType.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/LessThan.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Not.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Or.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/SameSize.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringContains.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringMatches.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Xor.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Error.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Notice.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Error/Warning.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php create mode 100644 vendor/phpunit/phpunit/src/Framework/ExpectationFailedException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/IncompleteTest.php create mode 100644 vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php create mode 100644 vendor/phpunit/phpunit/src/Framework/IncompleteTestError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/InvalidCoversTargetError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/OutputError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/RiskyTest.php create mode 100644 vendor/phpunit/phpunit/src/Framework/RiskyTestError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/SelfDescribing.php create mode 100644 vendor/phpunit/phpunit/src/Framework/SkippedTest.php create mode 100644 vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php create mode 100644 vendor/phpunit/phpunit/src/Framework/SkippedTestError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/SyntheticError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Test.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestCase.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestFailure.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestListener.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestResult.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSuite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php create mode 100644 vendor/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Warning.php create mode 100644 vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/Factory.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/Group.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/Group/Include.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/Test.php create mode 100644 vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Version.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/TestRunner.php create mode 100644 vendor/phpunit/phpunit/src/Util/Blacklist.php create mode 100644 vendor/phpunit/phpunit/src/Util/Configuration.php create mode 100644 vendor/phpunit/phpunit/src/Util/ErrorHandler.php create mode 100644 vendor/phpunit/phpunit/src/Util/Fileloader.php create mode 100644 vendor/phpunit/phpunit/src/Util/Filesystem.php create mode 100644 vendor/phpunit/phpunit/src/Util/Filter.php create mode 100644 vendor/phpunit/phpunit/src/Util/Getopt.php create mode 100644 vendor/phpunit/phpunit/src/Util/GlobalState.php create mode 100644 vendor/phpunit/phpunit/src/Util/InvalidArgumentHelper.php create mode 100644 vendor/phpunit/phpunit/src/Util/Log/JSON.php create mode 100644 vendor/phpunit/phpunit/src/Util/Log/JUnit.php create mode 100644 vendor/phpunit/phpunit/src/Util/Log/TAP.php create mode 100644 vendor/phpunit/phpunit/src/Util/PHP.php create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Default.php create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl.dist create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Windows.php create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php create mode 100644 vendor/phpunit/phpunit/src/Util/Printer.php create mode 100644 vendor/phpunit/phpunit/src/Util/Regex.php create mode 100644 vendor/phpunit/phpunit/src/Util/String.php create mode 100644 vendor/phpunit/phpunit/src/Util/Test.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php create mode 100644 vendor/phpunit/phpunit/src/Util/TestSuiteIterator.php create mode 100644 vendor/phpunit/phpunit/src/Util/Type.php create mode 100644 vendor/phpunit/phpunit/src/Util/XML.php create mode 100644 vendor/phpunit/phpunit/tests/Extensions/PhptTestCaseTest.php create mode 100644 vendor/phpunit/phpunit/tests/Extensions/RepeatedTestTest.php create mode 100644 vendor/phpunit/phpunit/tests/Fail/fail.phpt create mode 100644 vendor/phpunit/phpunit/tests/Framework/AssertTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/BaseTestListenerTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/Constraint/CountTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/Constraint/ExceptionMessageRegExpTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/Constraint/ExceptionMessageTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/Constraint/JsonMatches/ErrorMessageProviderTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/Constraint/JsonMatchesTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/ConstraintTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/SuiteTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/TestCaseTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/TestFailureTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/TestImplementorTest.php create mode 100644 vendor/phpunit/phpunit/tests/Framework/TestListenerTest.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/1021.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/1021/Issue1021Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/523.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/523/Issue523Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/578.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/578/Issue578Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/684.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/684/Issue684Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/783.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/783/ChildSuite.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/783/OneTest.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/783/ParentSuite.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/783/TwoTest.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1149.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1149/Issue1149Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1216.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1216/Issue1216Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1216/bootstrap1216.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1216/phpunit1216.xml create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1265.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1265/Issue1265Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1265/phpunit1265.xml create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1330.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1330/Issue1330Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1330/phpunit1330.xml create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1335.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1335/Issue1335Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1335/bootstrap1335.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1337.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1337/Issue1337Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1348.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1348/Issue1348Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1351.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1351/ChildProcessClass1351.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1351/Issue1351Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1374.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1374/Issue1374Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1437.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1437/Issue1437Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1468.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1468/Issue1468Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1471.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1471/Issue1471Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1472.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1472/Issue1472Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1570.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/1570/Issue1570Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/244.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/244/Issue244Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/322.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/322/Issue322Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/322/phpunit322.xml create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/433.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/433/Issue433Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/445.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/445/Issue445Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/498.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/498/Issue498Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/503.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/503/Issue503Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/581.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/581/Issue581Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/74.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/74/Issue74Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/74/NewException.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/765.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/765/Issue765Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/797.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/797/Issue797Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/797/bootstrap797.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/863.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/873-php5.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/873-php7.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/873/Issue873Test.php create mode 100644 vendor/phpunit/phpunit/tests/Runner/BaseTestRunnerTest.php create mode 100644 vendor/phpunit/phpunit/tests/TextUI/abstract-test-class.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/colors-always.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/concrete-test-class.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/custom-printer-debug.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/custom-printer-verbose.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/dataprovider-debug.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/dataprovider-log-xml-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/dataprovider-log-xml.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/dataprovider-testdox.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/debug.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/default-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/default.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/dependencies-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/dependencies.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/dependencies2-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/dependencies2.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/dependencies3-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/dependencies3.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/empty-testcase.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/exception-stack.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/exclude-group-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/exclude-group.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/failure-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/failure.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/fatal-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-class-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-class.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-classname-and-range-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-classname-and-range.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-number-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-number.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-range-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-range.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-regexp-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-regexp.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-string-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-string.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-range-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-range.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-regexp-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-regexp.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-string-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-string.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-method-case-insensitive.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-method-case-sensitive-no-result.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-method-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-method.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/filter-no-results.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/group-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/group.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/help.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/help2.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/ini-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/list-groups.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/log-json-no-pretty-print.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/log-json-post-66021.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/log-json-pre-66021.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/log-tap.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/log-xml.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/options-after-arguments.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/output-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/repeat.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/report-useless-tests-incomplete.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/report-useless-tests-isolation.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/report-useless-tests.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/tap.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/test-suffix-multiple.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/test-suffix-single.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/testdox-html.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/testdox-text.phpt create mode 100644 vendor/phpunit/phpunit/tests/TextUI/testdox.phpt create mode 100644 vendor/phpunit/phpunit/tests/Util/ConfigurationTest.php create mode 100644 vendor/phpunit/phpunit/tests/Util/GetoptTest.php create mode 100644 vendor/phpunit/phpunit/tests/Util/GlobalStateTest.php create mode 100644 vendor/phpunit/phpunit/tests/Util/RegexTest.php create mode 100644 vendor/phpunit/phpunit/tests/Util/TestDox/NamePrettifierTest.php create mode 100644 vendor/phpunit/phpunit/tests/Util/TestTest.php create mode 100644 vendor/phpunit/phpunit/tests/Util/XMLTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/AbstractTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/Author.php create mode 100644 vendor/phpunit/phpunit/tests/_files/BankAccount.php create mode 100644 vendor/phpunit/phpunit/tests/_files/BankAccountTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/BankAccountTest.test.php create mode 100644 vendor/phpunit/phpunit/tests/_files/BaseTestListenerSample.php create mode 100644 vendor/phpunit/phpunit/tests/_files/BeforeAndAfterTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/BeforeClassAndAfterClassTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/Book.php create mode 100644 vendor/phpunit/phpunit/tests/_files/Calculator.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ChangeCurrentWorkingDirectoryTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ClassWithNonPublicAttributes.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ClassWithScalarTypeDeclarations.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ClassWithToString.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ConcreteTest.my.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ConcreteTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageClassExtendedTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageClassTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageFunctionParenthesesTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageFunctionParenthesesWhitespaceTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageFunctionTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageMethodOneLineAnnotationTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageMethodParenthesesTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageMethodParenthesesWhitespaceTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageMethodTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageNamespacedFunctionTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageNoneTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageNotPrivateTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageNotProtectedTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageNotPublicTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageNothingTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoveragePrivateTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageProtectedTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoveragePublicTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoverageTwoDefaultClassAnnotations.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoveredClass.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CoveredFunction.php create mode 100644 vendor/phpunit/phpunit/tests/_files/CustomPrinter.php create mode 100644 vendor/phpunit/phpunit/tests/_files/DataProviderDebugTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/DataProviderFilterTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/DataProviderIncompleteTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/DataProviderSkippedTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/DataProviderTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/DependencyFailureTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/DependencySuccessTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/DependencyTestSuite.php create mode 100644 vendor/phpunit/phpunit/tests/_files/DoubleTestCase.php create mode 100644 vendor/phpunit/phpunit/tests/_files/DummyException.php create mode 100644 vendor/phpunit/phpunit/tests/_files/EmptyTestCaseTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ExceptionInAssertPostConditionsTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ExceptionInAssertPreConditionsTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ExceptionInSetUpTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ExceptionInTearDownTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ExceptionInTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ExceptionNamespaceTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ExceptionStackTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ExceptionTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/Failure.php create mode 100644 vendor/phpunit/phpunit/tests/_files/FailureTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/FatalTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/IncompleteTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/Inheritance/InheritanceA.php create mode 100644 vendor/phpunit/phpunit/tests/_files/Inheritance/InheritanceB.php create mode 100644 vendor/phpunit/phpunit/tests/_files/InheritedTestCase.php create mode 100644 vendor/phpunit/phpunit/tests/_files/IniTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/IsolationTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/JsonData/arrayObject.json create mode 100644 vendor/phpunit/phpunit/tests/_files/JsonData/simpleObject.json create mode 100644 vendor/phpunit/phpunit/tests/_files/MockRunner.php create mode 100644 vendor/phpunit/phpunit/tests/_files/MultiDependencyTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoverageClassExtendedTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoverageClassTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoverageCoversClassPublicTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoverageCoversClassTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoverageMethodTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoverageNotPrivateTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoverageNotProtectedTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoverageNotPublicTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoveragePrivateTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoverageProtectedTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoveragePublicTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoveredClass.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NamespaceCoveredFunction.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NoArgTestCaseTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NoTestCaseClass.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NoTestCases.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NonStatic.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NotExistingCoveredElementTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NotPublicTestCase.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NotVoidTestCase.php create mode 100644 vendor/phpunit/phpunit/tests/_files/NothingTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/OneTestCase.php create mode 100644 vendor/phpunit/phpunit/tests/_files/OutputTestCase.php create mode 100644 vendor/phpunit/phpunit/tests/_files/OverrideTestCase.php create mode 100644 vendor/phpunit/phpunit/tests/_files/RequirementsClassBeforeClassHookTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/RequirementsClassDocBlockTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/RequirementsTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/SampleArrayAccess.php create mode 100644 vendor/phpunit/phpunit/tests/_files/SampleClass.php create mode 100644 vendor/phpunit/phpunit/tests/_files/Singleton.php create mode 100644 vendor/phpunit/phpunit/tests/_files/StackTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/Struct.php create mode 100644 vendor/phpunit/phpunit/tests/_files/Success.php create mode 100644 vendor/phpunit/phpunit/tests/_files/TemplateMethodsTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/TestIncomplete.php create mode 100644 vendor/phpunit/phpunit/tests/_files/TestIterator.php create mode 100644 vendor/phpunit/phpunit/tests/_files/TestIterator2.php create mode 100644 vendor/phpunit/phpunit/tests/_files/TestSkipped.php create mode 100644 vendor/phpunit/phpunit/tests/_files/TestTestError.php create mode 100644 vendor/phpunit/phpunit/tests/_files/TestWithTest.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ThrowExceptionTestCase.php create mode 100644 vendor/phpunit/phpunit/tests/_files/ThrowNoExceptionTestCase.php create mode 100644 vendor/phpunit/phpunit/tests/_files/WasRun.php create mode 100644 vendor/phpunit/phpunit/tests/_files/bar.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/configuration.colors.empty.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/configuration.colors.false.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/configuration.colors.invalid.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/configuration.colors.true.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/configuration.custom-printer.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/configuration.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/configuration_empty.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/configuration_xinclude.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/expectedFileFormat.txt create mode 100644 vendor/phpunit/phpunit/tests/_files/foo.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/structureAttributesAreSameButValuesAreNot.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/structureExpected.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/structureIgnoreTextNodes.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/structureIsSameButDataIsNot.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/structureWrongNumberOfAttributes.xml create mode 100644 vendor/phpunit/phpunit/tests/_files/structureWrongNumberOfNodes.xml create mode 100644 vendor/phpunit/phpunit/tests/bootstrap.php create mode 100644 vendor/sebastian/comparator/.gitignore create mode 100644 vendor/sebastian/comparator/.travis.yml create mode 100644 vendor/sebastian/comparator/LICENSE create mode 100644 vendor/sebastian/comparator/README.md create mode 100644 vendor/sebastian/comparator/build.xml create mode 100644 vendor/sebastian/comparator/build/travis-ci.xml create mode 100644 vendor/sebastian/comparator/composer.json create mode 100644 vendor/sebastian/comparator/phpunit.xml.dist create mode 100644 vendor/sebastian/comparator/src/ArrayComparator.php create mode 100644 vendor/sebastian/comparator/src/Comparator.php create mode 100644 vendor/sebastian/comparator/src/ComparisonFailure.php create mode 100644 vendor/sebastian/comparator/src/DOMNodeComparator.php create mode 100644 vendor/sebastian/comparator/src/DateTimeComparator.php create mode 100644 vendor/sebastian/comparator/src/DoubleComparator.php create mode 100644 vendor/sebastian/comparator/src/ExceptionComparator.php create mode 100644 vendor/sebastian/comparator/src/Factory.php create mode 100644 vendor/sebastian/comparator/src/MockObjectComparator.php create mode 100644 vendor/sebastian/comparator/src/NumericComparator.php create mode 100644 vendor/sebastian/comparator/src/ObjectComparator.php create mode 100644 vendor/sebastian/comparator/src/ResourceComparator.php create mode 100644 vendor/sebastian/comparator/src/ScalarComparator.php create mode 100644 vendor/sebastian/comparator/src/SplObjectStorageComparator.php create mode 100644 vendor/sebastian/comparator/src/TypeComparator.php create mode 100644 vendor/sebastian/comparator/tests/ArrayComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/DOMNodeComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/DateTimeComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/DoubleComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/ExceptionComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/FactoryTest.php create mode 100644 vendor/sebastian/comparator/tests/MockObjectComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/NumericComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/ObjectComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/ResourceComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/ScalarComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/SplObjectStorageComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/TypeComparatorTest.php create mode 100644 vendor/sebastian/comparator/tests/_files/Author.php create mode 100644 vendor/sebastian/comparator/tests/_files/Book.php create mode 100644 vendor/sebastian/comparator/tests/_files/ClassWithToString.php create mode 100644 vendor/sebastian/comparator/tests/_files/SampleClass.php create mode 100644 vendor/sebastian/comparator/tests/_files/Struct.php create mode 100644 vendor/sebastian/comparator/tests/_files/TestClass.php create mode 100644 vendor/sebastian/comparator/tests/_files/TestClassComparator.php create mode 100644 vendor/sebastian/comparator/tests/autoload.php create mode 100644 vendor/sebastian/comparator/tests/bootstrap.php create mode 100644 vendor/sebastian/diff/.gitignore create mode 100644 vendor/sebastian/diff/.php_cs create mode 100644 vendor/sebastian/diff/.travis.yml create mode 100644 vendor/sebastian/diff/LICENSE create mode 100644 vendor/sebastian/diff/README.md create mode 100644 vendor/sebastian/diff/build.xml create mode 100644 vendor/sebastian/diff/composer.json create mode 100644 vendor/sebastian/diff/phpunit.xml.dist create mode 100644 vendor/sebastian/diff/src/Chunk.php create mode 100644 vendor/sebastian/diff/src/Diff.php create mode 100644 vendor/sebastian/diff/src/Differ.php create mode 100644 vendor/sebastian/diff/src/LCS/LongestCommonSubsequence.php create mode 100644 vendor/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php create mode 100644 vendor/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php create mode 100644 vendor/sebastian/diff/src/Line.php create mode 100644 vendor/sebastian/diff/src/Parser.php create mode 100644 vendor/sebastian/diff/tests/DifferTest.php create mode 100644 vendor/sebastian/diff/tests/LCS/TimeEfficientImplementationTest.php create mode 100644 vendor/sebastian/diff/tests/ParserTest.php create mode 100644 vendor/sebastian/diff/tests/fixtures/patch.txt create mode 100644 vendor/sebastian/diff/tests/fixtures/patch2.txt create mode 100644 vendor/sebastian/environment/.gitignore create mode 100644 vendor/sebastian/environment/.travis.yml create mode 100644 vendor/sebastian/environment/LICENSE create mode 100644 vendor/sebastian/environment/README.md create mode 100644 vendor/sebastian/environment/build.xml create mode 100644 vendor/sebastian/environment/composer.json create mode 100644 vendor/sebastian/environment/phpunit.xml.dist create mode 100644 vendor/sebastian/environment/src/Console.php create mode 100644 vendor/sebastian/environment/src/Runtime.php create mode 100644 vendor/sebastian/environment/tests/ConsoleTest.php create mode 100644 vendor/sebastian/environment/tests/RuntimeTest.php create mode 100644 vendor/sebastian/exporter/.gitignore create mode 100644 vendor/sebastian/exporter/.travis.yml create mode 100644 vendor/sebastian/exporter/LICENSE create mode 100644 vendor/sebastian/exporter/README.md create mode 100644 vendor/sebastian/exporter/build.xml create mode 100644 vendor/sebastian/exporter/composer.json create mode 100644 vendor/sebastian/exporter/phpunit.xml.dist create mode 100644 vendor/sebastian/exporter/src/Exporter.php create mode 100644 vendor/sebastian/exporter/tests/ExporterTest.php create mode 100644 vendor/sebastian/global-state/.gitignore create mode 100644 vendor/sebastian/global-state/.travis.yml create mode 100644 vendor/sebastian/global-state/LICENSE create mode 100644 vendor/sebastian/global-state/README.md create mode 100644 vendor/sebastian/global-state/build.xml create mode 100644 vendor/sebastian/global-state/composer.json create mode 100644 vendor/sebastian/global-state/phpunit.xml.dist create mode 100644 vendor/sebastian/global-state/src/Blacklist.php create mode 100644 vendor/sebastian/global-state/src/CodeExporter.php create mode 100644 vendor/sebastian/global-state/src/Exception.php create mode 100644 vendor/sebastian/global-state/src/Restorer.php create mode 100644 vendor/sebastian/global-state/src/RuntimeException.php create mode 100644 vendor/sebastian/global-state/src/Snapshot.php create mode 100644 vendor/sebastian/global-state/tests/BlacklistTest.php create mode 100644 vendor/sebastian/global-state/tests/SnapshotTest.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedChildClass.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedClass.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedImplementor.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/BlacklistedInterface.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotClass.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotDomDocument.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotFunctions.php create mode 100644 vendor/sebastian/global-state/tests/_fixture/SnapshotTrait.php create mode 100644 vendor/sebastian/recursion-context/.gitignore create mode 100644 vendor/sebastian/recursion-context/.travis.yml create mode 100644 vendor/sebastian/recursion-context/LICENSE create mode 100644 vendor/sebastian/recursion-context/README.md create mode 100644 vendor/sebastian/recursion-context/build.xml create mode 100644 vendor/sebastian/recursion-context/composer.json create mode 100644 vendor/sebastian/recursion-context/phpunit.xml.dist create mode 100644 vendor/sebastian/recursion-context/src/Context.php create mode 100644 vendor/sebastian/recursion-context/src/Exception.php create mode 100644 vendor/sebastian/recursion-context/src/InvalidArgumentException.php create mode 100644 vendor/sebastian/recursion-context/tests/ContextTest.php create mode 100644 vendor/sebastian/version/.gitattributes create mode 100644 vendor/sebastian/version/.gitignore create mode 100644 vendor/sebastian/version/LICENSE create mode 100644 vendor/sebastian/version/README.md create mode 100644 vendor/sebastian/version/composer.json create mode 100644 vendor/sebastian/version/src/Version.php create mode 100644 vendor/squizlabs/php_codesniffer/.gitattributes create mode 100644 vendor/squizlabs/php_codesniffer/.gitignore create mode 100644 vendor/squizlabs/php_codesniffer/CONTRIBUTING.md create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer.conf.dist create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/CLI.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/Generator.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/HTML.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/Markdown.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/Text.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Exception.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/File.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Fixer.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Report.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reporting.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Cbf.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Checkstyle.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Csv.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Diff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Emacs.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Full.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Gitblame.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Hgblame.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Info.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Json.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Junit.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Notifysend.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Source.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Summary.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Svnblame.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/VersionControl.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/Xml.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Sniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/AbstractPatternSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/AbstractScopeSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/AbstractVariableSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Classes/DuplicateClassNameStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/CodeAnalysis/EmptyStatementStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/CodeAnalysis/ForLoopShouldBeWhileLoopStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/CodeAnalysis/ForLoopWithTestFunctionCallStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/CodeAnalysis/JumbledIncrementerStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/CodeAnalysis/UnconditionalIfStatementStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/CodeAnalysis/UnnecessaryFinalModifierStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/CodeAnalysis/UnusedFunctionParameterStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/CodeAnalysis/UselessOverridingMethodStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Commenting/FixmeStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Commenting/TodoStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/ControlStructures/InlineControlStructureStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Debug/CSSLintStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Debug/ClosureLinterStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Debug/JSHintStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Files/ByteOrderMarkStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Files/EndFileNewlineStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Files/EndFileNoNewlineStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Files/InlineHTMLStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Files/LineEndingsStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Files/LineLengthStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Files/LowercasedFilenameStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Files/OneClassPerFileStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Files/OneInterfacePerFileStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Formatting/DisallowMultipleStatementsStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Formatting/MultipleStatementAlignmentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Formatting/NoSpaceAfterCastStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Formatting/SpaceAfterCastStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Functions/CallTimePassByReferenceStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Functions/FunctionCallArgumentSpacingStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Functions/OpeningFunctionBraceBsdAllmanStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Functions/OpeningFunctionBraceKernighanRitchieStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Metrics/CyclomaticComplexityStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Metrics/NestingLevelStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/NamingConventions/CamelCapsFunctionNameStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/NamingConventions/ConstructorNameStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/NamingConventions/UpperCaseConstantNameStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/PHP/CharacterBeforePHPOpeningTagStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/PHP/ClosingPHPTagStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/PHP/DeprecatedFunctionsStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/PHP/DisallowShortOpenTagStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/PHP/ForbiddenFunctionsStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/PHP/LowerCaseConstantStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/PHP/LowerCaseKeywordStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/PHP/NoSilencedErrorsStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/PHP/SAPIUsageStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/PHP/UpperCaseConstantStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/Strings/UnnecessaryStringConcatStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/VersionControl/SubversionPropertiesStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/WhiteSpace/DisallowSpaceIndentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/WhiteSpace/DisallowTabIndentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Docs/WhiteSpace/ScopeIndentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Commenting/FixmeSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Commenting/TodoSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Debug/CSSLintSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Debug/JSHintSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LineEndingsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LineLengthSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/DisallowShortOpenTagSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/ForbiddenFunctionsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/LowerCaseConstantSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/LowerCaseKeywordSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/NoSilencedErrorsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/SAPIUsageSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/SyntaxSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/UpperCaseConstantSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Strings/UnnecessaryStringConcatSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/VersionControl/SubversionPropertiesSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowSpaceIndentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/ScopeIndentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/ruleset.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/IncorrectPatternException.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Objects/AssignThisSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/ruleset.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Classes/ClassDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Commenting/ClassCommentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Commenting/FileCommentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Commenting/FunctionCommentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Commenting/InlineCommentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/ControlStructures/ControlSignatureStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/ControlStructures/MultiLineConditionStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Files/IncludingFileStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Files/LineLengthStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Formatting/MultiLineAssignmentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Functions/FunctionCallSignatureStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Functions/FunctionDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/Functions/ValidDefaultValueStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/NamingConventions/ValidClassNameStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/NamingConventions/ValidFunctionNameStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/NamingConventions/ValidVariableNameStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/WhiteSpace/ObjectOperatorIndentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/WhiteSpace/ScopeClosingBraceStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Docs/WhiteSpace/ScopeIndentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/ruleset.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PHPCS/ruleset.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Docs/Classes/ClassDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Docs/Files/SideEffectsStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/ruleset.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Docs/Classes/ClassDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Docs/Classes/PropertyDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Docs/ControlStructures/ControlStructureSpacingStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Docs/ControlStructures/ElseIfDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Docs/ControlStructures/SwitchDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Docs/Files/EndFileNewlineStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Docs/Methods/MethodDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Docs/Namespaces/NamespaceDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Docs/Namespaces/UseDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/ruleset.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/Arrays/ArrayBracketSpacingStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/Arrays/ArrayDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/Classes/LowercaseClassKeywordsStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/Classes/SelfMemberReferenceStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/Commenting/DocCommentAlignmentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/Commenting/FunctionCommentThrowTagStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/ControlStructures/ForEachLoopDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/ControlStructures/ForLoopDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/ControlStructures/LowercaseDeclarationStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/Functions/FunctionDuplicateArgumentStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/Functions/LowercaseFunctionKeywordsStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/Scope/StaticThisUsageStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/Strings/EchoedStringsStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/WhiteSpace/CastSpacingStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/WhiteSpace/FunctionOpeningBraceStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/WhiteSpace/LanguageConstructSpacingStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/WhiteSpace/ObjectOperatorSpacingStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/WhiteSpace/ScopeKeywordSpacingStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Docs/WhiteSpace/SemicolonSpacingStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/IndentationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/OpacitySniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Debug/JSLintSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowObEndFlushSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/EvalSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/ForbiddenFunctionsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/HeredocSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/ruleset.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Docs/Debug/CodeAnalyzerStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Docs/Files/ClosingTagStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Docs/NamingConventions/ValidVariableNameStandard.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Sniffs/Files/ClosingTagSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/ruleset.xml create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/CSS.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/Comment.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/JS.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/PHP.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Tokens.php create mode 100644 vendor/squizlabs/php_codesniffer/README.md create mode 100644 vendor/squizlabs/php_codesniffer/composer.json create mode 100644 vendor/squizlabs/php_codesniffer/licence.txt create mode 100644 vendor/squizlabs/php_codesniffer/phpcs.xml.dist create mode 100644 vendor/squizlabs/php_codesniffer/phpunit.xml.dist create mode 100644 vendor/squizlabs/php_codesniffer/scripts/build-phar.php create mode 100755 vendor/squizlabs/php_codesniffer/scripts/phpcbf create mode 100644 vendor/squizlabs/php_codesniffer/scripts/phpcbf.bat create mode 100755 vendor/squizlabs/php_codesniffer/scripts/phpcs create mode 100755 vendor/squizlabs/php_codesniffer/scripts/phpcs-svn-pre-commit create mode 100755 vendor/squizlabs/php_codesniffer/scripts/phpcs.bat create mode 100644 vendor/symfony/console/.gitignore create mode 100644 vendor/symfony/console/Application.php create mode 100644 vendor/symfony/console/CHANGELOG.md create mode 100644 vendor/symfony/console/Command/Command.php create mode 100644 vendor/symfony/console/Command/HelpCommand.php create mode 100644 vendor/symfony/console/Command/ListCommand.php create mode 100644 vendor/symfony/console/ConsoleEvents.php create mode 100644 vendor/symfony/console/Descriptor/ApplicationDescription.php create mode 100644 vendor/symfony/console/Descriptor/Descriptor.php create mode 100644 vendor/symfony/console/Descriptor/DescriptorInterface.php create mode 100644 vendor/symfony/console/Descriptor/JsonDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/MarkdownDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/TextDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/XmlDescriptor.php create mode 100644 vendor/symfony/console/Event/ConsoleCommandEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleExceptionEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleTerminateEvent.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatter.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterInterface.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyle.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyleStack.php create mode 100644 vendor/symfony/console/Helper/DebugFormatterHelper.php create mode 100644 vendor/symfony/console/Helper/DescriptorHelper.php create mode 100644 vendor/symfony/console/Helper/DialogHelper.php create mode 100644 vendor/symfony/console/Helper/FormatterHelper.php create mode 100644 vendor/symfony/console/Helper/Helper.php create mode 100644 vendor/symfony/console/Helper/HelperInterface.php create mode 100644 vendor/symfony/console/Helper/HelperSet.php create mode 100644 vendor/symfony/console/Helper/InputAwareHelper.php create mode 100644 vendor/symfony/console/Helper/ProcessHelper.php create mode 100644 vendor/symfony/console/Helper/ProgressBar.php create mode 100644 vendor/symfony/console/Helper/ProgressHelper.php create mode 100644 vendor/symfony/console/Helper/QuestionHelper.php create mode 100644 vendor/symfony/console/Helper/SymfonyQuestionHelper.php create mode 100644 vendor/symfony/console/Helper/Table.php create mode 100644 vendor/symfony/console/Helper/TableCell.php create mode 100644 vendor/symfony/console/Helper/TableHelper.php create mode 100644 vendor/symfony/console/Helper/TableSeparator.php create mode 100644 vendor/symfony/console/Helper/TableStyle.php create mode 100644 vendor/symfony/console/Input/ArgvInput.php create mode 100644 vendor/symfony/console/Input/ArrayInput.php create mode 100644 vendor/symfony/console/Input/Input.php create mode 100644 vendor/symfony/console/Input/InputArgument.php create mode 100644 vendor/symfony/console/Input/InputAwareInterface.php create mode 100644 vendor/symfony/console/Input/InputDefinition.php create mode 100644 vendor/symfony/console/Input/InputInterface.php create mode 100644 vendor/symfony/console/Input/InputOption.php create mode 100644 vendor/symfony/console/Input/StringInput.php create mode 100644 vendor/symfony/console/LICENSE create mode 100644 vendor/symfony/console/Logger/ConsoleLogger.php create mode 100644 vendor/symfony/console/Output/BufferedOutput.php create mode 100644 vendor/symfony/console/Output/ConsoleOutput.php create mode 100644 vendor/symfony/console/Output/ConsoleOutputInterface.php create mode 100644 vendor/symfony/console/Output/NullOutput.php create mode 100644 vendor/symfony/console/Output/Output.php create mode 100644 vendor/symfony/console/Output/OutputInterface.php create mode 100644 vendor/symfony/console/Output/StreamOutput.php create mode 100644 vendor/symfony/console/Question/ChoiceQuestion.php create mode 100644 vendor/symfony/console/Question/ConfirmationQuestion.php create mode 100644 vendor/symfony/console/Question/Question.php create mode 100644 vendor/symfony/console/README.md create mode 100644 vendor/symfony/console/Resources/bin/hiddeninput.exe create mode 100644 vendor/symfony/console/Shell.php create mode 100644 vendor/symfony/console/Style/OutputStyle.php create mode 100644 vendor/symfony/console/Style/StyleInterface.php create mode 100644 vendor/symfony/console/Style/SymfonyStyle.php create mode 100644 vendor/symfony/console/Tester/ApplicationTester.php create mode 100644 vendor/symfony/console/Tester/CommandTester.php create mode 100644 vendor/symfony/console/Tests/ApplicationTest.php create mode 100644 vendor/symfony/console/Tests/Command/CommandTest.php create mode 100644 vendor/symfony/console/Tests/Command/HelpCommandTest.php create mode 100644 vendor/symfony/console/Tests/Command/ListCommandTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/AbstractDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/JsonDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/MarkdownDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/ObjectsProvider.php create mode 100644 vendor/symfony/console/Tests/Descriptor/TextDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Descriptor/XmlDescriptorTest.php create mode 100644 vendor/symfony/console/Tests/Fixtures/BarBucCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorApplication1.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorApplication2.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorCommand1.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DescriptorCommand2.php create mode 100644 vendor/symfony/console/Tests/Fixtures/DummyOutput.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo1Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo2Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo3Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo4Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/Foo5Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FooCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FooSubnamespaced1Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FooSubnamespaced2Command.php create mode 100644 vendor/symfony/console/Tests/Fixtures/FoobarCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/TestCommand.php create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/application_astext1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_astext2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_asxml1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_asxml2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_gethelp.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception3decorated.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth1decorated.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/application_run4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/command_astext.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/command_asxml.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/definition_astext.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/definition_asxml.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_3.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_argument_4.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_3.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_definition_4.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_1.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_2.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_3.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_4.xml create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.json create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.md create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.txt create mode 100644 vendor/symfony/console/Tests/Fixtures/input_option_5.xml create mode 100644 vendor/symfony/console/Tests/Formatter/OutputFormatterStyleStackTest.php create mode 100644 vendor/symfony/console/Tests/Formatter/OutputFormatterStyleTest.php create mode 100644 vendor/symfony/console/Tests/Formatter/OutputFormatterTest.php create mode 100644 vendor/symfony/console/Tests/Helper/FormatterHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/HelperSetTest.php create mode 100644 vendor/symfony/console/Tests/Helper/LegacyDialogHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/LegacyProgressHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/LegacyTableHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/ProcessHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/ProgressBarTest.php create mode 100644 vendor/symfony/console/Tests/Helper/QuestionHelperTest.php create mode 100644 vendor/symfony/console/Tests/Helper/TableStyleTest.php create mode 100644 vendor/symfony/console/Tests/Helper/TableTest.php create mode 100644 vendor/symfony/console/Tests/Input/ArgvInputTest.php create mode 100644 vendor/symfony/console/Tests/Input/ArrayInputTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputArgumentTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputDefinitionTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputOptionTest.php create mode 100644 vendor/symfony/console/Tests/Input/InputTest.php create mode 100644 vendor/symfony/console/Tests/Input/StringInputTest.php create mode 100644 vendor/symfony/console/Tests/Logger/ConsoleLoggerTest.php create mode 100644 vendor/symfony/console/Tests/Output/ConsoleOutputTest.php create mode 100644 vendor/symfony/console/Tests/Output/NullOutputTest.php create mode 100644 vendor/symfony/console/Tests/Output/OutputTest.php create mode 100644 vendor/symfony/console/Tests/Output/StreamOutputTest.php create mode 100644 vendor/symfony/console/Tests/Tester/ApplicationTesterTest.php create mode 100644 vendor/symfony/console/Tests/Tester/CommandTesterTest.php create mode 100644 vendor/symfony/console/composer.json create mode 100644 vendor/symfony/console/phpunit.xml.dist create mode 100644 vendor/symfony/yaml/.gitignore create mode 100644 vendor/symfony/yaml/CHANGELOG.md create mode 100644 vendor/symfony/yaml/Dumper.php create mode 100644 vendor/symfony/yaml/Escaper.php create mode 100644 vendor/symfony/yaml/Exception/DumpException.php create mode 100644 vendor/symfony/yaml/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/yaml/Exception/ParseException.php create mode 100644 vendor/symfony/yaml/Exception/RuntimeException.php create mode 100644 vendor/symfony/yaml/Inline.php create mode 100644 vendor/symfony/yaml/LICENSE create mode 100644 vendor/symfony/yaml/Parser.php create mode 100644 vendor/symfony/yaml/README.md create mode 100644 vendor/symfony/yaml/Tests/DumperTest.php create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/embededPhp.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/index.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfComments.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/sfTests.yml create mode 100644 vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml create mode 100644 vendor/symfony/yaml/Tests/InlineTest.php create mode 100644 vendor/symfony/yaml/Tests/ParseExceptionTest.php create mode 100644 vendor/symfony/yaml/Tests/ParserTest.php create mode 100644 vendor/symfony/yaml/Tests/YamlTest.php create mode 100644 vendor/symfony/yaml/Unescaper.php create mode 100644 vendor/symfony/yaml/Yaml.php create mode 100644 vendor/symfony/yaml/composer.json create mode 100644 vendor/symfony/yaml/phpunit.xml.dist diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..d17eb9a --- /dev/null +++ b/composer.lock @@ -0,0 +1,1706 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "52dbcc24237755875ac2468c08e1b4c3", + "packages": [ + { + "name": "eloquent/composer-config-reader", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/eloquent/composer-config-reader.git", + "reference": "b79319806e1bcc101c89a023b3aeee9e5931e463" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/composer-config-reader/zipball/b79319806e1bcc101c89a023b3aeee9e5931e463", + "reference": "b79319806e1bcc101c89a023b3aeee9e5931e463", + "shasum": "" + }, + "require": { + "eloquent/enumeration": "~5", + "eloquent/liberator": "~1", + "icecave/isolator": "~2", + "justinrainbow/json-schema": "~1", + "php": ">=5.3" + }, + "require-dev": { + "icecave/archer": "~1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Eloquent\\Composer\\Configuration\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "A light-weight component for reading Composer configuration files.", + "homepage": "https://github.com/eloquent/composer-config-reader", + "keywords": [ + "composer", + "configuration", + "parser", + "reader" + ], + "time": "2014-01-22 01:05:31" + }, + { + "name": "eloquent/enumeration", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/eloquent/enumeration.git", + "reference": "0242859435d9b135939816858348556d3cde9e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/enumeration/zipball/0242859435d9b135939816858348556d3cde9e3c", + "reference": "0242859435d9b135939816858348556d3cde9e3c", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "icecave/archer": "dev-develop", + "phpunit/phpunit": "^4", + "sami/sami": "^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Eloquent\\Enumeration\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "An enumeration implementation for PHP.", + "homepage": "https://github.com/eloquent/enumeration", + "keywords": [ + "class", + "enum", + "enumeration", + "multiton", + "set", + "type" + ], + "time": "2015-11-03 22:21:38" + }, + { + "name": "eloquent/liberator", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/eloquent/liberator.git", + "reference": "a85435066850ab47acc61296c5d20732ff4c9655" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/liberator/zipball/a85435066850ab47acc61296c5d20732ff4c9655", + "reference": "a85435066850ab47acc61296c5d20732ff4c9655", + "shasum": "" + }, + "require": { + "eloquent/pops": "~3", + "php": ">=5.3.0" + }, + "require-dev": { + "icecave/archer": "~0.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "Eloquent\\Liberator": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "A proxy for circumventing PHP access modifier restrictions.", + "homepage": "https://github.com/eloquent/liberator", + "keywords": [ + "access", + "modifier", + "object", + "private", + "protected", + "proxy", + "reflection" + ], + "time": "2013-03-03 23:02:47" + }, + { + "name": "eloquent/pops", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/eloquent/pops.git", + "reference": "b14090a3478f544d1b3a3b9389cb03415cf4f37f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/pops/zipball/b14090a3478f544d1b3a3b9389cb03415cf4f37f", + "reference": "b14090a3478f544d1b3a3b9389cb03415cf4f37f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "icecave/archer": "~0.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "Eloquent\\Pops": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "PHP object proxy system.", + "homepage": "https://github.com/eloquent/pops", + "keywords": [ + "escaping", + "object", + "proxy" + ], + "time": "2013-03-04 10:10:43" + }, + { + "name": "firegento/psr0autoloader", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/magento-hackathon/Magento-PSR-0-Autoloader.git", + "reference": "c5e913c72b856471086a25acb3b5593bbef220f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento-hackathon/Magento-PSR-0-Autoloader/zipball/c5e913c72b856471086a25acb3b5593bbef220f1", + "reference": "c5e913c72b856471086a25acb3b5593bbef220f1", + "shasum": "" + }, + "require-dev": { + "firegento/mage-ci": "master-dev", + "phpunit/phpunit": "~4.4" + }, + "type": "magento-module", + "extra": { + "magento-root-dir": "test-root" + }, + "authors": [ + { + "name": "Michael Ryvlin" + }, + { + "name": "Damian Luszczymak" + } + ], + "description": "This extension adds a PSR-0 autoloader before the Varien autoloader", + "support": { + "source": "https://github.com/magento-hackathon/Magento-PSR-0-Autoloader/tree/master", + "issues": "https://github.com/magento-hackathon/Magento-PSR-0-Autoloader/issues" + }, + "time": "2015-05-21 19:57:51" + }, + { + "name": "icecave/isolator", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/IcecaveStudios/isolator.git", + "reference": "97c51fafa39c57a8f1a31f978a48fbe6cea4a5d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/IcecaveStudios/isolator/zipball/97c51fafa39c57a8f1a31f978a48fbe6cea4a5d5", + "reference": "97c51fafa39c57a8f1a31f978a48fbe6cea4a5d5", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "icecave/archer": "~1" + }, + "suggest": { + "eloquent/asplode": "Drop-in exception-based error handling." + }, + "type": "library", + "autoload": { + "psr-4": { + "Icecave\\Isolator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "James Harris", + "email": "james.harris@icecave.com.au", + "homepage": "https://github.com/jmalloc" + } + ], + "description": "Dependency injection for global functions.", + "homepage": "https://github.com/IcecaveStudios/isolator", + "keywords": [ + "fake", + "mock", + "phake", + "phpunit", + "test", + "unit" + ], + "time": "2014-08-12 03:16:11" + }, + { + "name": "justinrainbow/json-schema", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/cc84765fb7317f6b07bd8ac78364747f95b86341", + "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341", + "shasum": "" + }, + "require": { + "php": ">=5.3.29" + }, + "require-dev": { + "json-schema/json-schema-test-suite": "1.1.0", + "phpdocumentor/phpdocumentor": "~2", + "phpunit/phpunit": "~3.7" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "time": "2016-01-25 15:43:01" + }, + { + "name": "magento-hackathon/magento-composer-installer", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/Cotya/magento-composer-installer.git", + "reference": "0bb00f1d17f73107c1927d31d3280750b93ae652" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Cotya/magento-composer-installer/zipball/0bb00f1d17f73107c1927d31d3280750b93ae652", + "reference": "0bb00f1d17f73107c1927d31d3280750b93ae652", + "shasum": "" + }, + "archive": { + "exclude": [ + "vendor", + "/tests/FullStackTest/" + ] + }, + "require": { + "composer-plugin-api": "~1.0", + "eloquent/composer-config-reader": "2.*", + "php": ">=5.4", + "symfony/console": "~2.5" + }, + "require-dev": { + "composer/composer": "1.0.*@dev", + "cotya/composer-test-framework": "dev-master", + "mikey179/vfsstream": "~1.4", + "phpunit/phpunit": "~4.3", + "phpunit/phpunit-mock-objects": "~2.3", + "squizlabs/php_codesniffer": "~2.1", + "symfony/process": "~2.5" + }, + "suggest": { + "colinmollenhour/modman": "*", + "theseer/autoload": "~1.14" + }, + "bin": [ + "bin/magento-composer-installer.php" + ], + "type": "composer-plugin", + "extra": { + "class": "MagentoHackathon\\Composer\\Magento\\Plugin" + }, + "autoload": { + "psr-0": { + "MagentoHackathon\\Composer": "src/" + } + }, + "autoload-dev": { + "psr-0": { + "MagentoHackathon\\Composer\\Magento": "tests/" + } + }, + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Daniel Fahlke aka Flyingmana", + "email": "flyingmana@googlemail.com" + }, + { + "name": "Jörg Weller", + "email": "weller@flagbit.de" + }, + { + "name": "Karl Spies", + "email": "karl.spies@gmx.net" + }, + { + "name": "Tobias Vogt", + "email": "tobi@webguys.de" + }, + { + "name": "David Fuhr", + "email": "fuhr@flagbit.de" + }, + { + "name": "Vinai Kopp", + "email": "vinai@netzarbeiter.com" + } + ], + "description": "Composer installer for Magento modules", + "homepage": "https://github.com/magento-hackathon/magento-composer-installer", + "keywords": [ + "composer-installer", + "magento" + ], + "support": { + "source": "https://github.com/Cotya/magento-composer-installer/tree/3.0.6", + "issues": "https://github.com/Cotya/magento-composer-installer/issues" + }, + "time": "2015-10-21 21:00:24" + }, + { + "name": "mothership/component_base", + "version": "v0.2.0", + "source": { + "type": "git", + "url": "https://github.com/mothership-gmbh/component_base.git", + "reference": "c3963812ed50c5e9b9b21737c9383525dbba16ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mothership-gmbh/component_base/zipball/c3963812ed50c5e9b9b21737c9383525dbba16ba", + "reference": "c3963812ed50c5e9b9b21737c9383525dbba16ba", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "symfony/console": "2.7.0" + }, + "require-dev": { + "phpunit/dbunit": "1.4.*", + "phpunit/phpunit": "4.8.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mothership\\Exception\\": "src/Mothership/Exception/", + "Mothership\\Tests\\": "src/Mothership/Tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Don Bosco van Hoi", + "email": "vanhoi@mothership.de" + }, + { + "name": "Maurizio Brioschi", + "email": "brioschi@mothership.de" + } + ], + "description": "Mothership base library", + "homepage": "https://www.mothership.de", + "time": "2016-02-01 16:52:46" + }, + { + "name": "mothership/state_machine", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/mothership-gmbh/state_machine.git", + "reference": "56e15f137338df0ce933158761bbe16b18d5b91f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mothership-gmbh/state_machine/zipball/56e15f137338df0ce933158761bbe16b18d5b91f", + "reference": "56e15f137338df0ce933158761bbe16b18d5b91f", + "shasum": "" + }, + "require": { + "mothership/component_base": "v0.2.0", + "php": ">=5.5", + "symfony/console": "2.7.*", + "symfony/yaml": "^2.7" + }, + "require-dev": { + "escapestudios/symfony2-coding-standard": "~2.0", + "phpunit/phpunit": "4.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mothership\\StateMachine\\": "src/" + }, + "exclude-from-classmap": [ + "src/Tests/", + "src/Examples/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Don Bosco van Hoi", + "email": "vanhoi@mothership.de" + }, + { + "name": "Maurizio Brioschi", + "email": "brioschi@mothership.de" + } + ], + "description": "php implementation of state machine, completely configured by an external .yml file with the render of a graph's description", + "homepage": "https://www.mothership.de", + "time": "2016-02-17 15:06:58" + }, + { + "name": "symfony/console", + "version": "v2.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "7f0bec04961c61c961df0cb8c2ae88dbfd83f399" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/7f0bec04961c61c961df0cb8c2ae88dbfd83f399", + "reference": "7f0bec04961c61c961df0cb8c2ae88dbfd83f399", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/phpunit-bridge": "~2.7", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2015-05-29 16:22:24" + }, + { + "name": "symfony/yaml", + "version": "v2.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/4a29a5248aed4fb45f626a7bbbd330291492f5c3", + "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:21:08" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14 21:17:01" + }, + { + "name": "escapestudios/symfony2-coding-standard", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/escapestudios/Symfony2-coding-standard.git", + "reference": "c91624f1bf4a5fbf6bf7c796c541f15d3763bc94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/escapestudios/Symfony2-coding-standard/zipball/c91624f1bf4a5fbf6bf7c796c541f15d3763bc94", + "reference": "c91624f1bf4a5fbf6bf7c796c541f15d3763bc94", + "shasum": "" + }, + "require": { + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "coding-standard", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David Joos", + "email": "david.joos@escapestudios.com" + }, + { + "name": "Community contributors", + "homepage": "https://github.com/escapestudios/Symfony2-coding-standard/graphs/contributors" + } + ], + "description": "CodeSniffer ruleset for the Symfony2 coding standard", + "homepage": "https://github.com/escapestudios/Symfony2-coding-standard", + "keywords": [ + "Coding Standard", + "Symfony2", + "phpcs" + ], + "time": "2016-01-22 12:43:53" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2015-02-03 12:10:50" + }, + { + "name": "phpspec/prophecy", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3c91bdf81797d725b14cb62906f9a4ce44235972", + "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "~2.0", + "sebastian/comparator": "~1.1", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpspec/phpspec": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2016-02-15 07:46:21" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "^1.3.2", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2015-10-06 15:47:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2015-06-21 13:08:43" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21 13:50:34" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2015-06-21 08:01:12" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2015-09-15 10:49:45" + }, + { + "name": "phpunit/phpunit", + "version": "4.8.23", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "6e351261f9cd33daf205a131a1ba61c6d33bd483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6e351261f9cd33daf205a131a1ba61c6d33bd483", + "reference": "6e351261f9cd33daf205a131a1ba61c6d33bd483", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "^1.3.1", + "phpunit/php-code-coverage": "~2.1", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": ">=1.0.6", + "phpunit/phpunit-mock-objects": "~2.3", + "sebastian/comparator": "~1.1", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.3", + "sebastian/exporter": "~1.2", + "sebastian/global-state": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.1|~3.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.8.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2016-02-11 14:56:33" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2015-10-02 06:51:40" + }, + { + "name": "sebastian/comparator", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2015-07-26 15:48:44" + }, + { + "name": "sebastian/diff", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2015-12-08 07:14:41" + }, + { + "name": "sebastian/environment", + "version": "1.3.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "6e7133793a8e5a5714a551a8324337374be209df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e7133793a8e5a5714a551a8324337374be209df", + "reference": "6e7133793a8e5a5714a551a8324337374be209df", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2015-12-02 08:37:27" + }, + { + "name": "sebastian/exporter", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2015-06-21 07:55:53" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2015-10-12 03:26:01" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2015-11-11 19:50:13" + }, + { + "name": "sebastian/version", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2015-06-21 13:59:46" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "2.5.1", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "6731851d6aaf1d0d6c58feff1065227b7fda3ba8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6731851d6aaf1d0d6c58feff1065227b7fda3ba8", + "reference": "6731851d6aaf1d0d6c58feff1065227b7fda3ba8", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "bin": [ + "scripts/phpcs", + "scripts/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "classmap": [ + "CodeSniffer.php", + "CodeSniffer/CLI.php", + "CodeSniffer/Exception.php", + "CodeSniffer/File.php", + "CodeSniffer/Fixer.php", + "CodeSniffer/Report.php", + "CodeSniffer/Reporting.php", + "CodeSniffer/Sniff.php", + "CodeSniffer/Tokens.php", + "CodeSniffer/Reports/", + "CodeSniffer/Tokenizers/", + "CodeSniffer/DocGenerators/", + "CodeSniffer/Standards/AbstractPatternSniff.php", + "CodeSniffer/Standards/AbstractScopeSniff.php", + "CodeSniffer/Standards/AbstractVariableSniff.php", + "CodeSniffer/Standards/IncorrectPatternException.php", + "CodeSniffer/Standards/Generic/Sniffs/", + "CodeSniffer/Standards/MySource/Sniffs/", + "CodeSniffer/Standards/PEAR/Sniffs/", + "CodeSniffer/Standards/PSR1/Sniffs/", + "CodeSniffer/Standards/PSR2/Sniffs/", + "CodeSniffer/Standards/Squiz/Sniffs/", + "CodeSniffer/Standards/Zend/Sniffs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "http://www.squizlabs.com/php-codesniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2016-01-19 23:39:10" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "firegento/psr0autoloader": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.3" + }, + "platform-dev": [] +} diff --git a/root/app/code/community/Hackathon/PSR0Autoloader b/root/app/code/community/Hackathon/PSR0Autoloader new file mode 120000 index 0000000..e8e1754 --- /dev/null +++ b/root/app/code/community/Hackathon/PSR0Autoloader @@ -0,0 +1 @@ +../../../../../vendor/firegento/psr0autoloader/app/code/community/Hackathon/PSR0Autoloader \ No newline at end of file diff --git a/root/app/etc/modules/Hackathon_PSR0Autoloader.xml b/root/app/etc/modules/Hackathon_PSR0Autoloader.xml new file mode 120000 index 0000000..dd0a674 --- /dev/null +++ b/root/app/etc/modules/Hackathon_PSR0Autoloader.xml @@ -0,0 +1 @@ +../../../../vendor/firegento/psr0autoloader/app/etc/modules/Hackathon_PSR0Autoloader.xml \ No newline at end of file diff --git a/root/shell/autoloader_initializer.php b/root/shell/autoloader_initializer.php new file mode 120000 index 0000000..b6c95f4 --- /dev/null +++ b/root/shell/autoloader_initializer.php @@ -0,0 +1 @@ +../../vendor/firegento/psr0autoloader/shell/autoloader_initializer.php \ No newline at end of file diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/AbstractMagentoPatchFactory.php b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/AbstractMagentoPatchFactory.php new file mode 100644 index 0000000..b446e01 --- /dev/null +++ b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/AbstractMagentoPatchFactory.php @@ -0,0 +1,70 @@ + + * @copyright 2016 Mothership Gmbh + * @link http://www.mothership.de/ + */ +class AbstractMagentoPatchFactory +{ + protected $magentoVersion; + protected $patchClass; + + /** + * AbstractMagentoPatchFactory constructor. + * + * @param $magentoV + */ + public function __construct($magentoV) + { + $this->magentoVersion = str_replace(".", "_", $magentoV); + } + + /** + * Set the class for the patch, all the patch must be in the subfolder patch/Magento + * The method set the patch that match with the magento version + * + * @throws \Exception + */ + protected function setPatchClass() + { + $magentoVersions = scandir(__DIR__ . '/patch/Magento'); + foreach ($magentoVersions as $dir) { + if ($dir != '.' && $dir != '..' && is_dir(__DIR__ . '/patch/Magento/' . $dir)) { + if ($dir == $this->magentoVersion) { + $this->patchClass = "MagentoPatch" . $this->magentoVersion; + } + } + } + + if (is_null($this->patchClass)) { + throw new \Exception("Patch Class for this Magento version is not found"); + } + } + + /** + * Get the class for the patch, in base of the Magento version + * + * @return Mothership\Magerun\Base\Command\Reports\PatchInterface + */ + public function getMagentoPatchClass() + { + if (is_null($this->patchClass) || !isset($this->patchClass)) { + $this->setPatchClass(); + } + + return new $this->patchClass(); + } +} diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatch1_9_2_2.php b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatch1_9_2_2.php new file mode 100644 index 0000000..84cc34e --- /dev/null +++ b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatch1_9_2_2.php @@ -0,0 +1,69 @@ + + * @copyright 2016 Mothership Gmbh + * @link http://www.mothership.de/ + */ +class MagentoPatch1_9_2_2 implements PatchInterface +{ + protected $magento_root; + protected $mage_php; //Mage.php original file from magento + protected $app_php; //App.php original file from Magento + + /** + * add the patch + * + * @param $magentoRoot + * + * @return void + */ + function addPatch($magentoRoot) + { + $this->magento_root = $magentoRoot; + + $this->mage_php = file_get_contents($this->magento_root . '/app/Mage.php'); + + $patch_mageRun = file_get_contents(dirname(__FILE__) . "/patch/observerstimes_mageRun"); + $patch_mageRunEnd = file_get_contents(dirname(__FILE__) . "/patch/observerstimes_mageRunEnd"); + + $mage_log = str_replace("Varien_Profiler::start('mage');", "Varien_Profiler::start('mage');" . $patch_mageRun, + $this->mage_php); + $mage_log = str_replace("Varien_Profiler::stop('mage');", $patch_mageRunEnd . "Varien_Profiler::stop('mage');", + $mage_log); + + file_put_contents($this->magento_root . "/app/Mage.php", $mage_log); + + $this->app_php = file_get_contents($this->magento_root . "/app/code/core/Mage/Core/Model/App.php"); + $app_log = str_replace("Varien_Profiler::start('OBSERVER: '", + "\$startime=microtime(true);Varien_Profiler::start('OBSERVER: '", $this->app_php); + + $patch_observer = file_get_contents(dirname(__FILE__) . "/patch/observerstimes_observer"); + + $app_log = str_replace("Varien_Profiler::stop('OBSERVER: '", $patch_observer . "Varien_Profiler::stop + ('OBSERVER: '", $app_log); + file_put_contents($this->magento_root . "/app/code/core/Mage/Core/Model/App.php", $app_log); + } + + /** + * remove patch + * @return void + */ + function removePatch() + { + file_put_contents($this->magento_root . "/app/Mage.php", $this->mage_php); + file_put_contents($this->magento_root . "/app/code/core/Mage/Core/Model/App.php", $this->app_php); + } +} diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatch1_9_2_3.php b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatch1_9_2_3.php new file mode 100644 index 0000000..cc44461 --- /dev/null +++ b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatch1_9_2_3.php @@ -0,0 +1,48 @@ + + * @copyright 2016 Mothership Gmbh + * @link http://www.mothership.de/ + */ +class MagentoPatch1_9_2_3 implements PatchInterface +{ + protected $magento_root; + protected $mage_php; //Mage.php original file from magento + protected $app_php; //App.php original file from Magento + + /** + * add the patch + * + * @param $magentoRoot + * + * @return void + */ + function addPatch($magentoRoot) + { + die('\nMairi'); + } + + /** + * remove patch + * @return void + */ + function removePatch() + { + file_put_contents($this->magento_root . "/app/Mage.php", $this->mage_php); + file_put_contents($this->magento_root . "/app/code/core/Mage/Core/Model/App.php", $this->app_php); + } +} diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatchFactory.php b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatchFactory.php new file mode 100644 index 0000000..c462be7 --- /dev/null +++ b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/MagentoPatchFactory.php @@ -0,0 +1,21 @@ + + * @copyright 2016 Mothership Gmbh + * @link http://www.mothership.de/ + */ +class MagentoPatchFactory extends AbstractMagentoPatchFactory +{ + +} diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/Observer.php b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/Observer.php new file mode 100644 index 0000000..3a172ca --- /dev/null +++ b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/Observer.php @@ -0,0 +1,22 @@ + + * @copyright 2016 Mothership Gmbh + * @link http://www.mothership.de/ + */ +class Observer +{ + +} diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/ObserversTimesCommand.php b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/ObserversTimesCommand.php index cd58092..9da2b16 100644 --- a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/ObserversTimesCommand.php +++ b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/ObserversTimesCommand.php @@ -7,6 +7,7 @@ */ namespace Mothership\Magerun\Base\Command\Reports; +use Mothership\Magerun\Base\Command\PatchInterface; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Input\InputOption; @@ -14,19 +15,27 @@ use \Mothership\Magerun\Base\Command\AbstractMagentoCommand; /** + * Class ObserversTimesCommand + * * This command provide methods to retrieve a csv reports with all the events and relative observers called for each * Magento page with the execution time - * @package Mothership_Addons\Reports + * + * @category Mothership + * @package Mothership_Reports + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ */ class ObserversTimesCommand extends AbstractMagentoCommand { - protected $magento_root; protected $observerlog_dir; - protected $mage_php; //Mage.php original file from magento - protected $app_php; //App.php original file from Magento protected $dateStart; protected $file_report = []; protected $timestampfile; + /** + * @var PatchInterface; + */ + protected $patch; protected $description = 'Create a csv report with the execution workflow and observers execution times'; @@ -37,11 +46,11 @@ protected function configure() { parent::configure(); $this->addOption( - 'bootleneck', - null, - InputOption::VALUE_OPTIONAL, - 'if set you have a detail analisys of the most expensive observers' - ); + 'bootleneck', + null, + InputOption::VALUE_OPTIONAL, + 'if set you have a detail analisys of the most expensive observers' + ); } /** @@ -52,10 +61,12 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { + parent::execute($input, $output); - $this->handleSygnal(); + $patchFactory = new MagentoPatchFactory(\Mage::getVersion()); + $this->patch = $patchFactory->getMagentoPatchClass(); + $this->output = $output; - $this->magento_root = $this->getApplication()->getMagentoRootFolder(); $this->observerlog_dir = $this->magento_root . "/observerlogs"; if (!file_exists($this->observerlog_dir)) { mkdir($this->observerlog_dir, 0777); @@ -69,31 +80,29 @@ protected function execute(InputInterface $input, OutputInterface $output) } $this->detectMagento($output); - if ($this->initMagento()) { - $this->output->writeln("Applying the patch..."); - $this->addPatch(); - $this->output->writeln("Start reporting..."); - $this->output->writeln("Press Ctrl+z or Ctrl+c to stop!"); - - $this->file_report = scandir($this->observerlog_dir); - $this->timestampfile = filemtime($this->observerlog_dir . '/timestamp'); - if ($bootleneck) { - while (true) { - $this->output->write("."); - $newfiles = scandir($this->observerlog_dir); - if (count($newfiles) > count($this->file_report)) { - $this->checkBootleneck($newfiles); - } - pcntl_sigtimedwait(array(SIGTERM), $info, 1); + $this->output->writeln("Applying the patch..."); + $this->patch->addPatch($this->getApplication()->getMagentoRootFolder()); + $this->output->writeln("Start reporting..."); + $this->output->writeln("Press Ctrl+z or Ctrl+c to stop!"); + + $this->file_report = scandir($this->observerlog_dir); + $this->timestampfile = filemtime($this->observerlog_dir . '/timestamp'); + if ($bootleneck) { + while (true) { + $this->output->write("."); + $newfiles = scandir($this->observerlog_dir); + if (count($newfiles) > count($this->file_report)) { + $this->checkBootleneck($newfiles); } - } else { + pcntl_sigtimedwait(array(SIGTERM), $info, 1); } - - + } else { + pcntl_sigtimedwait(array(SIGTERM), $info, 1); } + $this->output->writeln("Init Magento fail"); } @@ -104,48 +113,11 @@ protected function execute(InputInterface $input, OutputInterface $output) public function stopObserver() { $this->output->writeln("Removing patch"); - $this->removePatch(); + $this->patch->removePatch(); $this->output->writeln("Stop reporting"); exit; } - /** - * add patches - */ - protected function addPatch() - { - $this->mage_php = file_get_contents($this->magento_root . '/app/Mage.php'); - - $patch_mageRun = file_get_contents(dirname(__FILE__) . "/patch/observerstimes_mageRun"); - $patch_mageRunEnd = file_get_contents(dirname(__FILE__) . "/patch/observerstimes_mageRunEnd"); - - $mage_log = str_replace("Varien_Profiler::start('mage');", "Varien_Profiler::start('mage');" . $patch_mageRun, - $this->mage_php); - $mage_log = str_replace("Varien_Profiler::stop('mage');", $patch_mageRunEnd . "Varien_Profiler::stop('mage');", - $mage_log); - - file_put_contents($this->magento_root . "/app/Mage.php", $mage_log); - - $this->app_php = file_get_contents($this->magento_root . "/app/code/core/Mage/Core/Model/App.php"); - $app_log = str_replace("Varien_Profiler::start('OBSERVER: '", - "\$startime=microtime(true);Varien_Profiler::start('OBSERVER: '", $this->app_php); - - $patch_observer = file_get_contents(dirname(__FILE__) . "/patch/observerstimes_observer"); - - $app_log = str_replace("Varien_Profiler::stop('OBSERVER: '", $patch_observer . "Varien_Profiler::stop - ('OBSERVER: '", $app_log); - file_put_contents($this->magento_root . "/app/code/core/Mage/Core/Model/App.php", $app_log); - - } - - /** - * remove patches - */ - protected function removePatch() - { - file_put_contents($this->magento_root . "/app/Mage.php", $this->mage_php); - file_put_contents($this->magento_root . "/app/code/core/Mage/Core/Model/App.php", $this->app_php); - } /** * Analise bottleneck from all the files in the array and print the output on the terminal line diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/PatchInterface.php b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/PatchInterface.php new file mode 100644 index 0000000..1d6ca93 --- /dev/null +++ b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/PatchInterface.php @@ -0,0 +1,34 @@ + + * @copyright 2016 Mothership Gmbh + * @link http://www.mothership.de/ + */ +Interface PatchInterface +{ + /** + * add the patch + * + * @param $magentoRoot + * + * @return void + */ + function addPatch($magentoRoot); + + /** + * remove patch + * @return void + */ + function removePatch(); +} diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/observerstimes_dispatchEvent b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/Magento/1_9_2_2/observerstimes_dispatchEvent similarity index 100% rename from src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/observerstimes_dispatchEvent rename to src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/Magento/1_9_2_2/observerstimes_dispatchEvent diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/observerstimes_mageRun b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/Magento/1_9_2_2/observerstimes_mageRun similarity index 100% rename from src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/observerstimes_mageRun rename to src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/Magento/1_9_2_2/observerstimes_mageRun diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/observerstimes_mageRunEnd b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/Magento/1_9_2_2/observerstimes_mageRunEnd similarity index 100% rename from src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/observerstimes_mageRunEnd rename to src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/Magento/1_9_2_2/observerstimes_mageRunEnd diff --git a/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/observerstimes_observer b/src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/Magento/1_9_2_2/observerstimes_observer similarity index 100% rename from src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/observerstimes_observer rename to src/lib/n98-magerun/modules/mothership_addons/src/Mothership/Magerun/Base/Command/Reports/patch/Magento/1_9_2_2/observerstimes_observer diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 0000000..3d5f57e --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0 class loader + * + * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-0 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 + if ('\\' == $class[0]) { + $class = substr($class, 1); + } + + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if ($file === null && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if ($file === null) { + // Remember that this class does not exist. + return $this->classMap[$class] = false; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { + if (0 === strpos($class, $prefix)) { + foreach ($this->prefixDirsPsr4[$prefix] as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..9fb7199 --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,690 @@ + $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', + 'File_Iterator_Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', + 'File_Iterator_Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', + 'Generic_Sniffs_Arrays_DisallowLongArraySyntaxSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php', + 'Generic_Sniffs_Arrays_DisallowShortArraySyntaxSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php', + 'Generic_Sniffs_Classes_DuplicateClassNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', + 'Generic_Sniffs_CodeAnalysis_EmptyStatementSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php', + 'Generic_Sniffs_CodeAnalysis_ForLoopShouldBeWhileLoopSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php', + 'Generic_Sniffs_CodeAnalysis_ForLoopWithTestFunctionCallSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php', + 'Generic_Sniffs_CodeAnalysis_JumbledIncrementerSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php', + 'Generic_Sniffs_CodeAnalysis_UnconditionalIfStatementSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php', + 'Generic_Sniffs_CodeAnalysis_UnnecessaryFinalModifierSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php', + 'Generic_Sniffs_CodeAnalysis_UnusedFunctionParameterSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php', + 'Generic_Sniffs_CodeAnalysis_UselessOverridingMethodSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php', + 'Generic_Sniffs_Commenting_DocCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php', + 'Generic_Sniffs_Commenting_FixmeSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Commenting/FixmeSniff.php', + 'Generic_Sniffs_Commenting_TodoSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Commenting/TodoSniff.php', + 'Generic_Sniffs_ControlStructures_InlineControlStructureSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php', + 'Generic_Sniffs_Debug_CSSLintSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Debug/CSSLintSniff.php', + 'Generic_Sniffs_Debug_ClosureLinterSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php', + 'Generic_Sniffs_Debug_JSHintSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Debug/JSHintSniff.php', + 'Generic_Sniffs_Files_ByteOrderMarkSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php', + 'Generic_Sniffs_Files_EndFileNewlineSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php', + 'Generic_Sniffs_Files_EndFileNoNewlineSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php', + 'Generic_Sniffs_Files_InlineHTMLSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php', + 'Generic_Sniffs_Files_LineEndingsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LineEndingsSniff.php', + 'Generic_Sniffs_Files_LineLengthSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LineLengthSniff.php', + 'Generic_Sniffs_Files_LowercasedFilenameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php', + 'Generic_Sniffs_Files_OneClassPerFileSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php', + 'Generic_Sniffs_Files_OneInterfacePerFileSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php', + 'Generic_Sniffs_Files_OneTraitPerFileSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php', + 'Generic_Sniffs_Formatting_DisallowMultipleStatementsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php', + 'Generic_Sniffs_Formatting_MultipleStatementAlignmentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php', + 'Generic_Sniffs_Formatting_NoSpaceAfterCastSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php', + 'Generic_Sniffs_Formatting_SpaceAfterCastSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php', + 'Generic_Sniffs_Functions_CallTimePassByReferenceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php', + 'Generic_Sniffs_Functions_FunctionCallArgumentSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php', + 'Generic_Sniffs_Functions_OpeningFunctionBraceBsdAllmanSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php', + 'Generic_Sniffs_Functions_OpeningFunctionBraceKernighanRitchieSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php', + 'Generic_Sniffs_Metrics_CyclomaticComplexitySniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php', + 'Generic_Sniffs_Metrics_NestingLevelSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php', + 'Generic_Sniffs_NamingConventions_CamelCapsFunctionNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php', + 'Generic_Sniffs_NamingConventions_ConstructorNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php', + 'Generic_Sniffs_NamingConventions_UpperCaseConstantNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php', + 'Generic_Sniffs_PHP_CharacterBeforePHPOpeningTagSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php', + 'Generic_Sniffs_PHP_ClosingPHPTagSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php', + 'Generic_Sniffs_PHP_DeprecatedFunctionsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php', + 'Generic_Sniffs_PHP_DisallowShortOpenTagSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/DisallowShortOpenTagSniff.php', + 'Generic_Sniffs_PHP_ForbiddenFunctionsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/ForbiddenFunctionsSniff.php', + 'Generic_Sniffs_PHP_LowerCaseConstantSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/LowerCaseConstantSniff.php', + 'Generic_Sniffs_PHP_LowerCaseKeywordSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/LowerCaseKeywordSniff.php', + 'Generic_Sniffs_PHP_NoSilencedErrorsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/NoSilencedErrorsSniff.php', + 'Generic_Sniffs_PHP_SAPIUsageSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/SAPIUsageSniff.php', + 'Generic_Sniffs_PHP_SyntaxSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/SyntaxSniff.php', + 'Generic_Sniffs_PHP_UpperCaseConstantSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/UpperCaseConstantSniff.php', + 'Generic_Sniffs_Strings_UnnecessaryStringConcatSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Strings/UnnecessaryStringConcatSniff.php', + 'Generic_Sniffs_VersionControl_SubversionPropertiesSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/VersionControl/SubversionPropertiesSniff.php', + 'Generic_Sniffs_WhiteSpace_DisallowSpaceIndentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowSpaceIndentSniff.php', + 'Generic_Sniffs_WhiteSpace_DisallowTabIndentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php', + 'Generic_Sniffs_WhiteSpace_ScopeIndentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/ScopeIndentSniff.php', + 'MySource_Sniffs_CSS_BrowserSpecificStylesSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php', + 'MySource_Sniffs_Channels_DisallowSelfActionsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php', + 'MySource_Sniffs_Channels_IncludeOwnSystemSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php', + 'MySource_Sniffs_Channels_IncludeSystemSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php', + 'MySource_Sniffs_Channels_UnusedSystemSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php', + 'MySource_Sniffs_Commenting_FunctionCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php', + 'MySource_Sniffs_Debug_DebugCodeSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php', + 'MySource_Sniffs_Debug_FirebugConsoleSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php', + 'MySource_Sniffs_Objects_AssignThisSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Objects/AssignThisSniff.php', + 'MySource_Sniffs_Objects_CreateWidgetTypeCallbackSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php', + 'MySource_Sniffs_Objects_DisallowNewWidgetSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php', + 'MySource_Sniffs_PHP_AjaxNullComparisonSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php', + 'MySource_Sniffs_PHP_EvalObjectFactorySniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php', + 'MySource_Sniffs_PHP_GetRequestDataSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php', + 'MySource_Sniffs_PHP_ReturnFunctionValueSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php', + 'MySource_Sniffs_Strings_JoinStringsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php', + 'PEAR_Sniffs_Classes_ClassDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php', + 'PEAR_Sniffs_Commenting_ClassCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php', + 'PEAR_Sniffs_Commenting_FileCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php', + 'PEAR_Sniffs_Commenting_FunctionCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php', + 'PEAR_Sniffs_Commenting_InlineCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php', + 'PEAR_Sniffs_ControlStructures_ControlSignatureSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php', + 'PEAR_Sniffs_ControlStructures_MultiLineConditionSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php', + 'PEAR_Sniffs_Files_IncludingFileSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php', + 'PEAR_Sniffs_Formatting_MultiLineAssignmentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php', + 'PEAR_Sniffs_Functions_FunctionCallSignatureSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php', + 'PEAR_Sniffs_Functions_FunctionDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php', + 'PEAR_Sniffs_Functions_ValidDefaultValueSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php', + 'PEAR_Sniffs_NamingConventions_ValidClassNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php', + 'PEAR_Sniffs_NamingConventions_ValidFunctionNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php', + 'PEAR_Sniffs_NamingConventions_ValidVariableNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php', + 'PEAR_Sniffs_WhiteSpace_ObjectOperatorIndentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php', + 'PEAR_Sniffs_WhiteSpace_ScopeClosingBraceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php', + 'PEAR_Sniffs_WhiteSpace_ScopeIndentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php', + 'PHPUnit_Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', + 'PHPUnit_Extensions_GroupTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php', + 'PHPUnit_Extensions_PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestCase.php', + 'PHPUnit_Extensions_PhptTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php', + 'PHPUnit_Extensions_RepeatedTest' => $vendorDir . '/phpunit/phpunit/src/Extensions/RepeatedTest.php', + 'PHPUnit_Extensions_TestDecorator' => $vendorDir . '/phpunit/phpunit/src/Extensions/TestDecorator.php', + 'PHPUnit_Extensions_TicketListener' => $vendorDir . '/phpunit/phpunit/src/Extensions/TicketListener.php', + 'PHPUnit_Framework_Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', + 'PHPUnit_Framework_AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/AssertionFailedError.php', + 'PHPUnit_Framework_BaseTestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/BaseTestListener.php', + 'PHPUnit_Framework_CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/CodeCoverageException.php', + 'PHPUnit_Framework_Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint.php', + 'PHPUnit_Framework_Constraint_And' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/And.php', + 'PHPUnit_Framework_Constraint_ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', + 'PHPUnit_Framework_Constraint_ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', + 'PHPUnit_Framework_Constraint_Attribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', + 'PHPUnit_Framework_Constraint_Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', + 'PHPUnit_Framework_Constraint_ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', + 'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', + 'PHPUnit_Framework_Constraint_Composite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', + 'PHPUnit_Framework_Constraint_Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Count.php', + 'PHPUnit_Framework_Constraint_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', + 'PHPUnit_Framework_Constraint_ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', + 'PHPUnit_Framework_Constraint_ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', + 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php', + 'PHPUnit_Framework_Constraint_FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', + 'PHPUnit_Framework_Constraint_GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', + 'PHPUnit_Framework_Constraint_IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', + 'PHPUnit_Framework_Constraint_IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', + 'PHPUnit_Framework_Constraint_IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', + 'PHPUnit_Framework_Constraint_IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', + 'PHPUnit_Framework_Constraint_IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', + 'PHPUnit_Framework_Constraint_IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', + 'PHPUnit_Framework_Constraint_IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', + 'PHPUnit_Framework_Constraint_IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', + 'PHPUnit_Framework_Constraint_IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', + 'PHPUnit_Framework_Constraint_IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', + 'PHPUnit_Framework_Constraint_JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', + 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php', + 'PHPUnit_Framework_Constraint_LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', + 'PHPUnit_Framework_Constraint_Not' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Not.php', + 'PHPUnit_Framework_Constraint_ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', + 'PHPUnit_Framework_Constraint_Or' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Or.php', + 'PHPUnit_Framework_Constraint_PCREMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php', + 'PHPUnit_Framework_Constraint_SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', + 'PHPUnit_Framework_Constraint_StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', + 'PHPUnit_Framework_Constraint_StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', + 'PHPUnit_Framework_Constraint_StringMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php', + 'PHPUnit_Framework_Constraint_StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', + 'PHPUnit_Framework_Constraint_TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', + 'PHPUnit_Framework_Constraint_TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', + 'PHPUnit_Framework_Constraint_Xor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Xor.php', + 'PHPUnit_Framework_Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error.php', + 'PHPUnit_Framework_Error_Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', + 'PHPUnit_Framework_Error_Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php', + 'PHPUnit_Framework_Error_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php', + 'PHPUnit_Framework_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception.php', + 'PHPUnit_Framework_ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', + 'PHPUnit_Framework_ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php', + 'PHPUnit_Framework_IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php', + 'PHPUnit_Framework_IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', + 'PHPUnit_Framework_IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestError.php', + 'PHPUnit_Framework_InvalidCoversTargetError' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetError.php', + 'PHPUnit_Framework_InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php', + 'PHPUnit_Framework_MockObject_BadMethodCallException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php', + 'PHPUnit_Framework_MockObject_Builder_Identity' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php', + 'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php', + 'PHPUnit_Framework_MockObject_Builder_Match' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php', + 'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php', + 'PHPUnit_Framework_MockObject_Builder_Namespace' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php', + 'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php', + 'PHPUnit_Framework_MockObject_Builder_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php', + 'PHPUnit_Framework_MockObject_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php', + 'PHPUnit_Framework_MockObject_Generator' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php', + 'PHPUnit_Framework_MockObject_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php', + 'PHPUnit_Framework_MockObject_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php', + 'PHPUnit_Framework_MockObject_Invocation_Object' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php', + 'PHPUnit_Framework_MockObject_Invocation_Static' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php', + 'PHPUnit_Framework_MockObject_Invokable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php', + 'PHPUnit_Framework_MockObject_Matcher' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php', + 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php', + 'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php', + 'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php', + 'PHPUnit_Framework_MockObject_Matcher_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php', + 'PHPUnit_Framework_MockObject_Matcher_MethodName' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php', + 'PHPUnit_Framework_MockObject_Matcher_Parameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php', + 'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php', + 'PHPUnit_Framework_MockObject_MockBuilder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php', + 'PHPUnit_Framework_MockObject_MockObject' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php', + 'PHPUnit_Framework_MockObject_RuntimeException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php', + 'PHPUnit_Framework_MockObject_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php', + 'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php', + 'PHPUnit_Framework_MockObject_Stub_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php', + 'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php', + 'PHPUnit_Framework_MockObject_Stub_Return' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php', + 'PHPUnit_Framework_MockObject_Verifiable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php', + 'PHPUnit_Framework_OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/OutputError.php', + 'PHPUnit_Framework_RiskyTest' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTest.php', + 'PHPUnit_Framework_RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTestError.php', + 'PHPUnit_Framework_SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', + 'PHPUnit_Framework_SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php', + 'PHPUnit_Framework_SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', + 'PHPUnit_Framework_SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestError.php', + 'PHPUnit_Framework_SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php', + 'PHPUnit_Framework_SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/SyntheticError.php', + 'PHPUnit_Framework_Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php', + 'PHPUnit_Framework_TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php', + 'PHPUnit_Framework_TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php', + 'PHPUnit_Framework_TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php', + 'PHPUnit_Framework_TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php', + 'PHPUnit_Framework_TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php', + 'PHPUnit_Framework_TestSuite_DataProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php', + 'PHPUnit_Framework_UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php', + 'PHPUnit_Framework_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Warning.php', + 'PHPUnit_Runner_BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', + 'PHPUnit_Runner_Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php', + 'PHPUnit_Runner_Filter_Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', + 'PHPUnit_Runner_Filter_GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group.php', + 'PHPUnit_Runner_Filter_Group_Exclude' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php', + 'PHPUnit_Runner_Filter_Group_Include' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php', + 'PHPUnit_Runner_Filter_Test' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Test.php', + 'PHPUnit_Runner_StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', + 'PHPUnit_Runner_TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', + 'PHPUnit_Runner_Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', + 'PHPUnit_TextUI_Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php', + 'PHPUnit_TextUI_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', + 'PHPUnit_TextUI_TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php', + 'PHPUnit_Util_Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php', + 'PHPUnit_Util_Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php', + 'PHPUnit_Util_ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', + 'PHPUnit_Util_Fileloader' => $vendorDir . '/phpunit/phpunit/src/Util/Fileloader.php', + 'PHPUnit_Util_Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', + 'PHPUnit_Util_Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', + 'PHPUnit_Util_Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php', + 'PHPUnit_Util_GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', + 'PHPUnit_Util_InvalidArgumentHelper' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php', + 'PHPUnit_Util_Log_JSON' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JSON.php', + 'PHPUnit_Util_Log_JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php', + 'PHPUnit_Util_Log_TAP' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TAP.php', + 'PHPUnit_Util_PHP' => $vendorDir . '/phpunit/phpunit/src/Util/PHP.php', + 'PHPUnit_Util_PHP_Default' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Default.php', + 'PHPUnit_Util_PHP_Windows' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Windows.php', + 'PHPUnit_Util_Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', + 'PHPUnit_Util_Regex' => $vendorDir . '/phpunit/phpunit/src/Util/Regex.php', + 'PHPUnit_Util_String' => $vendorDir . '/phpunit/phpunit/src/Util/String.php', + 'PHPUnit_Util_Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', + 'PHPUnit_Util_TestDox_NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', + 'PHPUnit_Util_TestDox_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', + 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php', + 'PHPUnit_Util_TestDox_ResultPrinter_Text' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php', + 'PHPUnit_Util_TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Util/TestSuiteIterator.php', + 'PHPUnit_Util_Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php', + 'PHPUnit_Util_XML' => $vendorDir . '/phpunit/phpunit/src/Util/XML.php', + 'PHP_CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', + 'PHP_CodeCoverage_Driver' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver.php', + 'PHP_CodeCoverage_Driver_HHVM' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/HHVM.php', + 'PHP_CodeCoverage_Driver_PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php', + 'PHP_CodeCoverage_Driver_Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/Xdebug.php', + 'PHP_CodeCoverage_Exception' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Exception.php', + 'PHP_CodeCoverage_Exception_UnintentionallyCoveredCode' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php', + 'PHP_CodeCoverage_Filter' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Filter.php', + 'PHP_CodeCoverage_Report_Clover' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Clover.php', + 'PHP_CodeCoverage_Report_Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Crap4j.php', + 'PHP_CodeCoverage_Report_Factory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php', + 'PHP_CodeCoverage_Report_HTML' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php', + 'PHP_CodeCoverage_Report_HTML_Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer.php', + 'PHP_CodeCoverage_Report_HTML_Renderer_Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php', + 'PHP_CodeCoverage_Report_HTML_Renderer_Directory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Directory.php', + 'PHP_CodeCoverage_Report_HTML_Renderer_File' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/File.php', + 'PHP_CodeCoverage_Report_Node' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node.php', + 'PHP_CodeCoverage_Report_Node_Directory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Directory.php', + 'PHP_CodeCoverage_Report_Node_File' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/File.php', + 'PHP_CodeCoverage_Report_Node_Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Iterator.php', + 'PHP_CodeCoverage_Report_PHP' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/PHP.php', + 'PHP_CodeCoverage_Report_Text' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Text.php', + 'PHP_CodeCoverage_Report_XML' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML.php', + 'PHP_CodeCoverage_Report_XML_Directory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Directory.php', + 'PHP_CodeCoverage_Report_XML_File' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File.php', + 'PHP_CodeCoverage_Report_XML_File_Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Coverage.php', + 'PHP_CodeCoverage_Report_XML_File_Method' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Method.php', + 'PHP_CodeCoverage_Report_XML_File_Report' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Report.php', + 'PHP_CodeCoverage_Report_XML_File_Unit' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Unit.php', + 'PHP_CodeCoverage_Report_XML_Node' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Node.php', + 'PHP_CodeCoverage_Report_XML_Project' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Project.php', + 'PHP_CodeCoverage_Report_XML_Tests' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Tests.php', + 'PHP_CodeCoverage_Report_XML_Totals' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Totals.php', + 'PHP_CodeCoverage_Util' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Util.php', + 'PHP_CodeCoverage_Util_InvalidArgumentHelper' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Util/InvalidArgumentHelper.php', + 'PHP_CodeSniffer' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer.php', + 'PHP_CodeSniffer_CLI' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/CLI.php', + 'PHP_CodeSniffer_DocGenerators_Generator' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/Generator.php', + 'PHP_CodeSniffer_DocGenerators_HTML' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/HTML.php', + 'PHP_CodeSniffer_DocGenerators_Markdown' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/Markdown.php', + 'PHP_CodeSniffer_DocGenerators_Text' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/Text.php', + 'PHP_CodeSniffer_Exception' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Exception.php', + 'PHP_CodeSniffer_File' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/File.php', + 'PHP_CodeSniffer_Fixer' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Fixer.php', + 'PHP_CodeSniffer_Report' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Report.php', + 'PHP_CodeSniffer_Reporting' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reporting.php', + 'PHP_CodeSniffer_Reports_Cbf' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Cbf.php', + 'PHP_CodeSniffer_Reports_Checkstyle' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Checkstyle.php', + 'PHP_CodeSniffer_Reports_Csv' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Csv.php', + 'PHP_CodeSniffer_Reports_Diff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Diff.php', + 'PHP_CodeSniffer_Reports_Emacs' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Emacs.php', + 'PHP_CodeSniffer_Reports_Full' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Full.php', + 'PHP_CodeSniffer_Reports_Gitblame' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Gitblame.php', + 'PHP_CodeSniffer_Reports_Hgblame' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Hgblame.php', + 'PHP_CodeSniffer_Reports_Info' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Info.php', + 'PHP_CodeSniffer_Reports_Json' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Json.php', + 'PHP_CodeSniffer_Reports_Junit' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Junit.php', + 'PHP_CodeSniffer_Reports_Notifysend' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Notifysend.php', + 'PHP_CodeSniffer_Reports_Source' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Source.php', + 'PHP_CodeSniffer_Reports_Summary' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Summary.php', + 'PHP_CodeSniffer_Reports_Svnblame' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Svnblame.php', + 'PHP_CodeSniffer_Reports_VersionControl' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/VersionControl.php', + 'PHP_CodeSniffer_Reports_Xml' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Xml.php', + 'PHP_CodeSniffer_Sniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Sniff.php', + 'PHP_CodeSniffer_Standards_AbstractPatternSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/AbstractPatternSniff.php', + 'PHP_CodeSniffer_Standards_AbstractScopeSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/AbstractScopeSniff.php', + 'PHP_CodeSniffer_Standards_AbstractVariableSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/AbstractVariableSniff.php', + 'PHP_CodeSniffer_Standards_IncorrectPatternException' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/IncorrectPatternException.php', + 'PHP_CodeSniffer_Tokenizers_CSS' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/CSS.php', + 'PHP_CodeSniffer_Tokenizers_Comment' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/Comment.php', + 'PHP_CodeSniffer_Tokenizers_JS' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/JS.php', + 'PHP_CodeSniffer_Tokenizers_PHP' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/PHP.php', + 'PHP_CodeSniffer_Tokens' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Tokens.php', + 'PHP_Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', + 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ABSTRACT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AMPERSAND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AND_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ASYNC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AWAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOL_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BREAK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CALLABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CARET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CASE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CATCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_NAME_CONSTANT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLONE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COALESCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMPILER_HALT_OFFSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONTINUE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CURLY_OPEN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEFAULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOC_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_QUOTES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELLIPSIS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSEIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EMPTY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENCAPSED_AND_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDDECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENUM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EQUALS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXTENDS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINALLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNC_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GLOBAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GOTO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INLINE_HTML' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTANCEOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTEADOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INTERFACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ISSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_GREATER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_JOIN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LAMBDA_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LAMBDA_CP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LAMBDA_OP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_XOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_METHOD_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MOD_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MUL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NAMESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ONUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG_WITH_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PERCENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PIPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRINT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRIVATE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PROTECTED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PUBLIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_QUESTION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SHAPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_START_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STATIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php', + 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', + 'PHP_Token_THROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TILDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TYPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TYPELIST_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TYPELIST_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHERE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_ATTRIBUTE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_CATEGORY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_CATEGORY_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_CHILDREN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_REQUIRED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_TAG_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_TAG_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_TEXT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PSR1_Sniffs_Classes_ClassDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php', + 'PSR1_Sniffs_Files_SideEffectsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php', + 'PSR1_Sniffs_Methods_CamelCapsMethodNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php', + 'PSR2_Sniffs_Classes_ClassDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php', + 'PSR2_Sniffs_Classes_PropertyDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php', + 'PSR2_Sniffs_ControlStructures_ControlStructureSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php', + 'PSR2_Sniffs_ControlStructures_ElseIfDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php', + 'PSR2_Sniffs_ControlStructures_SwitchDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php', + 'PSR2_Sniffs_Files_ClosingTagSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php', + 'PSR2_Sniffs_Files_EndFileNewlineSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php', + 'PSR2_Sniffs_Methods_FunctionCallSignatureSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php', + 'PSR2_Sniffs_Methods_MethodDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php', + 'PSR2_Sniffs_Namespaces_NamespaceDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php', + 'PSR2_Sniffs_Namespaces_UseDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php', + 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php', + 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php', + 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php', + 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php', + 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php', + 'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php', + 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php', + 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php', + 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php', + 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php', + 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php', + 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php', + 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php', + 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', + 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', + 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', + 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', + 'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => $vendorDir . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php', + 'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php', + 'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php', + 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', + 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', + 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php', + 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', + 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', + 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php', + 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', + 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/Exception.php', + 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php', + 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/RuntimeException.php', + 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php', + 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php', + 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php', + 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php', + 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', + 'Squiz_Sniffs_Arrays_ArrayBracketSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php', + 'Squiz_Sniffs_Arrays_ArrayDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php', + 'Squiz_Sniffs_CSS_ClassDefinitionClosingBraceSpaceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php', + 'Squiz_Sniffs_CSS_ClassDefinitionNameSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php', + 'Squiz_Sniffs_CSS_ClassDefinitionOpeningBraceSpaceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php', + 'Squiz_Sniffs_CSS_ColonSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php', + 'Squiz_Sniffs_CSS_ColourDefinitionSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php', + 'Squiz_Sniffs_CSS_DisallowMultipleStyleDefinitionsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php', + 'Squiz_Sniffs_CSS_DuplicateClassDefinitionSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php', + 'Squiz_Sniffs_CSS_DuplicateStyleDefinitionSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php', + 'Squiz_Sniffs_CSS_EmptyClassDefinitionSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php', + 'Squiz_Sniffs_CSS_EmptyStyleDefinitionSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php', + 'Squiz_Sniffs_CSS_ForbiddenStylesSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php', + 'Squiz_Sniffs_CSS_IndentationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/IndentationSniff.php', + 'Squiz_Sniffs_CSS_LowercaseStyleDefinitionSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php', + 'Squiz_Sniffs_CSS_MissingColonSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php', + 'Squiz_Sniffs_CSS_NamedColoursSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php', + 'Squiz_Sniffs_CSS_OpacitySniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/OpacitySniff.php', + 'Squiz_Sniffs_CSS_SemicolonSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php', + 'Squiz_Sniffs_CSS_ShorthandSizeSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php', + 'Squiz_Sniffs_Classes_ClassDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php', + 'Squiz_Sniffs_Classes_ClassFileNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php', + 'Squiz_Sniffs_Classes_DuplicatePropertySniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php', + 'Squiz_Sniffs_Classes_LowercaseClassKeywordsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php', + 'Squiz_Sniffs_Classes_SelfMemberReferenceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php', + 'Squiz_Sniffs_Classes_ValidClassNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php', + 'Squiz_Sniffs_Commenting_BlockCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php', + 'Squiz_Sniffs_Commenting_ClassCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php', + 'Squiz_Sniffs_Commenting_ClosingDeclarationCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php', + 'Squiz_Sniffs_Commenting_DocCommentAlignmentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php', + 'Squiz_Sniffs_Commenting_EmptyCatchCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php', + 'Squiz_Sniffs_Commenting_FileCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php', + 'Squiz_Sniffs_Commenting_FunctionCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php', + 'Squiz_Sniffs_Commenting_FunctionCommentThrowTagSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php', + 'Squiz_Sniffs_Commenting_InlineCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php', + 'Squiz_Sniffs_Commenting_LongConditionClosingCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php', + 'Squiz_Sniffs_Commenting_PostStatementCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php', + 'Squiz_Sniffs_Commenting_VariableCommentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php', + 'Squiz_Sniffs_ControlStructures_ControlSignatureSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php', + 'Squiz_Sniffs_ControlStructures_ElseIfDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php', + 'Squiz_Sniffs_ControlStructures_ForEachLoopDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php', + 'Squiz_Sniffs_ControlStructures_ForLoopDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php', + 'Squiz_Sniffs_ControlStructures_InlineIfDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php', + 'Squiz_Sniffs_ControlStructures_LowercaseDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php', + 'Squiz_Sniffs_ControlStructures_SwitchDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php', + 'Squiz_Sniffs_Debug_JSLintSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Debug/JSLintSniff.php', + 'Squiz_Sniffs_Debug_JavaScriptLintSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php', + 'Squiz_Sniffs_Files_FileExtensionSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php', + 'Squiz_Sniffs_Formatting_OperatorBracketSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php', + 'Squiz_Sniffs_Functions_FunctionDeclarationArgumentSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php', + 'Squiz_Sniffs_Functions_FunctionDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php', + 'Squiz_Sniffs_Functions_FunctionDuplicateArgumentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php', + 'Squiz_Sniffs_Functions_GlobalFunctionSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php', + 'Squiz_Sniffs_Functions_LowercaseFunctionKeywordsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php', + 'Squiz_Sniffs_Functions_MultiLineFunctionDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php', + 'Squiz_Sniffs_NamingConventions_ValidFunctionNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php', + 'Squiz_Sniffs_NamingConventions_ValidVariableNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php', + 'Squiz_Sniffs_Objects_DisallowObjectStringIndexSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php', + 'Squiz_Sniffs_Objects_ObjectInstantiationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php', + 'Squiz_Sniffs_Objects_ObjectMemberCommaSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php', + 'Squiz_Sniffs_Operators_ComparisonOperatorUsageSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php', + 'Squiz_Sniffs_Operators_IncrementDecrementUsageSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php', + 'Squiz_Sniffs_Operators_ValidLogicalOperatorsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php', + 'Squiz_Sniffs_PHP_CommentedOutCodeSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php', + 'Squiz_Sniffs_PHP_DisallowBooleanStatementSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php', + 'Squiz_Sniffs_PHP_DisallowComparisonAssignmentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php', + 'Squiz_Sniffs_PHP_DisallowInlineIfSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php', + 'Squiz_Sniffs_PHP_DisallowMultipleAssignmentsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php', + 'Squiz_Sniffs_PHP_DisallowObEndFlushSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowObEndFlushSniff.php', + 'Squiz_Sniffs_PHP_DisallowSizeFunctionsInLoopsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php', + 'Squiz_Sniffs_PHP_DiscouragedFunctionsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php', + 'Squiz_Sniffs_PHP_EmbeddedPhpSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php', + 'Squiz_Sniffs_PHP_EvalSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/EvalSniff.php', + 'Squiz_Sniffs_PHP_ForbiddenFunctionsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/ForbiddenFunctionsSniff.php', + 'Squiz_Sniffs_PHP_GlobalKeywordSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php', + 'Squiz_Sniffs_PHP_HeredocSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/HeredocSniff.php', + 'Squiz_Sniffs_PHP_InnerFunctionsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php', + 'Squiz_Sniffs_PHP_LowercasePHPFunctionsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php', + 'Squiz_Sniffs_PHP_NonExecutableCodeSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php', + 'Squiz_Sniffs_Scope_MemberVarScopeSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php', + 'Squiz_Sniffs_Scope_MethodScopeSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php', + 'Squiz_Sniffs_Scope_StaticThisUsageSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php', + 'Squiz_Sniffs_Strings_ConcatenationSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php', + 'Squiz_Sniffs_Strings_DoubleQuoteUsageSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php', + 'Squiz_Sniffs_Strings_EchoedStringsSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php', + 'Squiz_Sniffs_WhiteSpace_CastSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_ControlStructureSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_FunctionClosingBraceSpaceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php', + 'Squiz_Sniffs_WhiteSpace_FunctionOpeningBraceSpaceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php', + 'Squiz_Sniffs_WhiteSpace_FunctionSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_LanguageConstructSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_LogicalOperatorSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_MemberVarSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_ObjectOperatorSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_PropertyLabelSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_ScopeClosingBraceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php', + 'Squiz_Sniffs_WhiteSpace_ScopeKeywordSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_SemicolonSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_SuperfluousWhitespaceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php', + 'Text_Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php', + 'Zend_Sniffs_Debug_CodeAnalyzerSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php', + 'Zend_Sniffs_Files_ClosingTagSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Sniffs/Files/ClosingTagSniff.php', + 'Zend_Sniffs_NamingConventions_ValidVariableNameSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php', +); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..845b838 --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,14 @@ + array($vendorDir . '/phpdocumentor/reflection-docblock/src'), + 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'), + 'MagentoHackathon\\Composer' => array($vendorDir . '/magento-hackathon/magento-composer-installer/src'), + 'Eloquent\\Pops' => array($vendorDir . '/eloquent/pops/src'), + 'Eloquent\\Liberator' => array($vendorDir . '/eloquent/liberator/src'), +); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php new file mode 100644 index 0000000..df8705a --- /dev/null +++ b/vendor/composer/autoload_psr4.php @@ -0,0 +1,20 @@ + array($vendorDir . '/symfony/yaml'), + 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), + 'Mothership\\Tests\\' => array($vendorDir . '/mothership/component_base/src/Mothership/Tests'), + 'Mothership\\StateMachine\\' => array($vendorDir . '/mothership/state_machine/src'), + 'Mothership\\Magerun\\' => array($baseDir . '/www/lib/Mothership/Magerun'), + 'Mothership\\Exception\\' => array($vendorDir . '/mothership/component_base/src/Mothership/Exception'), + 'JsonSchema\\' => array($vendorDir . '/justinrainbow/json-schema/src/JsonSchema'), + 'Icecave\\Isolator\\' => array($vendorDir . '/icecave/isolator/src'), + 'Eloquent\\Enumeration\\' => array($vendorDir . '/eloquent/enumeration/src'), + 'Eloquent\\Composer\\Configuration\\' => array($vendorDir . '/eloquent/composer-config-reader/src'), + 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 0000000..060e924 --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,50 @@ + $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + + $loader->register(true); + + return $loader; + } +} + +function composerRequirec2932a38526429fe7d81a7bf3fd93d0e($file) +{ + require $file; +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 0000000..0569b72 --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,1747 @@ +[ + { + "name": "firegento/psr0autoloader", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://github.com/magento-hackathon/Magento-PSR-0-Autoloader.git", + "reference": "c5e913c72b856471086a25acb3b5593bbef220f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento-hackathon/Magento-PSR-0-Autoloader/zipball/c5e913c72b856471086a25acb3b5593bbef220f1", + "reference": "c5e913c72b856471086a25acb3b5593bbef220f1", + "shasum": "" + }, + "require-dev": { + "firegento/mage-ci": "master-dev", + "phpunit/phpunit": "~4.4" + }, + "time": "2015-05-21 19:57:51", + "type": "magento-module", + "extra": { + "magento-root-dir": "test-root" + }, + "installation-source": "source", + "authors": [ + { + "name": "Michael Ryvlin" + }, + { + "name": "Damian Luszczymak" + } + ], + "description": "This extension adds a PSR-0 autoloader before the Varien autoloader", + "support": { + "source": "https://github.com/magento-hackathon/Magento-PSR-0-Autoloader/tree/master", + "issues": "https://github.com/magento-hackathon/Magento-PSR-0-Autoloader/issues" + } + }, + { + "name": "symfony/console", + "version": "v2.7.0", + "version_normalized": "2.7.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "7f0bec04961c61c961df0cb8c2ae88dbfd83f399" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/7f0bec04961c61c961df0cb8c2ae88dbfd83f399", + "reference": "7f0bec04961c61c961df0cb8c2ae88dbfd83f399", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/phpunit-bridge": "~2.7", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "time": "2015-05-29 16:22:24", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com" + }, + { + "name": "mothership/component_base", + "version": "v0.2.0", + "version_normalized": "0.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/mothership-gmbh/component_base.git", + "reference": "c3963812ed50c5e9b9b21737c9383525dbba16ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mothership-gmbh/component_base/zipball/c3963812ed50c5e9b9b21737c9383525dbba16ba", + "reference": "c3963812ed50c5e9b9b21737c9383525dbba16ba", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "symfony/console": "2.7.0" + }, + "require-dev": { + "phpunit/dbunit": "1.4.*", + "phpunit/phpunit": "4.8.*" + }, + "time": "2016-02-01 16:52:46", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Mothership\\Exception\\": "src/Mothership/Exception/", + "Mothership\\Tests\\": "src/Mothership/Tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Don Bosco van Hoi", + "email": "vanhoi@mothership.de" + }, + { + "name": "Maurizio Brioschi", + "email": "brioschi@mothership.de" + } + ], + "description": "Mothership base library", + "homepage": "https://www.mothership.de" + }, + { + "name": "symfony/yaml", + "version": "v2.7.0", + "version_normalized": "2.7.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/4a29a5248aed4fb45f626a7bbbd330291492f5c3", + "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "time": "2015-05-02 15:21:08", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com" + }, + { + "name": "mothership/state_machine", + "version": "v1.0.3", + "version_normalized": "1.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/mothership-gmbh/state_machine.git", + "reference": "56e15f137338df0ce933158761bbe16b18d5b91f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mothership-gmbh/state_machine/zipball/56e15f137338df0ce933158761bbe16b18d5b91f", + "reference": "56e15f137338df0ce933158761bbe16b18d5b91f", + "shasum": "" + }, + "require": { + "mothership/component_base": "v0.2.0", + "php": ">=5.5", + "symfony/console": "2.7.*", + "symfony/yaml": "^2.7" + }, + "require-dev": { + "escapestudios/symfony2-coding-standard": "~2.0", + "phpunit/phpunit": "4.8" + }, + "time": "2016-02-17 15:06:58", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Mothership\\StateMachine\\": "src/" + }, + "exclude-from-classmap": [ + "src/Tests/", + "src/Examples/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Don Bosco van Hoi", + "email": "vanhoi@mothership.de" + }, + { + "name": "Maurizio Brioschi", + "email": "brioschi@mothership.de" + } + ], + "description": "php implementation of state machine, completely configured by an external .yml file with the render of a graph's description", + "homepage": "https://www.mothership.de" + }, + { + "name": "sebastian/version", + "version": "1.0.6", + "version_normalized": "1.0.6.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "shasum": "" + }, + "time": "2015-06-21 13:59:46", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "version_normalized": "1.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "time": "2015-10-12 03:26:01", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ] + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.2", + "version_normalized": "1.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "time": "2015-11-11 19:50:13", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context" + }, + { + "name": "sebastian/exporter", + "version": "1.2.1", + "version_normalized": "1.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "time": "2015-06-21 07:55:53", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ] + }, + { + "name": "sebastian/environment", + "version": "1.3.3", + "version_normalized": "1.3.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "6e7133793a8e5a5714a551a8324337374be209df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e7133793a8e5a5714a551a8324337374be209df", + "reference": "6e7133793a8e5a5714a551a8324337374be209df", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "time": "2015-12-02 08:37:27", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ] + }, + { + "name": "sebastian/diff", + "version": "1.4.1", + "version_normalized": "1.4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "time": "2015-12-08 07:14:41", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ] + }, + { + "name": "sebastian/comparator", + "version": "1.2.0", + "version_normalized": "1.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "time": "2015-07-26 15:48:44", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ] + }, + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "version_normalized": "1.0.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "time": "2015-06-14 21:17:01", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ] + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.4", + "version_normalized": "2.0.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "time": "2015-02-03 12:10:50", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ] + }, + { + "name": "phpspec/prophecy", + "version": "v1.6.0", + "version_normalized": "1.6.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3c91bdf81797d725b14cb62906f9a4ce44235972", + "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "~2.0", + "sebastian/comparator": "~1.1", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpspec/phpspec": "~2.0" + }, + "time": "2016-02-15 07:46:21", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ] + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "version_normalized": "1.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2015-06-21 13:50:34", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ] + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.8", + "version_normalized": "2.3.8.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "time": "2015-10-02 06:51:40", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ] + }, + { + "name": "phpunit/php-timer", + "version": "1.0.7", + "version_normalized": "1.0.7.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2015-06-21 08:01:12", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ] + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.8", + "version_normalized": "1.4.8.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "time": "2015-09-15 10:49:45", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ] + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.1", + "version_normalized": "1.4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2015-06-21 13:08:43", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ] + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.2.4", + "version_normalized": "2.2.4.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "^1.3.2", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "time": "2015-10-06 15:47:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ] + }, + { + "name": "phpunit/phpunit", + "version": "4.8.23", + "version_normalized": "4.8.23.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "6e351261f9cd33daf205a131a1ba61c6d33bd483" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6e351261f9cd33daf205a131a1ba61c6d33bd483", + "reference": "6e351261f9cd33daf205a131a1ba61c6d33bd483", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "^1.3.1", + "phpunit/php-code-coverage": "~2.1", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": ">=1.0.6", + "phpunit/phpunit-mock-objects": "~2.3", + "sebastian/comparator": "~1.1", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.3", + "sebastian/exporter": "~1.2", + "sebastian/global-state": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.1|~3.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "time": "2016-02-11 14:56:33", + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.8.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ] + }, + { + "name": "squizlabs/php_codesniffer", + "version": "2.5.1", + "version_normalized": "2.5.1.0", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "6731851d6aaf1d0d6c58feff1065227b7fda3ba8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6731851d6aaf1d0d6c58feff1065227b7fda3ba8", + "reference": "6731851d6aaf1d0d6c58feff1065227b7fda3ba8", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2016-01-19 23:39:10", + "bin": [ + "scripts/phpcs", + "scripts/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "CodeSniffer.php", + "CodeSniffer/CLI.php", + "CodeSniffer/Exception.php", + "CodeSniffer/File.php", + "CodeSniffer/Fixer.php", + "CodeSniffer/Report.php", + "CodeSniffer/Reporting.php", + "CodeSniffer/Sniff.php", + "CodeSniffer/Tokens.php", + "CodeSniffer/Reports/", + "CodeSniffer/Tokenizers/", + "CodeSniffer/DocGenerators/", + "CodeSniffer/Standards/AbstractPatternSniff.php", + "CodeSniffer/Standards/AbstractScopeSniff.php", + "CodeSniffer/Standards/AbstractVariableSniff.php", + "CodeSniffer/Standards/IncorrectPatternException.php", + "CodeSniffer/Standards/Generic/Sniffs/", + "CodeSniffer/Standards/MySource/Sniffs/", + "CodeSniffer/Standards/PEAR/Sniffs/", + "CodeSniffer/Standards/PSR1/Sniffs/", + "CodeSniffer/Standards/PSR2/Sniffs/", + "CodeSniffer/Standards/Squiz/Sniffs/", + "CodeSniffer/Standards/Zend/Sniffs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "http://www.squizlabs.com/php-codesniffer", + "keywords": [ + "phpcs", + "standards" + ] + }, + { + "name": "escapestudios/symfony2-coding-standard", + "version": "2.9.0", + "version_normalized": "2.9.0.0", + "source": { + "type": "git", + "url": "https://github.com/escapestudios/Symfony2-coding-standard.git", + "reference": "c91624f1bf4a5fbf6bf7c796c541f15d3763bc94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/escapestudios/Symfony2-coding-standard/zipball/c91624f1bf4a5fbf6bf7c796c541f15d3763bc94", + "reference": "c91624f1bf4a5fbf6bf7c796c541f15d3763bc94", + "shasum": "" + }, + "require": { + "squizlabs/php_codesniffer": "~2.0" + }, + "time": "2016-01-22 12:43:53", + "type": "coding-standard", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David Joos", + "email": "david.joos@escapestudios.com" + }, + { + "name": "Community contributors", + "homepage": "https://github.com/escapestudios/Symfony2-coding-standard/graphs/contributors" + } + ], + "description": "CodeSniffer ruleset for the Symfony2 coding standard", + "homepage": "https://github.com/escapestudios/Symfony2-coding-standard", + "keywords": [ + "Coding Standard", + "Symfony2", + "phpcs" + ] + }, + { + "name": "justinrainbow/json-schema", + "version": "1.6.1", + "version_normalized": "1.6.1.0", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/cc84765fb7317f6b07bd8ac78364747f95b86341", + "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341", + "shasum": "" + }, + "require": { + "php": ">=5.3.29" + }, + "require-dev": { + "json-schema/json-schema-test-suite": "1.1.0", + "phpdocumentor/phpdocumentor": "~2", + "phpunit/phpunit": "~3.7" + }, + "time": "2016-01-25 15:43:01", + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ] + }, + { + "name": "icecave/isolator", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/IcecaveStudios/isolator.git", + "reference": "97c51fafa39c57a8f1a31f978a48fbe6cea4a5d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/IcecaveStudios/isolator/zipball/97c51fafa39c57a8f1a31f978a48fbe6cea4a5d5", + "reference": "97c51fafa39c57a8f1a31f978a48fbe6cea4a5d5", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "icecave/archer": "~1" + }, + "suggest": { + "eloquent/asplode": "Drop-in exception-based error handling." + }, + "time": "2014-08-12 03:16:11", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Icecave\\Isolator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "James Harris", + "email": "james.harris@icecave.com.au", + "homepage": "https://github.com/jmalloc" + } + ], + "description": "Dependency injection for global functions.", + "homepage": "https://github.com/IcecaveStudios/isolator", + "keywords": [ + "fake", + "mock", + "phake", + "phpunit", + "test", + "unit" + ] + }, + { + "name": "eloquent/pops", + "version": "3.1.1", + "version_normalized": "3.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/eloquent/pops.git", + "reference": "b14090a3478f544d1b3a3b9389cb03415cf4f37f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/pops/zipball/b14090a3478f544d1b3a3b9389cb03415cf4f37f", + "reference": "b14090a3478f544d1b3a3b9389cb03415cf4f37f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "icecave/archer": "~0.2" + }, + "time": "2013-03-04 10:10:43", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Eloquent\\Pops": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "PHP object proxy system.", + "homepage": "https://github.com/eloquent/pops", + "keywords": [ + "escaping", + "object", + "proxy" + ] + }, + { + "name": "eloquent/liberator", + "version": "1.1.1", + "version_normalized": "1.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/eloquent/liberator.git", + "reference": "a85435066850ab47acc61296c5d20732ff4c9655" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/liberator/zipball/a85435066850ab47acc61296c5d20732ff4c9655", + "reference": "a85435066850ab47acc61296c5d20732ff4c9655", + "shasum": "" + }, + "require": { + "eloquent/pops": "~3", + "php": ">=5.3.0" + }, + "require-dev": { + "icecave/archer": "~0.2" + }, + "time": "2013-03-03 23:02:47", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Eloquent\\Liberator": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "A proxy for circumventing PHP access modifier restrictions.", + "homepage": "https://github.com/eloquent/liberator", + "keywords": [ + "access", + "modifier", + "object", + "private", + "protected", + "proxy", + "reflection" + ] + }, + { + "name": "eloquent/enumeration", + "version": "5.1.1", + "version_normalized": "5.1.1.0", + "source": { + "type": "git", + "url": "https://github.com/eloquent/enumeration.git", + "reference": "0242859435d9b135939816858348556d3cde9e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/enumeration/zipball/0242859435d9b135939816858348556d3cde9e3c", + "reference": "0242859435d9b135939816858348556d3cde9e3c", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "icecave/archer": "dev-develop", + "phpunit/phpunit": "^4", + "sami/sami": "^3" + }, + "time": "2015-11-03 22:21:38", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Eloquent\\Enumeration\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "An enumeration implementation for PHP.", + "homepage": "https://github.com/eloquent/enumeration", + "keywords": [ + "class", + "enum", + "enumeration", + "multiton", + "set", + "type" + ] + }, + { + "name": "eloquent/composer-config-reader", + "version": "2.0.0", + "version_normalized": "2.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/eloquent/composer-config-reader.git", + "reference": "b79319806e1bcc101c89a023b3aeee9e5931e463" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/composer-config-reader/zipball/b79319806e1bcc101c89a023b3aeee9e5931e463", + "reference": "b79319806e1bcc101c89a023b3aeee9e5931e463", + "shasum": "" + }, + "require": { + "eloquent/enumeration": "~5", + "eloquent/liberator": "~1", + "icecave/isolator": "~2", + "justinrainbow/json-schema": "~1", + "php": ">=5.3" + }, + "require-dev": { + "icecave/archer": "~1" + }, + "time": "2014-01-22 01:05:31", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Eloquent\\Composer\\Configuration\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "A light-weight component for reading Composer configuration files.", + "homepage": "https://github.com/eloquent/composer-config-reader", + "keywords": [ + "composer", + "configuration", + "parser", + "reader" + ] + }, + { + "name": "magento-hackathon/magento-composer-installer", + "version": "3.0.6", + "version_normalized": "3.0.6.0", + "source": { + "type": "git", + "url": "https://github.com/Cotya/magento-composer-installer.git", + "reference": "0bb00f1d17f73107c1927d31d3280750b93ae652" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Cotya/magento-composer-installer/zipball/0bb00f1d17f73107c1927d31d3280750b93ae652", + "reference": "0bb00f1d17f73107c1927d31d3280750b93ae652", + "shasum": "" + }, + "archive": { + "exclude": [ + "vendor", + "/tests/FullStackTest/" + ] + }, + "require": { + "composer-plugin-api": "~1.0", + "eloquent/composer-config-reader": "2.*", + "php": ">=5.4", + "symfony/console": "~2.5" + }, + "require-dev": { + "composer/composer": "1.0.*@dev", + "cotya/composer-test-framework": "dev-master", + "mikey179/vfsstream": "~1.4", + "phpunit/phpunit": "~4.3", + "phpunit/phpunit-mock-objects": "~2.3", + "squizlabs/php_codesniffer": "~2.1", + "symfony/process": "~2.5" + }, + "suggest": { + "colinmollenhour/modman": "*", + "theseer/autoload": "~1.14" + }, + "time": "2015-10-21 21:00:24", + "bin": [ + "bin/magento-composer-installer.php" + ], + "type": "composer-plugin", + "extra": { + "class": "MagentoHackathon\\Composer\\Magento\\Plugin" + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "MagentoHackathon\\Composer": "src/" + } + }, + "autoload-dev": { + "psr-0": { + "MagentoHackathon\\Composer\\Magento": "tests/" + } + }, + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Daniel Fahlke aka Flyingmana", + "email": "flyingmana@googlemail.com" + }, + { + "name": "Jörg Weller", + "email": "weller@flagbit.de" + }, + { + "name": "Karl Spies", + "email": "karl.spies@gmx.net" + }, + { + "name": "Tobias Vogt", + "email": "tobi@webguys.de" + }, + { + "name": "David Fuhr", + "email": "fuhr@flagbit.de" + }, + { + "name": "Vinai Kopp", + "email": "vinai@netzarbeiter.com" + } + ], + "description": "Composer installer for Magento modules", + "homepage": "https://github.com/magento-hackathon/magento-composer-installer", + "keywords": [ + "composer-installer", + "magento" + ], + "support": { + "source": "https://github.com/Cotya/magento-composer-installer/tree/3.0.6", + "issues": "https://github.com/Cotya/magento-composer-installer/issues" + } + } +] diff --git a/vendor/doctrine/instantiator/.gitignore b/vendor/doctrine/instantiator/.gitignore new file mode 100644 index 0000000..e3e368d --- /dev/null +++ b/vendor/doctrine/instantiator/.gitignore @@ -0,0 +1,5 @@ +phpunit.xml +composer.lock +build +vendor +coverage.clover diff --git a/vendor/doctrine/instantiator/.scrutinizer.yml b/vendor/doctrine/instantiator/.scrutinizer.yml new file mode 100644 index 0000000..aad5e40 --- /dev/null +++ b/vendor/doctrine/instantiator/.scrutinizer.yml @@ -0,0 +1,46 @@ +before_commands: + - "composer install --prefer-source" + +tools: + external_code_coverage: + timeout: 600 + php_code_coverage: + enabled: true + test_command: ./vendor/bin/phpunit + php_code_sniffer: + enabled: true + config: + standard: PSR2 + filter: + paths: ["src/*", "tests/*"] + php_cpd: + enabled: true + excluded_dirs: ["build/*", "tests", "vendor"] + php_cs_fixer: + enabled: true + config: + level: all + filter: + paths: ["src/*", "tests/*"] + php_loc: + enabled: true + excluded_dirs: ["build", "tests", "vendor"] + php_mess_detector: + enabled: true + config: + ruleset: phpmd.xml.dist + design_rules: { eval_expression: false } + filter: + paths: ["src/*"] + php_pdepend: + enabled: true + excluded_dirs: ["build", "tests", "vendor"] + php_analyzer: + enabled: true + filter: + paths: ["src/*", "tests/*"] + php_hhvm: + enabled: true + filter: + paths: ["src/*", "tests/*"] + sensiolabs_security_checker: true diff --git a/vendor/doctrine/instantiator/.travis.install.sh b/vendor/doctrine/instantiator/.travis.install.sh new file mode 100755 index 0000000..2819188 --- /dev/null +++ b/vendor/doctrine/instantiator/.travis.install.sh @@ -0,0 +1,14 @@ +#!/bin/sh +set -x +if [ "$TRAVIS_PHP_VERSION" = 'hhvm' ] || [ "$TRAVIS_PHP_VERSION" = 'hhvm-nightly' ] ; then + curl -sS https://getcomposer.org/installer > composer-installer.php + hhvm composer-installer.php + hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 composer.phar update --prefer-source +elif [ "$TRAVIS_PHP_VERSION" = '5.3.3' ] ; then + composer self-update + composer update --prefer-source --no-dev + composer dump-autoload +else + composer self-update + composer update --prefer-source +fi diff --git a/vendor/doctrine/instantiator/.travis.yml b/vendor/doctrine/instantiator/.travis.yml new file mode 100644 index 0000000..7f1ec5f --- /dev/null +++ b/vendor/doctrine/instantiator/.travis.yml @@ -0,0 +1,22 @@ +language: php + +php: + - 5.3.3 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - hhvm + +before_script: + - ./.travis.install.sh + - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then PHPUNIT_FLAGS="--coverage-clover coverage.clover"; else PHPUNIT_FLAGS=""; fi + +script: + - if [ $TRAVIS_PHP_VERSION = '5.3.3' ]; then phpunit; fi + - if [ $TRAVIS_PHP_VERSION != '5.3.3' ]; then ./vendor/bin/phpunit $PHPUNIT_FLAGS; fi + - if [ $TRAVIS_PHP_VERSION != '5.3.3' ]; then ./vendor/bin/phpcs --standard=PSR2 ./src/ ./tests/; fi + - if [[ $TRAVIS_PHP_VERSION != '5.3.3' && $TRAVIS_PHP_VERSION != '5.4.29' && $TRAVIS_PHP_VERSION != '5.5.13' ]]; then php -n ./vendor/bin/athletic -p ./tests/DoctrineTest/InstantiatorPerformance/ -f GroupedFormatter; fi + +after_script: + - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi diff --git a/vendor/doctrine/instantiator/CONTRIBUTING.md b/vendor/doctrine/instantiator/CONTRIBUTING.md new file mode 100644 index 0000000..75b84b2 --- /dev/null +++ b/vendor/doctrine/instantiator/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# Contributing + + * Coding standard for the project is [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) + * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php) + * Any contribution must provide tests for additional introduced conditions + * Any un-confirmed issue needs a failing test case before being accepted + * Pull requests must be sent from a new hotfix/feature branch, not from `master`. + +## Installation + +To install the project and run the tests, you need to clone it first: + +```sh +$ git clone git://github.com/doctrine/instantiator.git +``` + +You will then need to run a composer installation: + +```sh +$ cd Instantiator +$ curl -s https://getcomposer.org/installer | php +$ php composer.phar update +``` + +## Testing + +The PHPUnit version to be used is the one installed as a dev- dependency via composer: + +```sh +$ ./vendor/bin/phpunit +``` + +Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement +won't be merged. + diff --git a/vendor/doctrine/instantiator/LICENSE b/vendor/doctrine/instantiator/LICENSE new file mode 100644 index 0000000..4d983d1 --- /dev/null +++ b/vendor/doctrine/instantiator/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 Doctrine Project + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/doctrine/instantiator/README.md b/vendor/doctrine/instantiator/README.md new file mode 100644 index 0000000..393ec7c --- /dev/null +++ b/vendor/doctrine/instantiator/README.md @@ -0,0 +1,40 @@ +# Instantiator + +This library provides a way of avoiding usage of constructors when instantiating PHP classes. + +[![Build Status](https://travis-ci.org/doctrine/instantiator.svg?branch=master)](https://travis-ci.org/doctrine/instantiator) +[![Code Coverage](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master) +[![Dependency Status](https://www.versioneye.com/package/php--doctrine--instantiator/badge.svg)](https://www.versioneye.com/package/php--doctrine--instantiator) +[![HHVM Status](http://hhvm.h4cc.de/badge/doctrine/instantiator.png)](http://hhvm.h4cc.de/package/doctrine/instantiator) + +[![Latest Stable Version](https://poser.pugx.org/doctrine/instantiator/v/stable.png)](https://packagist.org/packages/doctrine/instantiator) +[![Latest Unstable Version](https://poser.pugx.org/doctrine/instantiator/v/unstable.png)](https://packagist.org/packages/doctrine/instantiator) + +## Installation + +The suggested installation method is via [composer](https://getcomposer.org/): + +```sh +php composer.phar require "doctrine/instantiator:~1.0.3" +``` + +## Usage + +The instantiator is able to create new instances of any class without using the constructor or any API of the class +itself: + +```php +$instantiator = new \Doctrine\Instantiator\Instantiator(); + +$instance = $instantiator->instantiate('My\\ClassName\\Here'); +``` + +## Contributing + +Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out! + +## Credits + +This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which +has been donated to the doctrine organization, and which is now deprecated in favour of this package. diff --git a/vendor/doctrine/instantiator/composer.json b/vendor/doctrine/instantiator/composer.json new file mode 100644 index 0000000..4823890 --- /dev/null +++ b/vendor/doctrine/instantiator/composer.json @@ -0,0 +1,45 @@ +{ + "name": "doctrine/instantiator", + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "type": "library", + "license": "MIT", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "instantiate", + "constructor" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "ext-phar": "*", + "ext-pdo": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0", + "athletic/athletic": "~0.1.8" + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "autoload-dev": { + "psr-0": { + "DoctrineTest\\InstantiatorPerformance\\": "tests", + "DoctrineTest\\InstantiatorTest\\": "tests", + "DoctrineTest\\InstantiatorTestAsset\\": "tests" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/doctrine/instantiator/phpmd.xml.dist b/vendor/doctrine/instantiator/phpmd.xml.dist new file mode 100644 index 0000000..8254105 --- /dev/null +++ b/vendor/doctrine/instantiator/phpmd.xml.dist @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/vendor/doctrine/instantiator/phpunit.xml.dist b/vendor/doctrine/instantiator/phpunit.xml.dist new file mode 100644 index 0000000..0a8d570 --- /dev/null +++ b/vendor/doctrine/instantiator/phpunit.xml.dist @@ -0,0 +1,22 @@ + + + + ./tests/DoctrineTest/InstantiatorTest + + + + ./src + + + diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php new file mode 100644 index 0000000..3065375 --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php @@ -0,0 +1,29 @@ +. + */ + +namespace Doctrine\Instantiator\Exception; + +/** + * Base exception marker interface for the instantiator component + * + * @author Marco Pivetta + */ +interface ExceptionInterface +{ +} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..ea8d28c --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php @@ -0,0 +1,62 @@ +. + */ + +namespace Doctrine\Instantiator\Exception; + +use InvalidArgumentException as BaseInvalidArgumentException; +use ReflectionClass; + +/** + * Exception for invalid arguments provided to the instantiator + * + * @author Marco Pivetta + */ +class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface +{ + /** + * @param string $className + * + * @return self + */ + public static function fromNonExistingClass($className) + { + if (interface_exists($className)) { + return new self(sprintf('The provided type "%s" is an interface, and can not be instantiated', $className)); + } + + if (PHP_VERSION_ID >= 50400 && trait_exists($className)) { + return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className)); + } + + return new self(sprintf('The provided class "%s" does not exist', $className)); + } + + /** + * @param ReflectionClass $reflectionClass + * + * @return self + */ + public static function fromAbstractClass(ReflectionClass $reflectionClass) + { + return new self(sprintf( + 'The provided class "%s" is abstract, and can not be instantiated', + $reflectionClass->getName() + )); + } +} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php new file mode 100644 index 0000000..1681e56 --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php @@ -0,0 +1,79 @@ +. + */ + +namespace Doctrine\Instantiator\Exception; + +use Exception; +use ReflectionClass; +use UnexpectedValueException as BaseUnexpectedValueException; + +/** + * Exception for given parameters causing invalid/unexpected state on instantiation + * + * @author Marco Pivetta + */ +class UnexpectedValueException extends BaseUnexpectedValueException implements ExceptionInterface +{ + /** + * @param ReflectionClass $reflectionClass + * @param Exception $exception + * + * @return self + */ + public static function fromSerializationTriggeredException(ReflectionClass $reflectionClass, Exception $exception) + { + return new self( + sprintf( + 'An exception was raised while trying to instantiate an instance of "%s" via un-serialization', + $reflectionClass->getName() + ), + 0, + $exception + ); + } + + /** + * @param ReflectionClass $reflectionClass + * @param string $errorString + * @param int $errorCode + * @param string $errorFile + * @param int $errorLine + * + * @return UnexpectedValueException + */ + public static function fromUncleanUnSerialization( + ReflectionClass $reflectionClass, + $errorString, + $errorCode, + $errorFile, + $errorLine + ) { + return new self( + sprintf( + 'Could not produce an instance of "%s" via un-serialization, since an error was triggered ' + . 'in file "%s" at line "%d"', + $reflectionClass->getName(), + $errorFile, + $errorLine + ), + 0, + new Exception($errorString, $errorCode) + ); + } +} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php new file mode 100644 index 0000000..6d5b3b6 --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php @@ -0,0 +1,273 @@ +. + */ + +namespace Doctrine\Instantiator; + +use Closure; +use Doctrine\Instantiator\Exception\InvalidArgumentException; +use Doctrine\Instantiator\Exception\UnexpectedValueException; +use Exception; +use ReflectionClass; + +/** + * {@inheritDoc} + * + * @author Marco Pivetta + */ +final class Instantiator implements InstantiatorInterface +{ + /** + * Markers used internally by PHP to define whether {@see \unserialize} should invoke + * the method {@see \Serializable::unserialize()} when dealing with classes implementing + * the {@see \Serializable} interface. + */ + const SERIALIZATION_FORMAT_USE_UNSERIALIZER = 'C'; + const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O'; + + /** + * @var \Closure[] of {@see \Closure} instances used to instantiate specific classes + */ + private static $cachedInstantiators = array(); + + /** + * @var object[] of objects that can directly be cloned + */ + private static $cachedCloneables = array(); + + /** + * {@inheritDoc} + */ + public function instantiate($className) + { + if (isset(self::$cachedCloneables[$className])) { + return clone self::$cachedCloneables[$className]; + } + + if (isset(self::$cachedInstantiators[$className])) { + $factory = self::$cachedInstantiators[$className]; + + return $factory(); + } + + return $this->buildAndCacheFromFactory($className); + } + + /** + * Builds the requested object and caches it in static properties for performance + * + * @param string $className + * + * @return object + */ + private function buildAndCacheFromFactory($className) + { + $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className); + $instance = $factory(); + + if ($this->isSafeToClone(new ReflectionClass($instance))) { + self::$cachedCloneables[$className] = clone $instance; + } + + return $instance; + } + + /** + * Builds a {@see \Closure} capable of instantiating the given $className without + * invoking its constructor. + * + * @param string $className + * + * @return Closure + */ + private function buildFactory($className) + { + $reflectionClass = $this->getReflectionClass($className); + + if ($this->isInstantiableViaReflection($reflectionClass)) { + return function () use ($reflectionClass) { + return $reflectionClass->newInstanceWithoutConstructor(); + }; + } + + $serializedString = sprintf( + '%s:%d:"%s":0:{}', + $this->getSerializationFormat($reflectionClass), + strlen($className), + $className + ); + + $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString); + + return function () use ($serializedString) { + return unserialize($serializedString); + }; + } + + /** + * @param string $className + * + * @return ReflectionClass + * + * @throws InvalidArgumentException + */ + private function getReflectionClass($className) + { + if (! class_exists($className)) { + throw InvalidArgumentException::fromNonExistingClass($className); + } + + $reflection = new ReflectionClass($className); + + if ($reflection->isAbstract()) { + throw InvalidArgumentException::fromAbstractClass($reflection); + } + + return $reflection; + } + + /** + * @param ReflectionClass $reflectionClass + * @param string $serializedString + * + * @throws UnexpectedValueException + * + * @return void + */ + private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, $serializedString) + { + set_error_handler(function ($code, $message, $file, $line) use ($reflectionClass, & $error) { + $error = UnexpectedValueException::fromUncleanUnSerialization( + $reflectionClass, + $message, + $code, + $file, + $line + ); + }); + + $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString); + + restore_error_handler(); + + if ($error) { + throw $error; + } + } + + /** + * @param ReflectionClass $reflectionClass + * @param string $serializedString + * + * @throws UnexpectedValueException + * + * @return void + */ + private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, $serializedString) + { + try { + unserialize($serializedString); + } catch (Exception $exception) { + restore_error_handler(); + + throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception); + } + } + + /** + * @param ReflectionClass $reflectionClass + * + * @return bool + */ + private function isInstantiableViaReflection(ReflectionClass $reflectionClass) + { + if (\PHP_VERSION_ID >= 50600) { + return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal()); + } + + return \PHP_VERSION_ID >= 50400 && ! $this->hasInternalAncestors($reflectionClass); + } + + /** + * Verifies whether the given class is to be considered internal + * + * @param ReflectionClass $reflectionClass + * + * @return bool + */ + private function hasInternalAncestors(ReflectionClass $reflectionClass) + { + do { + if ($reflectionClass->isInternal()) { + return true; + } + } while ($reflectionClass = $reflectionClass->getParentClass()); + + return false; + } + + /** + * Verifies if the given PHP version implements the `Serializable` interface serialization + * with an incompatible serialization format. If that's the case, use serialization marker + * "C" instead of "O". + * + * @link http://news.php.net/php.internals/74654 + * + * @param ReflectionClass $reflectionClass + * + * @return string the serialization format marker, either self::SERIALIZATION_FORMAT_USE_UNSERIALIZER + * or self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER + */ + private function getSerializationFormat(ReflectionClass $reflectionClass) + { + if ($this->isPhpVersionWithBrokenSerializationFormat() + && $reflectionClass->implementsInterface('Serializable') + ) { + return self::SERIALIZATION_FORMAT_USE_UNSERIALIZER; + } + + return self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER; + } + + /** + * Checks whether the current PHP runtime uses an incompatible serialization format + * + * @return bool + */ + private function isPhpVersionWithBrokenSerializationFormat() + { + return PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513; + } + + /** + * Checks if a class is cloneable + * + * @param ReflectionClass $reflection + * + * @return bool + */ + private function isSafeToClone(ReflectionClass $reflection) + { + if (method_exists($reflection, 'isCloneable') && ! $reflection->isCloneable()) { + return false; + } + + // not cloneable if it implements `__clone`, as we want to avoid calling it + return ! $reflection->hasMethod('__clone'); + } +} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php new file mode 100644 index 0000000..b665bea --- /dev/null +++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php @@ -0,0 +1,37 @@ +. + */ + +namespace Doctrine\Instantiator; + +/** + * Instantiator provides utility methods to build objects without invoking their constructors + * + * @author Marco Pivetta + */ +interface InstantiatorInterface +{ + /** + * @param string $className + * + * @return object + * + * @throws \Doctrine\Instantiator\Exception\ExceptionInterface + */ + public function instantiate($className); +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php new file mode 100644 index 0000000..3e8fc6f --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php @@ -0,0 +1,96 @@ +. + */ + +namespace DoctrineTest\InstantiatorPerformance; + +use Athletic\AthleticEvent; +use Doctrine\Instantiator\Instantiator; + +/** + * Performance tests for {@see \Doctrine\Instantiator\Instantiator} + * + * @author Marco Pivetta + */ +class InstantiatorPerformanceEvent extends AthleticEvent +{ + /** + * @var \Doctrine\Instantiator\Instantiator + */ + private $instantiator; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->instantiator = new Instantiator(); + + $this->instantiator->instantiate(__CLASS__); + $this->instantiator->instantiate('ArrayObject'); + $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset'); + $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset'); + $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset'); + } + + /** + * @iterations 20000 + * @baseline + * @group instantiation + */ + public function testInstantiateSelf() + { + $this->instantiator->instantiate(__CLASS__); + } + + /** + * @iterations 20000 + * @group instantiation + */ + public function testInstantiateInternalClass() + { + $this->instantiator->instantiate('ArrayObject'); + } + + /** + * @iterations 20000 + * @group instantiation + */ + public function testInstantiateSimpleSerializableAssetClass() + { + $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset'); + } + + /** + * @iterations 20000 + * @group instantiation + */ + public function testInstantiateSerializableArrayObjectAsset() + { + $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset'); + } + + /** + * @iterations 20000 + * @group instantiation + */ + public function testInstantiateUnCloneableAsset() + { + $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset'); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php new file mode 100644 index 0000000..39d9b94 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php @@ -0,0 +1,83 @@ +. + */ + +namespace DoctrineTest\InstantiatorTest\Exception; + +use Doctrine\Instantiator\Exception\InvalidArgumentException; +use PHPUnit_Framework_TestCase; +use ReflectionClass; + +/** + * Tests for {@see \Doctrine\Instantiator\Exception\InvalidArgumentException} + * + * @author Marco Pivetta + * + * @covers \Doctrine\Instantiator\Exception\InvalidArgumentException + */ +class InvalidArgumentExceptionTest extends PHPUnit_Framework_TestCase +{ + public function testFromNonExistingTypeWithNonExistingClass() + { + $className = __CLASS__ . uniqid(); + $exception = InvalidArgumentException::fromNonExistingClass($className); + + $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\InvalidArgumentException', $exception); + $this->assertSame('The provided class "' . $className . '" does not exist', $exception->getMessage()); + } + + public function testFromNonExistingTypeWithTrait() + { + if (PHP_VERSION_ID < 50400) { + $this->markTestSkipped('Need at least PHP 5.4.0, as this test requires traits support to run'); + } + + $exception = InvalidArgumentException::fromNonExistingClass( + 'DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset' + ); + + $this->assertSame( + 'The provided type "DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset" is a trait, ' + . 'and can not be instantiated', + $exception->getMessage() + ); + } + + public function testFromNonExistingTypeWithInterface() + { + $exception = InvalidArgumentException::fromNonExistingClass('Doctrine\\Instantiator\\InstantiatorInterface'); + + $this->assertSame( + 'The provided type "Doctrine\\Instantiator\\InstantiatorInterface" is an interface, ' + . 'and can not be instantiated', + $exception->getMessage() + ); + } + + public function testFromAbstractClass() + { + $reflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset'); + $exception = InvalidArgumentException::fromAbstractClass($reflection); + + $this->assertSame( + 'The provided class "DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset" is abstract, ' + . 'and can not be instantiated', + $exception->getMessage() + ); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php new file mode 100644 index 0000000..84154e7 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php @@ -0,0 +1,69 @@ +. + */ + +namespace DoctrineTest\InstantiatorTest\Exception; + +use Doctrine\Instantiator\Exception\UnexpectedValueException; +use Exception; +use PHPUnit_Framework_TestCase; +use ReflectionClass; + +/** + * Tests for {@see \Doctrine\Instantiator\Exception\UnexpectedValueException} + * + * @author Marco Pivetta + * + * @covers \Doctrine\Instantiator\Exception\UnexpectedValueException + */ +class UnexpectedValueExceptionTest extends PHPUnit_Framework_TestCase +{ + public function testFromSerializationTriggeredException() + { + $reflectionClass = new ReflectionClass($this); + $previous = new Exception(); + $exception = UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $previous); + + $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\UnexpectedValueException', $exception); + $this->assertSame($previous, $exception->getPrevious()); + $this->assertSame( + 'An exception was raised while trying to instantiate an instance of "' + . __CLASS__ . '" via un-serialization', + $exception->getMessage() + ); + } + + public function testFromUncleanUnSerialization() + { + $reflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset'); + $exception = UnexpectedValueException::fromUncleanUnSerialization($reflection, 'foo', 123, 'bar', 456); + + $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\UnexpectedValueException', $exception); + $this->assertSame( + 'Could not produce an instance of "DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset" ' + . 'via un-serialization, since an error was triggered in file "bar" at line "456"', + $exception->getMessage() + ); + + $previous = $exception->getPrevious(); + + $this->assertInstanceOf('Exception', $previous); + $this->assertSame('foo', $previous->getMessage()); + $this->assertSame(123, $previous->getCode()); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php new file mode 100644 index 0000000..0a2cb93 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php @@ -0,0 +1,219 @@ +. + */ + +namespace DoctrineTest\InstantiatorTest; + +use Doctrine\Instantiator\Exception\UnexpectedValueException; +use Doctrine\Instantiator\Instantiator; +use PHPUnit_Framework_TestCase; +use ReflectionClass; + +/** + * Tests for {@see \Doctrine\Instantiator\Instantiator} + * + * @author Marco Pivetta + * + * @covers \Doctrine\Instantiator\Instantiator + */ +class InstantiatorTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Instantiator + */ + private $instantiator; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->instantiator = new Instantiator(); + } + + /** + * @param string $className + * + * @dataProvider getInstantiableClasses + */ + public function testCanInstantiate($className) + { + $this->assertInstanceOf($className, $this->instantiator->instantiate($className)); + } + + /** + * @param string $className + * + * @dataProvider getInstantiableClasses + */ + public function testInstantiatesSeparateInstances($className) + { + $instance1 = $this->instantiator->instantiate($className); + $instance2 = $this->instantiator->instantiate($className); + + $this->assertEquals($instance1, $instance2); + $this->assertNotSame($instance1, $instance2); + } + + public function testExceptionOnUnSerializationException() + { + if (defined('HHVM_VERSION')) { + $this->markTestSkipped( + 'As of facebook/hhvm#3432, HHVM has no PDORow, and therefore ' + . ' no internal final classes that cannot be instantiated' + ); + } + + $className = 'DoctrineTest\\InstantiatorTestAsset\\UnserializeExceptionArrayObjectAsset'; + + if (\PHP_VERSION_ID >= 50600) { + $className = 'PDORow'; + } + + if (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513) { + $className = 'DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset'; + } + + $this->setExpectedException('Doctrine\\Instantiator\\Exception\\UnexpectedValueException'); + + $this->instantiator->instantiate($className); + } + + public function testNoticeOnUnSerializationException() + { + if (\PHP_VERSION_ID >= 50600) { + $this->markTestSkipped( + 'PHP 5.6 supports `ReflectionClass#newInstanceWithoutConstructor()` for some internal classes' + ); + } + + try { + $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset'); + + $this->fail('No exception was raised'); + } catch (UnexpectedValueException $exception) { + $wakeUpNoticesReflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset'); + $previous = $exception->getPrevious(); + + $this->assertInstanceOf('Exception', $previous); + + // in PHP 5.4.29 and PHP 5.5.13, this case is not a notice, but an exception being thrown + if (! (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513)) { + $this->assertSame( + 'Could not produce an instance of "DoctrineTest\\InstantiatorTestAsset\WakeUpNoticesAsset" ' + . 'via un-serialization, since an error was triggered in file "' + . $wakeUpNoticesReflection->getFileName() . '" at line "36"', + $exception->getMessage() + ); + + $this->assertSame('Something went bananas while un-serializing this instance', $previous->getMessage()); + $this->assertSame(\E_USER_NOTICE, $previous->getCode()); + } + } + } + + /** + * @param string $invalidClassName + * + * @dataProvider getInvalidClassNames + */ + public function testInstantiationFromNonExistingClass($invalidClassName) + { + $this->setExpectedException('Doctrine\\Instantiator\\Exception\\InvalidArgumentException'); + + $this->instantiator->instantiate($invalidClassName); + } + + public function testInstancesAreNotCloned() + { + $className = 'TemporaryClass' . uniqid(); + + eval('namespace ' . __NAMESPACE__ . '; class ' . $className . '{}'); + + $instance = $this->instantiator->instantiate(__NAMESPACE__ . '\\' . $className); + + $instance->foo = 'bar'; + + $instance2 = $this->instantiator->instantiate(__NAMESPACE__ . '\\' . $className); + + $this->assertObjectNotHasAttribute('foo', $instance2); + } + + /** + * Provides a list of instantiable classes (existing) + * + * @return string[][] + */ + public function getInstantiableClasses() + { + $classes = array( + array('stdClass'), + array(__CLASS__), + array('Doctrine\\Instantiator\\Instantiator'), + array('Exception'), + array('PharException'), + array('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset'), + array('DoctrineTest\\InstantiatorTestAsset\\ExceptionAsset'), + array('DoctrineTest\\InstantiatorTestAsset\\FinalExceptionAsset'), + array('DoctrineTest\\InstantiatorTestAsset\\PharExceptionAsset'), + array('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset'), + array('DoctrineTest\\InstantiatorTestAsset\\XMLReaderAsset'), + ); + + if (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513) { + return $classes; + } + + $classes = array_merge( + $classes, + array( + array('PharException'), + array('ArrayObject'), + array('DoctrineTest\\InstantiatorTestAsset\\ArrayObjectAsset'), + array('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset'), + ) + ); + + if (\PHP_VERSION_ID >= 50600) { + $classes[] = array('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset'); + $classes[] = array('DoctrineTest\\InstantiatorTestAsset\\UnserializeExceptionArrayObjectAsset'); + } + + return $classes; + } + + /** + * Provides a list of instantiable classes (existing) + * + * @return string[][] + */ + public function getInvalidClassNames() + { + $classNames = array( + array(__CLASS__ . uniqid()), + array('Doctrine\\Instantiator\\InstantiatorInterface'), + array('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset'), + ); + + if (\PHP_VERSION_ID >= 50400) { + $classNames[] = array('DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset'); + } + + return $classNames; + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php new file mode 100644 index 0000000..fbe28dd --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php @@ -0,0 +1,29 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +/** + * A simple asset for an abstract class + * + * @author Marco Pivetta + */ +abstract class AbstractClassAsset +{ +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php new file mode 100644 index 0000000..56146d7 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php @@ -0,0 +1,41 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use ArrayObject; +use BadMethodCallException; + +/** + * Test asset that extends an internal PHP class + * + * @author Marco Pivetta + */ +class ArrayObjectAsset extends ArrayObject +{ + /** + * Constructor - should not be called + * + * @throws BadMethodCallException + */ + public function __construct() + { + throw new BadMethodCallException('Not supposed to be called!'); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php new file mode 100644 index 0000000..43bbe46 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php @@ -0,0 +1,41 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use BadMethodCallException; +use Exception; + +/** + * Test asset that extends an internal PHP base exception + * + * @author Marco Pivetta + */ +class ExceptionAsset extends Exception +{ + /** + * Constructor - should not be called + * + * @throws BadMethodCallException + */ + public function __construct() + { + throw new BadMethodCallException('Not supposed to be called!'); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php new file mode 100644 index 0000000..7d268f5 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php @@ -0,0 +1,41 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use BadMethodCallException; +use Exception; + +/** + * Test asset that extends an internal PHP base exception + * + * @author Marco Pivetta + */ +final class FinalExceptionAsset extends Exception +{ + /** + * Constructor - should not be called + * + * @throws BadMethodCallException + */ + public function __construct() + { + throw new BadMethodCallException('Not supposed to be called!'); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php new file mode 100644 index 0000000..553fd56 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php @@ -0,0 +1,41 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use BadMethodCallException; +use Phar; + +/** + * Test asset that extends an internal PHP class + * + * @author Marco Pivetta + */ +class PharAsset extends Phar +{ + /** + * Constructor - should not be called + * + * @throws BadMethodCallException + */ + public function __construct() + { + throw new BadMethodCallException('Not supposed to be called!'); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php new file mode 100644 index 0000000..42bf73e --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php @@ -0,0 +1,44 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use BadMethodCallException; +use PharException; + +/** + * Test asset that extends an internal PHP class + * This class should be serializable without problems + * and without getting the "Erroneous data format for unserializing" + * error + * + * @author Marco Pivetta + */ +class PharExceptionAsset extends PharException +{ + /** + * Constructor - should not be called + * + * @throws BadMethodCallException + */ + public function __construct() + { + throw new BadMethodCallException('Not supposed to be called!'); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php new file mode 100644 index 0000000..ba19aaf --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php @@ -0,0 +1,62 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use ArrayObject; +use BadMethodCallException; +use Serializable; + +/** + * Serializable test asset that also extends an internal class + * + * @author Marco Pivetta + */ +class SerializableArrayObjectAsset extends ArrayObject implements Serializable +{ + /** + * Constructor - should not be called + * + * @throws BadMethodCallException + */ + public function __construct() + { + throw new BadMethodCallException('Not supposed to be called!'); + } + + /** + * {@inheritDoc} + */ + public function serialize() + { + return ''; + } + + /** + * {@inheritDoc} + * + * Should not be called + * + * @throws BadMethodCallException + */ + public function unserialize($serialized) + { + throw new BadMethodCallException('Not supposed to be called!'); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php new file mode 100644 index 0000000..39f84a6 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php @@ -0,0 +1,61 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use BadMethodCallException; +use Serializable; + +/** + * Base serializable test asset + * + * @author Marco Pivetta + */ +class SimpleSerializableAsset implements Serializable +{ + /** + * Constructor - should not be called + * + * @throws BadMethodCallException + */ + public function __construct() + { + throw new BadMethodCallException('Not supposed to be called!'); + } + + /** + * {@inheritDoc} + */ + public function serialize() + { + return ''; + } + + /** + * {@inheritDoc} + * + * Should not be called + * + * @throws BadMethodCallException + */ + public function unserialize($serialized) + { + throw new BadMethodCallException('Not supposed to be called!'); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php new file mode 100644 index 0000000..04e7806 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php @@ -0,0 +1,29 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +/** + * A simple trait with no attached logic + * + * @author Marco Pivetta + */ +trait SimpleTraitAsset +{ +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php new file mode 100644 index 0000000..7d03bda --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php @@ -0,0 +1,50 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use BadMethodCallException; + +/** + * Base un-cloneable asset + * + * @author Marco Pivetta + */ +class UnCloneableAsset +{ + /** + * Constructor - should not be called + * + * @throws BadMethodCallException + */ + public function __construct() + { + throw new BadMethodCallException('Not supposed to be called!'); + } + + /** + * Magic `__clone` - should not be invoked + * + * @throws BadMethodCallException + */ + public function __clone() + { + throw new BadMethodCallException('Not supposed to be called!'); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php new file mode 100644 index 0000000..b348a40 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php @@ -0,0 +1,39 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use ArrayObject; +use BadMethodCallException; + +/** + * A simple asset for an abstract class + * + * @author Marco Pivetta + */ +class UnserializeExceptionArrayObjectAsset extends ArrayObject +{ + /** + * {@inheritDoc} + */ + public function __wakeup() + { + throw new BadMethodCallException(); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php new file mode 100644 index 0000000..18dc671 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php @@ -0,0 +1,38 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use ArrayObject; + +/** + * A simple asset for an abstract class + * + * @author Marco Pivetta + */ +class WakeUpNoticesAsset extends ArrayObject +{ + /** + * Wakeup method called after un-serialization + */ + public function __wakeup() + { + trigger_error('Something went bananas while un-serializing this instance'); + } +} diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php new file mode 100644 index 0000000..39ee699 --- /dev/null +++ b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php @@ -0,0 +1,41 @@ +. + */ + +namespace DoctrineTest\InstantiatorTestAsset; + +use BadMethodCallException; +use XMLReader; + +/** + * Test asset that extends an internal PHP class + * + * @author Dave Marshall + */ +class XMLReaderAsset extends XMLReader +{ + /** + * Constructor - should not be called + * + * @throws BadMethodCallException + */ + public function __construct() + { + throw new BadMethodCallException('Not supposed to be called!'); + } +} diff --git a/vendor/eloquent/composer-config-reader/CHANGELOG.md b/vendor/eloquent/composer-config-reader/CHANGELOG.md new file mode 100644 index 0000000..ca8fa02 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/CHANGELOG.md @@ -0,0 +1,17 @@ +# Composer configuration reader changelog + +## 2.0.0 (2014-01-22) + +- **[BC BREAK]** Element class constructors expanded to accomodate new Composer + configuration settings +- **[BC BREAK]** `Domain` namespace renamed to `Element` +- **[BC BREAK]** Interfaces renamed to match naming conventions +- **[BC BREAK]** Method names containing acronyms are now CamelCased properly +- **[BC BREAK]** All enumerations have updated APIs as per enumeration version + upgrade +- **[MAINTENANCE]** General repository maintenance + +## 1.1.2 (2013-03-04) + +- **[NEW]** [Archer](https://github.com/IcecaveStudios/archer) integration +- **[NEW]** Implemented changelog diff --git a/vendor/eloquent/composer-config-reader/CONTRIBUTING.md b/vendor/eloquent/composer-config-reader/CONTRIBUTING.md new file mode 100644 index 0000000..e49d8d4 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contributing + +**Composer configuration reader** is open source software; contributions from +the community are encouraged. Please take a moment to read these guidelines +before submitting changes. + +### Code style + +All PHP code must adhere to the +[PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) +standards. + +### Branching and pull requests + +As a guideline, please follow this process: + + 1. [Fork the repository](https://help.github.com/articles/fork-a-repo). + 2. Create a topic branch for the change: + * New features should branch from **develop**. + * Bug fixes to existing versions should branch from **master**. + * Please ensure the branch is clearly labelled as a feature or fix. + 3. Make the relevant changes. + 4. [Squash](http://git-scm.com/book/en/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) + commits if necessary. + 4. Submit a pull request to the **develop** branch. + +Please note this is a general guideline only. For more information on the +branching structure please see the +[git-flow cheatsheet](http://danielkummer.github.com/git-flow-cheatsheet/). diff --git a/vendor/eloquent/composer-config-reader/LICENSE b/vendor/eloquent/composer-config-reader/LICENSE new file mode 100644 index 0000000..54584b1 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/LICENSE @@ -0,0 +1,19 @@ +Copyright © 2014 Erin Millard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/eloquent/composer-config-reader/README.md b/vendor/eloquent/composer-config-reader/README.md new file mode 100644 index 0000000..22d8270 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/README.md @@ -0,0 +1,173 @@ +# Composer configuration reader + +*A light-weight component for reading Composer configuration files.* + +[![The most recent stable version is 2.0.0]][Semantic versioning] +[![Current build status image]][Current build status] +[![Current coverage status image]][Current coverage status] + +## Installation and documentation + +* Available as [Composer] package [eloquent/composer-config-reader]. +* [API documentation] available. + +## Usage + +Composer configuration reader is very simple to use, and a quick example should +be self-explanatory: + +````php +$reader = new Eloquent\Composer\Configuration\ConfigurationReader; +$configuration = $reader->read('/path/to/composer.json'); + +echo $configuration->name(); // outputs the package name +``` + +## Configuration objects + +The following are the objects used to represent the configuration information. +For a more detailed overview of the data available, simply look through the +class definition (these classes are very simple). + +The following classes all exist in the `Eloquent\Composer\Configuration\Element` +namespace. + +### [Configuration] + +This is the main configuration object and has methods to access all the +information available in the [Composer schema]. + +#### Example methods + +* `name()`: The package name. +* `description()`: The package description. +* `dependencies()`: Equivalent to Composer `require`. +* `devDependencies()`: Equivalent to Composer `require-dev`. +* `autoloadPSR0()`: The autoload information for PSR-0 namespaces/paths. +* `autoloadClassmap()`: The autoload information for classmapped paths. + +#### Helper methods + +A number of helper methods exist on the main configuration object to simplify +the process of extracting useful information: + +* `projectName()`: The project name without the vendor prefix. +* `vendorName()`: The vendor name without the project suffix. +* `allDependencies()`: Combines `require` and `require-dev` into a single array. +* `allPSR0SourcePaths()`: A flat array of all PSR-0-compliant source paths. +* `allSourcePaths()`: A flat array of all source paths. + +### [Repository], [PackageRepository] + +These objects describe the package's defined repositories. + +All repositories are represented by the `Repository` class, except for +package-type repositories which use the `PackageRepository` class. + +See [Repositories]. + +#### Example methods + +* `type()`: The repository type. +* `url()`: The repository URL (not available for `PackageRepository`). + +### [Stability] + +This object is an [enumeration] of package stabilities, with the following +members: + +* DEV +* ALPHA +* BETA +* RC +* STABLE + +It is currently only used to represent the value of the [minimum-stability] +option. + +### [Author] + +This object contains all information provided for a specific author. + +See [authors]. + +#### Example methods + +* `name()`: The author's name. +* `email()`: The author's email address. + +### [SupportInformation] + +This object describes the package's support contact information. + +See [support]. + +#### Example methods + +* `email()`: The support email address. +* `issues()`: The URL of the issue tracking system. +* `wiki()`: The URL of the wiki system. + +### [ProjectConfiguration] + +This object describes configuration options specific to end-projects, such as +the target directories for various resources provided by Composer. + +See [config]. + +#### Example methods + +* `vendorDir()`: The project's vendor directory path. +* `binDir()`: The project's binary directory path. + +### [ScriptConfiguration] + +This object describes the Composer scripts defined by the package. + +See [Scripts]. + +#### Example methods + +* `preInstallCmd()`: The pre-install scripts. +* `postInstallCmd()`: The post-install scripts. + +### [ArchiveConfiguration] + +This object describes the settings for creating package archives. + +See [archive]. + +#### Example methods + +* `exclude()`: A list of file exclusion patterns. + + + +[archive]: http://getcomposer.org/doc/04-schema.md#archive +[ArchiveConfiguration]: http://lqnt.co/composer-config-reader/artifacts/documentation/api/Eloquent/Composer/Configuration/Element/ArchiveConfiguration.html +[Author]: http://lqnt.co/composer-config-reader/artifacts/documentation/api/Eloquent/Composer/Configuration/Element/Author.html +[authors]: http://getcomposer.org/doc/04-schema.md#authors +[Composer schema]: http://getcomposer.org/doc/04-schema.md +[config]: http://getcomposer.org/doc/04-schema.md#config +[Configuration]: http://lqnt.co/composer-config-reader/artifacts/documentation/api/Eloquent/Composer/Configuration/Element/Configuration.html +[enumeration]: https://github.com/eloquent/enumeration +[minimum-stability]: http://getcomposer.org/doc/04-schema.md#minimum-stability +[PackageRepository]: http://lqnt.co/composer-config-reader/artifacts/documentation/api/Eloquent/Composer/Configuration/Element/PackageRepository.html +[ProjectConfiguration]: http://lqnt.co/composer-config-reader/artifacts/documentation/api/Eloquent/Composer/Configuration/Element/ProjectConfiguration.html +[Repositories]: http://getcomposer.org/doc/05-repositories.md +[Repository]: http://lqnt.co/composer-config-reader/artifacts/documentation/api/Eloquent/Composer/Configuration/Element/Repository.html +[ScriptConfiguration]: http://lqnt.co/composer-config-reader/artifacts/documentation/api/Eloquent/Composer/Configuration/Element/ScriptConfiguration.html +[Scripts]: http://getcomposer.org/doc/articles/scripts.md +[Stability]: http://lqnt.co/composer-config-reader/artifacts/documentation/api/Eloquent/Composer/Configuration/Element/Stability.html +[support]: http://getcomposer.org/doc/04-schema.md#support +[SupportInformation]: http://lqnt.co/composer-config-reader/artifacts/documentation/api/Eloquent/Composer/Configuration/Element/SupportInformation.html + +[API documentation]: http://lqnt.co/composer-config-reader/artifacts/documentation/api/ +[Composer]: http://getcomposer.org/ +[Current build status image]: http://b.adge.me/travis/eloquent/composer-config-reader/develop.svg "Current build status for the develop branch" +[Current build status]: https://travis-ci.org/eloquent/composer-config-reader +[Current coverage status image]: http://b.adge.me/coveralls/eloquent/composer-config-reader/develop.svg "Current test coverage for the develop branch" +[Current coverage status]: https://coveralls.io/r/eloquent/composer-config-reader +[eloquent/composer-config-reader]: https://packagist.org/packages/eloquent/composer-config-reader +[Semantic versioning]: http://semver.org/ +[The most recent stable version is 2.0.0]: http://b.adge.me/:semver-2.0.0-green.svg "This project uses semantic versioning" diff --git a/vendor/eloquent/composer-config-reader/composer.json b/vendor/eloquent/composer-config-reader/composer.json new file mode 100644 index 0000000..8c71797 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/composer.json @@ -0,0 +1,29 @@ +{ + "name": "eloquent/composer-config-reader", + "description": "A light-weight component for reading Composer configuration files.", + "keywords": ["composer", "configuration", "reader", "parser"], + "homepage": "https://github.com/eloquent/composer-config-reader", + "license": "MIT", + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "require": { + "php": ">=5.3", + "eloquent/enumeration": "~5", + "eloquent/liberator": "~1", + "icecave/isolator": "~2", + "justinrainbow/json-schema": "~1" + }, + "require-dev": { + "icecave/archer": "~1" + }, + "autoload": { + "psr-4": { + "Eloquent\\Composer\\Configuration\\": "src" + } + } +} diff --git a/vendor/eloquent/composer-config-reader/composer.lock b/vendor/eloquent/composer-config-reader/composer.lock new file mode 100644 index 0000000..3b9d766 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/composer.lock @@ -0,0 +1,1246 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" + ], + "hash": "106868bef7b81bf647fb434e4e06dfd1", + "packages": [ + { + "name": "eloquent/enumeration", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/eloquent/enumeration.git", + "reference": "f5a1d326221dfef3694fe960ed4bdca96ae5c900" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/enumeration/zipball/f5a1d326221dfef3694fe960ed4bdca96ae5c900", + "reference": "f5a1d326221dfef3694fe960ed4bdca96ae5c900", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "icecave/archer": "~1" + }, + "type": "library", + "autoload": { + "psr-0": { + "Eloquent\\Enumeration": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "An enumeration implementation for PHP.", + "homepage": "https://github.com/eloquent/enumeration", + "keywords": [ + "class", + "enum", + "enumeration", + "multiton", + "set", + "type" + ], + "time": "2013-11-11 02:48:55" + }, + { + "name": "eloquent/liberator", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/eloquent/liberator.git", + "reference": "1.1.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/liberator/zipball/1.1.1", + "reference": "1.1.1", + "shasum": "" + }, + "require": { + "eloquent/pops": ">=3.0,<4.0", + "php": ">=5.3.0" + }, + "require-dev": { + "icecave/archer": ">=0.2,<1.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Eloquent\\Liberator": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "A proxy for circumventing PHP access modifier restrictions.", + "homepage": "https://github.com/eloquent/liberator", + "keywords": [ + "access", + "modifier", + "object", + "private", + "protected", + "proxy", + "reflection" + ], + "time": "2013-03-03 23:02:47" + }, + { + "name": "eloquent/pops", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/eloquent/pops.git", + "reference": "3.1.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eloquent/pops/zipball/3.1.1", + "reference": "3.1.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "icecave/archer": ">=0.2,<1.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Eloquent\\Pops": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "PHP object proxy system.", + "homepage": "https://github.com/eloquent/pops", + "keywords": [ + "escaping", + "object", + "proxy" + ], + "time": "2013-03-04 10:10:43" + }, + { + "name": "icecave/isolator", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/IcecaveStudios/isolator.git", + "reference": "2.2.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/IcecaveStudios/isolator/zipball/2.2.0", + "reference": "2.2.0", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "icecave/archer": ">=0.4,<1.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Icecave\\Isolator": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "James Harris", + "email": "james.harris@icecave.com.au", + "homepage": "https://github.com/jmalloc" + } + ], + "description": "Isolate PHP tests from the global environment.", + "homepage": "https://github.com/IcecaveStudios/isolator", + "keywords": [ + "fake", + "mock", + "phake", + "phpunit", + "test", + "unit" + ], + "time": "2013-06-04 05:00:29" + }, + { + "name": "justinrainbow/json-schema", + "version": "1.3.5", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "01949f6d2130e9737ffae5d3952909a8de70d114" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/01949f6d2130e9737ffae5d3952909a8de70d114", + "reference": "01949f6d2130e9737ffae5d3952909a8de70d114", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "json-schema/json-schema-test-suite": "1.1.0", + "phpdocumentor/phpdocumentor": "~2", + "phpunit/phpunit": "~3.7" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "JsonSchema": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch", + "homepage": "http://wiedler.ch/igor/" + }, + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com", + "homepage": "http://digitalkaoz.net" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "time": "2013-12-13 15:21:04" + } + ], + "packages-dev": [ + { + "name": "dflydev/markdown", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-markdown.git", + "reference": "6baed9b50f29c980795b6656d43722aadb126f7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-markdown/zipball/6baed9b50f29c980795b6656d43722aadb126f7e", + "reference": "6baed9b50f29c980795b6656d43722aadb126f7e", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "dflydev\\markdown": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Michel Fortin", + "homepage": "http://michelf.com" + }, + { + "name": "John Gruber", + "homepage": "http://daringfireball.net" + } + ], + "description": "PHP Markdown & Extra", + "homepage": "http://github.com/dflydev/dflydev-markdown", + "keywords": [ + "markdown" + ], + "time": "2013-09-23 12:00:18" + }, + { + "name": "guzzle/guzzle", + "version": "v3.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b4a3ce8c05e777fa18b802956d5d0e38ad338a69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b4a3ce8c05e777fa18b802956d5d0e38ad338a69", + "reference": "b4a3ce8c05e777fa18b802956d5d0e38ad338a69", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=5.3.3", + "symfony/event-dispatcher": ">=2.1" + }, + "replace": { + "guzzle/batch": "self.version", + "guzzle/cache": "self.version", + "guzzle/common": "self.version", + "guzzle/http": "self.version", + "guzzle/inflection": "self.version", + "guzzle/iterator": "self.version", + "guzzle/log": "self.version", + "guzzle/parser": "self.version", + "guzzle/plugin": "self.version", + "guzzle/plugin-async": "self.version", + "guzzle/plugin-backoff": "self.version", + "guzzle/plugin-cache": "self.version", + "guzzle/plugin-cookie": "self.version", + "guzzle/plugin-curlauth": "self.version", + "guzzle/plugin-error-response": "self.version", + "guzzle/plugin-history": "self.version", + "guzzle/plugin-log": "self.version", + "guzzle/plugin-md5": "self.version", + "guzzle/plugin-mock": "self.version", + "guzzle/plugin-oauth": "self.version", + "guzzle/service": "self.version", + "guzzle/stream": "self.version" + }, + "require-dev": { + "doctrine/cache": "*", + "monolog/monolog": "1.*", + "phpunit/phpunit": "3.7.*", + "psr/log": "1.0.*", + "symfony/class-loader": "*", + "zendframework/zend-cache": "2.0.*", + "zendframework/zend-log": "2.0.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.8-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle\\Tests": "tests/", + "Guzzle": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Guzzle Community", + "homepage": "https://github.com/guzzle/guzzle/contributors" + } + ], + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2013-12-05 23:39:20" + }, + { + "name": "icecave/archer", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/IcecaveStudios/archer.git", + "reference": "d1a4d745bf1616be1e8e81ce844521eeaed76428" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/IcecaveStudios/archer/zipball/d1a4d745bf1616be1e8e81ce844521eeaed76428", + "reference": "d1a4d745bf1616be1e8e81ce844521eeaed76428", + "shasum": "" + }, + "require": { + "phake/phake": "~1", + "php": ">=5.3", + "sami/sami": "~1.1.0", + "satooshi/php-coveralls": "~0.6", + "symfony/console": "~2", + "symfony/process": "~2" + }, + "require-dev": { + "eloquent/liberator": "~1", + "symfony/event-dispatcher": "~2.1" + }, + "suggest": { + "ext-openssl": "OpenSSL is required to encrypt GitHub OAuth tokens for artifact publication." + }, + "bin": [ + "bin/archer", + "bin/woodhouse" + ], + "type": "library", + "autoload": { + "psr-0": { + "Icecave\\Archer": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + }, + { + "name": "James Harris", + "email": "james.harris@icecave.com.au", + "homepage": "https://github.com/jmalloc" + } + ], + "description": "Testing, CI and documentation of PHP projects by convention.", + "homepage": "https://github.com/IcecaveStudios/archer", + "keywords": [ + "api", + "artifacts", + "convention", + "coverage", + "documentation", + "phake", + "phpunit", + "project", + "test", + "testing", + "unit" + ], + "time": "2014-01-08 03:00:20" + }, + { + "name": "nikic/php-parser", + "version": "v0.9.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "1e5e280ae88a27effa2ae4aa2bd088494ed8594f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1e5e280ae88a27effa2ae4aa2bd088494ed8594f", + "reference": "1e5e280ae88a27effa2ae4aa2bd088494ed8594f", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9-dev" + } + }, + "autoload": { + "psr-0": { + "PHPParser": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2013-08-25 17:11:40" + }, + { + "name": "phake/phake", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "git://github.com/mlively/Phake.git", + "reference": "v1.0.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/mlively/Phake/zipball/v1.0.3", + "reference": "v1.0.3", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "src" + ], + "license": [ + "BSD" + ], + "authors": [ + { + "name": "Mike Lively", + "email": "m@digitalsandwich.com" + } + ], + "description": "The Phake mock testing library", + "homepage": "https://github.com/mlively/Phake", + "keywords": [ + "mock", + "testing" + ], + "time": "2012-05-14 08:06:51" + }, + { + "name": "pimple/pimple", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/fabpot/Pimple.git", + "reference": "v1.0.2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fabpot/Pimple/zipball/v1.0.2", + "reference": "v1.0.2", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ], + "time": "2013-03-08 08:21:40" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/php-fig/log/archive/1.0.0.zip", + "reference": "1.0.0", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "sami/sami", + "version": "v1.1", + "source": { + "type": "git", + "url": "https://github.com/fabpot/Sami.git", + "reference": "v1.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fabpot/Sami/zipball/v1.1", + "reference": "v1.1", + "shasum": "" + }, + "require": { + "dflydev/markdown": "1.0.*", + "nikic/php-parser": "0.9.*", + "php": ">=5.3.0", + "pimple/pimple": "1.0.*", + "symfony/console": "~2.1", + "symfony/filesystem": "~2.1", + "symfony/finder": "~2.1", + "symfony/process": "~2.1", + "symfony/yaml": "~2.1", + "twig/twig": "1.*" + }, + "bin": [ + "sami.php" + ], + "type": "application", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Sami": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Sami, an API documentation generator", + "homepage": "http://sami.sensiolabs.org", + "keywords": [ + "phpdoc" + ], + "time": "2013-08-04 13:56:41" + }, + { + "name": "satooshi/php-coveralls", + "version": "v0.6.1", + "source": { + "type": "git", + "url": "https://github.com/satooshi/php-coveralls.git", + "reference": "v0.6.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/v0.6.1", + "reference": "v0.6.1", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-simplexml": "*", + "guzzle/guzzle": ">=3.0", + "php": ">=5.3", + "psr/log": "1.0.0", + "symfony/config": ">=2.0", + "symfony/console": ">=2.0", + "symfony/stopwatch": ">=2.2", + "symfony/yaml": ">=2.0" + }, + "require-dev": { + "apigen/apigen": "2.8.*@stable", + "pdepend/pdepend": "dev-master", + "phpmd/phpmd": "dev-master", + "phpunit/php-invoker": ">=1.1.0,<1.2.0", + "phpunit/phpunit": "3.7.*@stable", + "sebastian/finder-facade": "dev-master", + "sebastian/phpcpd": "1.4.*@stable", + "squizlabs/php_codesniffer": "1.4.*@stable", + "theseer/fdomdocument": "dev-master" + }, + "bin": [ + "composer/bin/coveralls" + ], + "type": "library", + "autoload": { + "psr-0": { + "Contrib\\Component": "src/", + "Contrib\\Bundle": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kitamura Satoshi", + "email": "with.no.parachute@gmail.com", + "homepage": "https://www.facebook.com/satooshi.jp" + } + ], + "description": "PHP client library for Coveralls API", + "homepage": "https://github.com/satooshi/php-coveralls", + "keywords": [ + "ci", + "coverage", + "github", + "test" + ], + "time": "2013-05-04 08:07:33" + }, + { + "name": "symfony/config", + "version": "v2.4.1", + "target-dir": "Symfony/Component/Config", + "source": { + "type": "git", + "url": "https://github.com/symfony/Config.git", + "reference": "27d0b35879ebefcfee6d218512c32ab2d6cd6a6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Config/zipball/27d0b35879ebefcfee6d218512c32ab2d6cd6a6a", + "reference": "27d0b35879ebefcfee6d218512c32ab2d6cd6a6a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/filesystem": "~2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Config\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "http://symfony.com", + "time": "2014-01-01 08:14:50" + }, + { + "name": "symfony/console", + "version": "v2.4.1", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "4c1ed2ff514bd85ee186eebb010ccbdeeab05af7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/4c1ed2ff514bd85ee186eebb010ccbdeeab05af7", + "reference": "4c1ed2ff514bd85ee186eebb010ccbdeeab05af7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/event-dispatcher": "~2.1" + }, + "suggest": { + "symfony/event-dispatcher": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "http://symfony.com", + "time": "2014-01-01 08:14:50" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.4.1", + "target-dir": "Symfony/Component/EventDispatcher", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "e3ba42f6a70554ed05749e61b829550f6ac33601" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/e3ba42f6a70554ed05749e61b829550f6ac33601", + "reference": "e3ba42f6a70554ed05749e61b829550f6ac33601", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/dependency-injection": "~2.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "http://symfony.com", + "time": "2013-12-28 08:12:03" + }, + { + "name": "symfony/filesystem", + "version": "v2.4.1", + "target-dir": "Symfony/Component/Filesystem", + "source": { + "type": "git", + "url": "https://github.com/symfony/Filesystem.git", + "reference": "b3c3b5a8108b3e5d604dc23241b4ea84a067fc78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/b3c3b5a8108b3e5d604dc23241b4ea84a067fc78", + "reference": "b3c3b5a8108b3e5d604dc23241b4ea84a067fc78", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "http://symfony.com", + "time": "2013-12-31 13:43:26" + }, + { + "name": "symfony/finder", + "version": "v2.4.1", + "target-dir": "Symfony/Component/Finder", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "6904345cf2b3bbab1f6d6e4ce1724cb99df9f00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/6904345cf2b3bbab1f6d6e4ce1724cb99df9f00a", + "reference": "6904345cf2b3bbab1f6d6e4ce1724cb99df9f00a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "http://symfony.com", + "time": "2014-01-01 08:14:50" + }, + { + "name": "symfony/process", + "version": "v2.4.1", + "target-dir": "Symfony/Component/Process", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "58fdccb311e44f28866f976c2d7b3227e9f713db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/58fdccb311e44f28866f976c2d7b3227e9f713db", + "reference": "58fdccb311e44f28866f976c2d7b3227e9f713db", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "http://symfony.com", + "time": "2014-01-05 02:10:50" + }, + { + "name": "symfony/stopwatch", + "version": "v2.4.1", + "target-dir": "Symfony/Component/Stopwatch", + "source": { + "type": "git", + "url": "https://github.com/symfony/Stopwatch.git", + "reference": "c8e21e1380c7eef6197a8165620da8457b7c69a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/c8e21e1380c7eef6197a8165620da8457b7c69a5", + "reference": "c8e21e1380c7eef6197a8165620da8457b7c69a5", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Stopwatch\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "http://symfony.com", + "time": "2013-12-12 16:06:47" + }, + { + "name": "symfony/yaml", + "version": "v2.4.1", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "4e1a237fc48145fae114b96458d799746ad89aa0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/4e1a237fc48145fae114b96458d799746ad89aa0", + "reference": "4e1a237fc48145fae114b96458d799746ad89aa0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2013-12-28 08:12:03" + }, + { + "name": "twig/twig", + "version": "v1.15.0", + "source": { + "type": "git", + "url": "https://github.com/fabpot/Twig.git", + "reference": "85e4ff98000157ff753d934b9f13659a953f5666" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fabpot/Twig/zipball/85e4ff98000157ff753d934b9f13659a953f5666", + "reference": "85e4ff98000157ff753d934b9f13659a953f5666", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.15-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ], + "time": "2013-12-06 07:47:10" + } + ], + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": [ + + ], + "platform": { + "php": ">=5.3" + }, + "platform-dev": [ + + ] +} diff --git a/vendor/eloquent/composer-config-reader/etc/composer-schema.json b/vendor/eloquent/composer-config-reader/etc/composer-schema.json new file mode 100644 index 0000000..5a872e4 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/etc/composer-schema.json @@ -0,0 +1,372 @@ +{ + "name": "Package", + "type": "object", + "additionalProperties": true, + "properties": { + "name": { + "type": "string", + "description": "Package name, including 'vendor-name/' prefix.", + "required": false + }, + "type": { + "description": "Package type, either 'library' for common packages, 'composer-plugin' for plugins, 'metapackage' for empty packages, or a custom type ([a-z0-9-]+) defined by whatever project this package applies to.", + "type": "string" + }, + "target-dir": { + "description": "DEPRECATED: Forces the package to be installed into the given subdirectory path. This is used for autoloading PSR-0 packages that do not contain their full path. Use forward slashes for cross-platform compatibility.", + "type": "string" + }, + "description": { + "type": "string", + "description": "Short package description.", + "required": false + }, + "keywords": { + "type": "array", + "items": { + "type": "string", + "description": "A tag/keyword that this package relates to." + } + }, + "homepage": { + "type": "string", + "description": "Homepage URL for the project.", + "format": "uri" + }, + "version": { + "type": "string", + "description": "Package version, see http://getcomposer.org/doc/04-schema.md#version for more info on valid schemes." + }, + "time": { + "type": "string", + "description": "Package release date, in 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' format." + }, + "license": { + "type": ["string", "array"], + "description": "License name. Or an array of license names." + }, + "authors": { + "type": "array", + "description": "List of authors that contributed to the package. This is typically the main maintainers, not the full list.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "Full name of the author.", + "required": true + }, + "email": { + "type": "string", + "description": "Email address of the author.", + "format": "email" + }, + "homepage": { + "type": "string", + "description": "Homepage URL for the author.", + "format": "uri" + }, + "role": { + "type": "string", + "description": "Author's role in the project." + } + } + } + }, + "require": { + "type": "object", + "description": "This is a hash of package name (keys) and version constraints (values) that are required to run this package.", + "additionalProperties": true + }, + "replace": { + "type": "object", + "description": "This is a hash of package name (keys) and version constraints (values) that can be replaced by this package.", + "additionalProperties": true + }, + "conflict": { + "type": "object", + "description": "This is a hash of package name (keys) and version constraints (values) that conflict with this package.", + "additionalProperties": true + }, + "provide": { + "type": "object", + "description": "This is a hash of package name (keys) and version constraints (values) that this package provides in addition to this package's name.", + "additionalProperties": true + }, + "require-dev": { + "type": "object", + "description": "This is a hash of package name (keys) and version constraints (values) that this package requires for developing it (testing tools and such).", + "additionalProperties": true + }, + "suggest": { + "type": "object", + "description": "This is a hash of package name (keys) and descriptions (values) that this package suggests work well with it (this will be suggested to the user during installation).", + "additionalProperties": true + }, + "config": { + "type": "object", + "description": "Composer options.", + "properties": { + "process-timeout": { + "type": "integer", + "description": "The timeout in seconds for process executions, defaults to 300 (5mins)." + }, + "use-include-path": { + "type": "boolean", + "description": "If true, the Composer autoloader will also look for classes in the PHP include path." + }, + "preferred-install": { + "type": "string", + "description": "The install method Composer will prefer to use, defaults to auto and can be any of source, dist or auto." + }, + "notify-on-install": { + "type": "boolean", + "description": "Composer allows repositories to define a notification URL, so that they get notified whenever a package from that repository is installed. This option allows you to disable that behaviour, defaults to true." + }, + "github-protocols": { + "type": "array", + "description": "A list of protocols to use for github.com clones, in priority order, defaults to [\"git\", \"https\", \"http\"].", + "items": { + "type": "string" + } + }, + "github-oauth": { + "type": "object", + "description": "A hash of domain name => github API oauth tokens, typically {\"github.com\":\"\"}.", + "additionalProperties": true + }, + "vendor-dir": { + "type": "string", + "description": "The location where all packages are installed, defaults to \"vendor\"." + }, + "bin-dir": { + "type": "string", + "description": "The location where all binaries are linked, defaults to \"vendor/bin\"." + }, + "cache-dir": { + "type": "string", + "description": "The location where all caches are located, defaults to \"~/.composer/cache\" on *nix and \"%LOCALAPPDATA%\\Composer\" on windows." + }, + "cache-files-dir": { + "type": "string", + "description": "The location where files (zip downloads) are cached, defaults to \"{$cache-dir}/files\"." + }, + "cache-repo-dir": { + "type": "string", + "description": "The location where repo (git/hg repo clones) are cached, defaults to \"{$cache-dir}/repo\"." + }, + "cache-vcs-dir": { + "type": "string", + "description": "The location where vcs infos (git clones, github api calls, etc. when reading vcs repos) are cached, defaults to \"{$cache-dir}/vcs\"." + }, + "cache-ttl": { + "type": "integer", + "description": "The default cache time-to-live, defaults to 15552000 (6 months)." + }, + "cache-files-ttl": { + "type": "integer", + "description": "The cache time-to-live for files, defaults to the value of cache-ttl." + }, + "cache-files-maxsize": { + "type": ["string", "integer"], + "description": "The cache max size for the files cache, defaults to \"300MiB\"." + }, + "discard-changes": { + "type": ["string", "boolean"], + "description": "The default style of handling dirty updates, defaults to false and can be any of true, false or \"stash\"." + }, + "autoloader-suffix": { + "type": "string", + "description": "Optional string to be used as a suffix for the generated Composer autoloader. When null a random one will be generated." + }, + "optimize-autoloader": { + "type": "boolean", + "description": "Always optimize when dumping the autoloader" + }, + "prepend-autoloader": { + "type": "boolean", + "description": "If false, the composer autoloader will not be prepended to existing autoloaders, defaults to true." + }, + "github-domains": { + "type": "array", + "description": "A list of domains to use in github mode. This is used for GitHub Enterprise setups, defaults to [\"github.com\"].", + "items": { + "type": "string" + } + } + } + }, + "extra": { + "type": ["object", "array"], + "description": "Arbitrary extra data that can be used by plugins, for example, package of type composer-plugin may have a 'class' key defining an installer class name.", + "additionalProperties": true + }, + "autoload": { + "type": "object", + "description": "Description of how the package can be autoloaded.", + "properties": { + "psr-0": { + "type": "object", + "description": "This is a hash of namespaces (keys) and the directories they can be found into (values, can be arrays of paths) by the autoloader.", + "additionalProperties": true + }, + "psr-4": { + "type": "object", + "description": "This is a hash of namespaces (keys) and the PSR-4 directories they can map to (values, can be arrays of paths) by the autoloader.", + "additionalProperties": true + }, + "classmap": { + "type": "array", + "description": "This is an array of directories that contain classes to be included in the class-map generation process." + }, + "files": { + "type": "array", + "description": "This is an array of files that are always required on every request." + } + } + }, + "archive": { + "type": ["object"], + "description": "Options for creating package archives for distribution.", + "properties": { + "exclude": { + "type": "array", + "description": "A list of patterns for paths to exclude or include if prefixed with an exclamation mark." + } + } + }, + "repositories": { + "type": ["object", "array"], + "description": "A set of additional repositories where packages can be found.", + "additionalProperties": true + }, + "minimum-stability": { + "type": ["string"], + "description": "The minimum stability the packages must have to be install-able. Possible values are: dev, alpha, beta, RC, stable." + }, + "prefer-stable": { + "type": ["boolean"], + "description": "If set to true, stable packages will be prefered to dev packages when possible, even if the minimum-stability allows unstable packages." + }, + "bin": { + "type": ["array"], + "description": "A set of files that should be treated as binaries and symlinked into bin-dir (from config).", + "items": { + "type": "string" + } + }, + "include-path": { + "type": ["array"], + "description": "DEPRECATED: A list of directories which should get added to PHP's include path. This is only present to support legacy projects, and all new code should preferably use autoloading.", + "items": { + "type": "string" + } + }, + "scripts": { + "type": ["object"], + "description": "Scripts listeners that will be executed before/after some events.", + "properties": { + "pre-install-cmd": { + "type": ["array", "string"], + "description": "Occurs before the install command is executed, contains one or more Class::method callables or shell commands." + }, + "post-install-cmd": { + "type": ["array", "string"], + "description": "Occurs after the install command is executed, contains one or more Class::method callables or shell commands." + }, + "pre-update-cmd": { + "type": ["array", "string"], + "description": "Occurs before the update command is executed, contains one or more Class::method callables or shell commands." + }, + "post-update-cmd": { + "type": ["array", "string"], + "description": "Occurs after the update command is executed, contains one or more Class::method callables or shell commands." + }, + "pre-status-cmd": { + "type": ["array", "string"], + "description": "Occurs before the status command is executed, contains one or more Class::method callables or shell commands." + }, + "post-status-cmd": { + "type": ["array", "string"], + "description": "Occurs after the status command is executed, contains one or more Class::method callables or shell commands." + }, + "pre-package-install": { + "type": ["array", "string"], + "description": "Occurs before a package is installed, contains one or more Class::method callables or shell commands." + }, + "post-package-install": { + "type": ["array", "string"], + "description": "Occurs after a package is installed, contains one or more Class::method callables or shell commands." + }, + "pre-package-update": { + "type": ["array", "string"], + "description": "Occurs before a package is updated, contains one or more Class::method callables or shell commands." + }, + "post-package-update": { + "type": ["array", "string"], + "description": "Occurs after a package is updated, contains one or more Class::method callables or shell commands." + }, + "pre-package-uninstall": { + "type": ["array", "string"], + "description": "Occurs before a package has been uninstalled, contains one or more Class::method callables or shell commands." + }, + "post-package-uninstall": { + "type": ["array", "string"], + "description": "Occurs after a package has been uninstalled, contains one or more Class::method callables or shell commands." + }, + "pre-autoload-dump": { + "type": ["array", "string"], + "description": "Occurs before the autoloader is dumped, contains one or more Class::method callables or shell commands." + }, + "post-autoload-dump": { + "type": ["array", "string"], + "description": "Occurs after the autoloader is dumped, contains one or more Class::method callables or shell commands." + }, + "post-root-package-install": { + "type": ["array", "string"], + "description": "Occurs after the root-package is installed, contains one or more Class::method callables or shell commands." + }, + "post-create-project-cmd": { + "type": ["array", "string"], + "description": "Occurs after the create-project command is executed, contains one or more Class::method callables or shell commands." + } + } + }, + "support": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Email address for support.", + "format": "email" + }, + "issues": { + "type": "string", + "description": "URL to the Issue Tracker.", + "format": "uri" + }, + "forum": { + "type": "string", + "description": "URL to the Forum.", + "format": "uri" + }, + "wiki": { + "type": "string", + "description": "URL to the Wiki.", + "format": "uri" + }, + "irc": { + "type": "string", + "description": "IRC channel for support, as irc://server/channel.", + "format": "uri" + }, + "source": { + "type": "string", + "description": "URL to browse or download the sources.", + "format": "uri" + } + } + } + } +} diff --git a/vendor/eloquent/composer-config-reader/src/ConfigurationReader.php b/vendor/eloquent/composer-config-reader/src/ConfigurationReader.php new file mode 100644 index 0000000..8bcca18 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/ConfigurationReader.php @@ -0,0 +1,545 @@ +validator = $validator; + $this->isolator = Isolator::get($isolator); + } + + /** + * Get the configuration validator. + * + * @return ConfigurationValidator The configuration validator. + */ + public function validator() + { + return $this->validator; + } + + /** + * Read a Composer configuration file. + * + * @param string $path The configuration file path. + * + * @return Element\Configuration The parsed configuration. + * @throws Exception\ConfigurationExceptionInterface If there is a problem reading the configuration. + */ + public function read($path) + { + $data = $this->readJson($path); + $this->validator()->validate($data); + + return $this->createConfiguration($data); + } + + /** + * Read JSON data from the supplied path. + * + * @param string $path The path to read from. + * + * @return ObjectAccess The parsed data. + * @throws Exception\ConfigurationExceptionInterface If there is a problem reading the data. + */ + protected function readJson($path) + { + try { + $jsonData = $this->isolator()->file_get_contents($path); + } catch (ErrorException $e) { + throw new Exception\ConfigurationReadException($path, $e); + } + + $data = json_decode($jsonData); + $jsonError = json_last_error(); + if (JSON_ERROR_NONE !== $jsonError) { + throw new Exception\InvalidJsonException($path, $jsonError); + } + + return new ObjectAccess($data); + } + + /** + * Create a configuration object from the supplied JSON data. + * + * @param ObjectAccess $data The parsed JSON data. + * + * @return Element\Configuration The newly created configuration object. + */ + protected function createConfiguration(ObjectAccess $data) + { + $autoloadData = new ObjectAccess( + $data->getDefault('autoload', new stdClass) + ); + + return new Element\Configuration( + $data->getDefault('name'), + $data->getDefault('description'), + $data->getDefault('version'), + $data->getDefault('type'), + $data->getDefault('keywords'), + $data->getDefault('homepage'), + $this->createTime($data->getDefault('time')), + $this->arrayize($data->getDefault('license')), + $this->createAuthors($data->getDefault('authors')), + $this->createSupport($data->getDefault('support')), + $this->objectToArray($data->getDefault('require')), + $this->objectToArray($data->getDefault('require-dev')), + $this->objectToArray($data->getDefault('conflict')), + $this->objectToArray($data->getDefault('replace')), + $this->objectToArray($data->getDefault('provide')), + $this->objectToArray($data->getDefault('suggest')), + $this->createAutoloadPsr($autoloadData->getDefault('psr-4')), + $this->createAutoloadPsr($autoloadData->getDefault('psr-0')), + $autoloadData->getDefault('classmap'), + $autoloadData->getDefault('files'), + $data->getDefault('include-path'), + $data->getDefault('target-dir'), + $this->createStability($data->getDefault('minimum-stability')), + $data->getDefault('prefer-stable'), + $this->createRepositories($data->getDefault('repositories')), + $this->createProjectConfiguration($data->getDefault('config')), + $this->createScripts($data->getDefault('scripts')), + $data->getDefault('extra'), + $data->getDefault('bin'), + $this->createArchiveConfiguration($data->getDefault('archive')), + $data->data() + ); + } + + /** + * Create a time from the suppled raw value. + * + * @param string|null $time The raw time data. + * + * @return DateTime|null The newly created time object. + */ + protected function createTime($time) + { + if (null !== $time) { + $time = new DateTime($time); + } + + return $time; + } + + /** + * Create an author list from the supplied raw value. + * + * @param array|null $authors The raw author list data. + * + * @return array|null The newly created author list. + */ + protected function createAuthors(array $authors = null) + { + if (null !== $authors) { + foreach ($authors as $index => $author) { + $authors[$index] = $this->createAuthor( + new ObjectAccess($author) + ); + } + } + + return $authors; + } + + /** + * Create an author from the supplied raw value. + * + * @param ObjectAccess $author The raw author data. + * + * @return Element\Author The newly created author. + */ + protected function createAuthor(ObjectAccess $author) + { + return new Element\Author( + $author->get('name'), + $author->getDefault('email'), + $author->getDefault('homepage'), + $author->getDefault('role'), + $author->data() + ); + } + + /** + * Create a support information object from the supplied raw value. + * + * @param stdClass|null $support The raw support information. + * + * @return Element\SupportInformation|null The newly created support information object. + */ + protected function createSupport(stdClass $support = null) + { + if (null !== $support) { + $supportData = new ObjectAccess($support); + $support = new Element\SupportInformation( + $supportData->getDefault('email'), + $supportData->getDefault('issues'), + $supportData->getDefault('forum'), + $supportData->getDefault('wiki'), + $supportData->getDefault('irc'), + $supportData->getDefault('source'), + $supportData->data() + ); + } + + return $support; + } + + /** + * Create PSR-style autoload information from the supplied raw value. + * + * This method currently works for both PSR-0 and PSR-4 data. + * + * @param stdClass|null $autoloadPsr The raw PSR autoload data. + * + * @return array>|null The newly created PSR autoload information. + */ + protected function createAutoloadPsr(stdClass $autoloadPsr = null) + { + if (null !== $autoloadPsr) { + $autoloadPsr = $this->objectToArray($autoloadPsr); + foreach ($autoloadPsr as $namespace => $paths) { + $autoloadPsr[$namespace] = $this->arrayize($paths); + } + } + + return $autoloadPsr; + } + + /** + * Create a stability enumeration from the supplied raw data. + * + * @param string|null $stability The raw stability data. + * + * @return Element\Stability|null The newly created stability enumeration. + */ + protected function createStability($stability) + { + if (null !== $stability) { + $stability = Element\Stability::memberByValue($stability, false); + } + + return $stability; + } + + /** + * Create a repository list from the supplied raw value. + * + * @param array|null $repositories The raw repository list data. + * + * @return array|null The newly created repository list. + */ + protected function createRepositories(array $repositories = null) + { + if (null !== $repositories) { + foreach ($repositories as $index => $repository) { + $repositories[$index] = $this->createRepository( + new ObjectAccess($repository) + ); + } + } + + return $repositories; + } + + /** + * Create a repository from the supplied raw value. + * + * @param ObjectAccess $repository The raw repository data. + * + * @return Element\RepositoryInterface The newly created repository. + */ + protected function createRepository(ObjectAccess $repository) + { + $type = $repository->get('type'); + if ('package' === $type) { + $repository = new Element\PackageRepository( + $this->objectToArray($repository->get('package')), + $this->objectToArray($repository->getDefault('options')), + $repository->data() + ); + } else { + $repository = new Element\Repository( + $type, + $repository->getDefault('url'), + $this->objectToArray($repository->getDefault('options')), + $repository->data() + ); + } + + return $repository; + } + + /** + * Create a project configuration object from the supplied raw value. + * + * @param stdClass|null $config The raw project configuration data. + * + * @return Element\ProjectConfiguration The newly created project configuration object. + */ + protected function createProjectConfiguration(stdClass $config = null) + { + if (null === $config) { + return new Element\ProjectConfiguration( + null, + null, + null, + null, + null, + null, + null, + $this->defaultCacheDir() + ); + } + + $configData = new ObjectAccess($config); + + $cacheDir = $configData->getDefault('cache-dir'); + if (null === $cacheDir) { + $cacheDir = $this->defaultCacheDir(); + } + + return new Element\ProjectConfiguration( + $configData->getDefault('process-timeout'), + $configData->getDefault('use-include-path'), + $this->createInstallationMethod( + $configData->getDefault('preferred-install') + ), + $configData->getDefault('github-protocols'), + $this->objectToArray($configData->getDefault('github-oauth')), + $configData->getDefault('vendor-dir'), + $configData->getDefault('bin-dir'), + $cacheDir, + $configData->getDefault('cache-files-dir'), + $configData->getDefault('cache-repo-dir'), + $configData->getDefault('cache-vcs-dir'), + $configData->getDefault('cache-files-ttl'), + $configData->getDefault('cache-files-maxsize'), + $configData->getDefault('prepend-autoloader'), + $configData->getDefault('autoloader-suffix'), + $configData->getDefault('optimize-autoloader'), + $configData->getDefault('github-domains'), + $configData->getDefault('notify-on-install'), + $this->createVcsChangePolicy( + $configData->getDefault('discard-changes') + ), + $configData->data() + ); + } + + /** + * Get the default cache directory for the current environment. + * + * @return string|null The default cache directory, or null if the cache directory could not be determined. + */ + protected function defaultCacheDir() + { + $cacheDir = $this->isolator()->getenv('COMPOSER_CACHE_DIR'); + if ($cacheDir) { + return $cacheDir; + } + + $home = $this->isolator()->getenv('COMPOSER_HOME'); + $isWindows = $this->isolator()->defined('PHP_WINDOWS_VERSION_MAJOR'); + + if (!$home) { + if ($isWindows) { + if ($envAppData = $this->isolator()->getenv('APPDATA')) { + $home = strtr($envAppData, '\\', '/') . '/Composer'; + } + } elseif ($envHome = $this->isolator()->getenv('HOME')) { + $home = rtrim($envHome, '/') . '/.composer'; + } + } + + if ($home && !$cacheDir) { + if ($isWindows) { + if ($cacheDir = $this->isolator()->getenv('LOCALAPPDATA')) { + $cacheDir .= '/Composer'; + } else { + $cacheDir = $home . '/cache'; + } + + $cacheDir = strtr($cacheDir, '\\', '/'); + } else { + $cacheDir = $home.'/cache'; + } + } + + if (!$cacheDir) { + return null; + } + + return $cacheDir; + } + + /** + * Create a installation method enumeration from the supplied raw data. + * + * @param string|null $method The raw installation method data. + * + * @return Element\InstallationMethod|null The newly created installation method enumeration. + */ + protected function createInstallationMethod($method) + { + if (null !== $method) { + $method = Element\InstallationMethod::memberByValue($method, false); + } + + return $method; + } + + /** + * Create a VCS change policy enumeration from the supplied raw data. + * + * @param string|null $policy The raw VCS change policy data. + * + * @return Element\VcsChangePolicy|null The newly created VCS change policy enumeration. + */ + protected function createVcsChangePolicy($policy) + { + if (null !== $policy) { + $policy = Element\VcsChangePolicy::memberByValue($policy, false); + } + + return $policy; + } + + /** + * Create a script configuration object from the supplied raw value. + * + * @param stdClass|null $scripts The raw script configuration data. + * + * @return Element\ScriptConfiguration|null The newly created script configuration object. + */ + protected function createScripts(stdClass $scripts = null) + { + if (null !== $scripts) { + $scriptsData = new ObjectAccess($scripts); + $scripts = new Element\ScriptConfiguration( + $this->arrayize($scriptsData->getDefault('pre-install-cmd')), + $this->arrayize($scriptsData->getDefault('post-install-cmd')), + $this->arrayize($scriptsData->getDefault('pre-update-cmd')), + $this->arrayize($scriptsData->getDefault('post-update-cmd')), + $this->arrayize($scriptsData->getDefault('pre-status-cmd')), + $this->arrayize($scriptsData->getDefault('post-status-cmd')), + $this->arrayize($scriptsData->getDefault('pre-package-install')), + $this->arrayize($scriptsData->getDefault('post-package-install')), + $this->arrayize($scriptsData->getDefault('pre-package-update')), + $this->arrayize($scriptsData->getDefault('post-package-update')), + $this->arrayize($scriptsData->getDefault('pre-package-uninstall')), + $this->arrayize($scriptsData->getDefault('post-package-uninstall')), + $this->arrayize($scriptsData->getDefault('pre-autoload-dump')), + $this->arrayize($scriptsData->getDefault('post-autoload-dump')), + $this->arrayize($scriptsData->getDefault('post-root-package-install')), + $this->arrayize($scriptsData->getDefault('post-create-project-cmd')), + $scriptsData->data() + ); + } + + return $scripts; + } + + /** + * Create an archive configuration object from the supplied raw value. + * + * @param stdClass|null $archive The raw archive configuration data. + * + * @return Element\ArchiveConfiguration|null The newly created archive configuration object. + */ + protected function createArchiveConfiguration(stdClass $archive = null) + { + if (null !== $archive) { + $archiveData = new ObjectAccess($archive); + $archive = new Element\ArchiveConfiguration( + $archiveData->getDefault('exclude'), + $archiveData->data() + ); + } + + return $archive; + } + + /** + * Recursively convert the supplied object to an associative array. + * + * @param stdClass|null $data The object to convert. + * + * @return array The converted associative array. + */ + protected function objectToArray(stdClass $data = null) + { + if (null !== $data) { + $data = (array) $data; + foreach ($data as $key => $value) { + if ($value instanceof stdClass) { + $data[$key] = $this->objectToArray($value); + } + } + } + + return $data; + } + + /** + * Normalize singular values into an array containing the initial value as + * a single element. + * + * @param mixed $data The data to normalize. + * + * @return array The normalized value. + */ + protected function arrayize($data) + { + if (null !== $data && !is_array($data)) { + $data = array($data); + } + + return $data; + } + + /** + * Get the isolator. + * + * @return Isolator The isolator. + */ + protected function isolator() + { + return $this->isolator; + } + + private $validator; + private $isolator; +} diff --git a/vendor/eloquent/composer-config-reader/src/ConfigurationValidator.php b/vendor/eloquent/composer-config-reader/src/ConfigurationValidator.php new file mode 100644 index 0000000..2b4aa53 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/ConfigurationValidator.php @@ -0,0 +1,106 @@ +isolator = Isolator::get($isolator); + + if (null === $schema) { + $schema = $this->loadDefaultSchema(); + } + if (null === $validator) { + $validator = new Validator; + } + + $this->schema = $schema; + $this->validator = $validator; + } + + /** + * Get the schema. + * + * @return stdClass The schema. + */ + public function schema() + { + return $this->schema; + } + + /** + * Validate Composer configuration data. + * + * @param mixed $data The configuration data. + * + * @throws Exception\ConfigurationExceptionInterface If the data is invalid. + */ + public function validate($data) + { + Liberator::liberate($this->validator)->errors = array(); + $this->validator->check($data, $this->schema()); + + if (!$this->validator->isValid()) { + throw new Exception\InvalidConfigurationException( + $this->validator->getErrors() + ); + } + } + + /** + * Load the default Composer configuration schema. + * + * @return stdClass The parsed schema. + */ + protected function loadDefaultSchema() + { + return json_decode( + $this->isolator->file_get_contents($this->defaultSchemaPath()) + ); + } + + /** + * Get the default Composer configuration schema path. + * + * @return string The schema path. + */ + protected function defaultSchemaPath() + { + return implode( + DIRECTORY_SEPARATOR, + array(dirname(__DIR__), 'etc', 'composer-schema.json') + ); + } + + private $schema; + private $validator; + private $isolator; +} diff --git a/vendor/eloquent/composer-config-reader/src/Element/AbstractRepository.php b/vendor/eloquent/composer-config-reader/src/Element/AbstractRepository.php new file mode 100644 index 0000000..57cb24a --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Element/AbstractRepository.php @@ -0,0 +1,73 @@ +|null $options The repository options. + * @param mixed $rawData The raw data describing the repository. + */ + public function __construct( + $type, + array $options = null, + $rawData = null + ) { + if (null === $options) { + $options = array(); + } + + $this->type = $type; + $this->options = $options; + $this->rawData = $rawData; + } + + /** + * Get the repository type. + * + * @return string The repository type. + */ + public function type() + { + return $this->type; + } + + /** + * Get the repository options. + * + * @return array The repository options. + */ + public function options() + { + return $this->options; + } + + /** + * Get the raw repository data. + * + * @return mixed The raw repository data. + */ + public function rawData() + { + return $this->rawData; + } + + private $type; + private $options; + private $rawData; +} diff --git a/vendor/eloquent/composer-config-reader/src/Element/ArchiveConfiguration.php b/vendor/eloquent/composer-config-reader/src/Element/ArchiveConfiguration.php new file mode 100644 index 0000000..c4dca41 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Element/ArchiveConfiguration.php @@ -0,0 +1,56 @@ +|null $exclude A list of patterns to exclude from the archive. + */ + public function __construct(array $exclude = null, $rawData = null) + { + if (null === $exclude) { + $exclude = array(); + } + + $this->exclude = $exclude; + $this->rawData = $rawData; + } + + /** + * Get the patterns of excluded files. + * + * @return array The exclude patterns. + */ + public function exclude() + { + return $this->exclude; + } + + /** + * Get the raw configuration data. + * + * @return mixed The raw configuration data. + */ + public function rawData() + { + return $this->rawData; + } + + private $exclude; + private $rawData; +} diff --git a/vendor/eloquent/composer-config-reader/src/Element/Author.php b/vendor/eloquent/composer-config-reader/src/Element/Author.php new file mode 100644 index 0000000..8fee085 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Element/Author.php @@ -0,0 +1,97 @@ +name = $name; + $this->email = $email; + $this->homepage = $homepage; + $this->role = $role; + $this->rawData = $rawData; + } + + /** + * Get the author's name. + * + * @return string The author's name. + */ + public function name() + { + return $this->name; + } + + /** + * Get the author's email address. + * + * @return string|null The author's email address. + */ + public function email() + { + return $this->email; + } + + /** + * Get the URI of the author's home page. + * + * @return string|null The URI of the author's home page. + */ + public function homepage() + { + return $this->homepage; + } + + /** + * Get the author's role. + * + * @return string|null The author's role. + */ + public function role() + { + return $this->role; + } + + /** + * Get the raw author data. + * + * @return mixed The raw author data. + */ + public function rawData() + { + return $this->rawData; + } + + private $name; + private $email; + private $homepage; + private $role; + private $rawData; +} diff --git a/vendor/eloquent/composer-config-reader/src/Element/Configuration.php b/vendor/eloquent/composer-config-reader/src/Element/Configuration.php new file mode 100644 index 0000000..c61226d --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Element/Configuration.php @@ -0,0 +1,638 @@ +|null $keywords The keywords the package is related to. + * @param string|null $homepage The URI of the package's home page. + * @param DateTime|null $time The release date of this version. + * @param array|null $license The licences the package is released under. + * @param array|null $authors The authors of the package. + * @param SupportInformation|null $support Support information for the package. + * @param array|null $dependencies The package's dependencies. + * @param array|null $devDependencies The package's development dependencies. + * @param array|null $conflict Packages that conflict with this version of the package. + * @param array|null $replace Packages that are replaced by this package. + * @param array|null $provide Packages that are provided by this package. + * @param array|null $suggest Suggested packages for use with this package. + * @param array>|null $autoloadPsr4 PSR-4 autoloading configuration for the package. + * @param array>|null $autoloadPsr0 PSR-0 autoloading configuration for the package. + * @param array|null $autoloadClassmap Class map autoloading configuration for the package. + * @param array|null $autoloadFiles File autoloading configuration for the package. + * @param array|null $includePath Include path autoloading configuration for the package. + * @param string|null $targetDir The target directory for installation. + * @param Stability|null $minimumStability The minimum stability for packages. + * @param boolean|null $preferStable True if stable packages should take precedence. + * @param array $repositories The custom repositories used by this package. + * @param ProjectConfiguration|null $config The configuration options for the package that are specific to project-type repositories. + * @param ScriptConfiguration|null $scripts The hook scripts for the package. + * @param mixed $extra Arbitrary extra data contained in the project's configuration. + * @param array|null $bin Binary executable files provided by the package. + * @param ArchiveConfiguration|null $archive The archive configuration for the package. + * @param mixed $rawData The raw data describing the configuration. + */ + public function __construct( + $name = null, + $description = null, + $version = null, + $type = null, + array $keywords = null, + $homepage = null, + DateTime $time = null, + array $license = null, + array $authors = null, + SupportInformation $support = null, + array $dependencies = null, + array $devDependencies = null, + array $conflict = null, + array $replace = null, + array $provide = null, + array $suggest = null, + array $autoloadPsr4 = null, + array $autoloadPsr0 = null, + array $autoloadClassmap = null, + array $autoloadFiles = null, + array $includePath = null, + $targetDir = null, + Stability $minimumStability = null, + $preferStable = null, + array $repositories = null, + ProjectConfiguration $config = null, + ScriptConfiguration $scripts = null, + $extra = null, + array $bin = null, + ArchiveConfiguration $archive = null, + $rawData = null + ) { + if (null === $type) { + $type = 'library'; + } + if (null === $keywords) { + $keywords = array(); + } + if (null === $license) { + $license = array(); + } + if (null === $authors) { + $authors = array(); + } + if (null === $support) { + $support = new SupportInformation; + } + if (null === $dependencies) { + $dependencies = array(); + } + if (null === $devDependencies) { + $devDependencies = array(); + } + if (null === $conflict) { + $conflict = array(); + } + if (null === $replace) { + $replace = array(); + } + if (null === $provide) { + $provide = array(); + } + if (null === $suggest) { + $suggest = array(); + } + if (null === $autoloadPsr4) { + $autoloadPsr4 = array(); + } + if (null === $autoloadPsr0) { + $autoloadPsr0 = array(); + } + if (null === $autoloadClassmap) { + $autoloadClassmap = array(); + } + if (null === $autoloadFiles) { + $autoloadFiles = array(); + } + if (null === $includePath) { + $includePath = array(); + } + if (null === $minimumStability) { + $minimumStability = Stability::STABLE(); + } + if (null === $preferStable) { + $preferStable = false; + } + if (null === $repositories) { + $repositories = array(); + } + if (null === $config) { + $config = new ProjectConfiguration; + } + if (null === $scripts) { + $scripts = new ScriptConfiguration; + } + if (null === $archive) { + $archive = new ArchiveConfiguration; + } + if (null === $bin) { + $bin = array(); + } + + $this->name = $name; + $this->description = $description; + $this->version = $version; + $this->type = $type; + $this->keywords = $keywords; + $this->homepage = $homepage; + $this->time = $time; + $this->license = $license; + $this->authors = $authors; + $this->support = $support; + $this->dependencies = $dependencies; + $this->devDependencies = $devDependencies; + $this->conflict = $conflict; + $this->replace = $replace; + $this->provide = $provide; + $this->suggest = $suggest; + $this->autoloadPsr4 = $autoloadPsr4; + $this->autoloadPsr0 = $autoloadPsr0; + $this->autoloadClassmap = $autoloadClassmap; + $this->autoloadFiles = $autoloadFiles; + $this->includePath = $includePath; + $this->targetDir = $targetDir; + $this->minimumStability = $minimumStability; + $this->preferStable = $preferStable; + $this->repositories = $repositories; + $this->config = $config; + $this->scripts = $scripts; + $this->extra = $extra; + $this->bin = $bin; + $this->archive = $archive; + $this->rawData = $rawData; + } + + /** + * Get the package name, including vendor and project names. + * + * @return string|null The name. + */ + public function name() + { + return $this->name; + } + + /** + * Get the project name, without the vendor prefix. + * + * @return string|null The project name. + */ + public function projectName() + { + $name = $this->name(); + if (null === $name) { + return null; + } + + $atoms = explode(static::NAME_SEPARATOR, $name); + + return array_pop($atoms); + } + + /** + * Get the vendor name, without the project suffix. + * + * @return string|null The vendor name. + */ + public function vendorName() + { + $name = $this->name(); + if (null === $name) { + return null; + } + + $atoms = explode(static::NAME_SEPARATOR, $name); + array_pop($atoms); + if (count($atoms) < 1) { + return null; + } + + return implode(static::NAME_SEPARATOR, $atoms); + } + + /** + * Get the package description. + * + * @return string|null The description. + */ + public function description() + { + return $this->description; + } + + /** + * Get the package version. + * + * @return string|null The version. + */ + public function version() + { + return $this->version; + } + + /** + * Get the package type. + * + * @return string The type. + */ + public function type() + { + return $this->type; + } + + /** + * Get the package keywords. + * + * @return array The keywords. + */ + public function keywords() + { + return $this->keywords; + } + + /** + * Get the URI of the package's home page. + * + * @return string|null The home page. + */ + public function homepage() + { + return $this->homepage; + } + + /** + * Get the release date of this version. + * + * @return DateTime|null The release date. + */ + public function time() + { + return $this->time; + } + + /** + * Get the licences the package is released under. + * + * @return array|null The licences. + */ + public function license() + { + return $this->license; + } + + /** + * Get the authors of the package. + * + * @return array The authors. + */ + public function authors() + { + return $this->authors; + } + + /** + * Get support information for the package. + * + * @return SupportInformation The support information. + */ + public function support() + { + return $this->support; + } + + /** + * Get the package's dependencies, excluding development dependencies. + * + * @return array The dependencies. + */ + public function dependencies() + { + return $this->dependencies; + } + + /** + * Get the package's development dependencies. + * + * @return array The development dependencies. + */ + public function devDependencies() + { + return $this->devDependencies; + } + + /** + * Get all of the package's dependencies, including development, and + * non-development dependencies. + * + * @return array All dependencies. + */ + public function allDependencies() + { + return array_merge( + $this->dependencies(), + $this->devDependencies() + ); + } + + /** + * Get the packages that conflict with this version of the package. + * + * @return array The conflicting packages. + */ + public function conflict() + { + return $this->conflict; + } + + /** + * Get the packages that are replaced by this package. + * + * @return array The replaced packages. + */ + public function replace() + { + return $this->replace; + } + + /** + * Get the packages that are provided by this package. + * + * @return array The provided packages. + */ + public function provide() + { + return $this->provide; + } + + /** + * Get suggested packages for use with this package. + * + * @return array The suggested packages. + */ + public function suggest() + { + return $this->suggest; + } + + /** + * Get the PSR-4 autoloading configuration for the package. + * + * @return array> The PSR-4 autoloading configuration. + */ + public function autoloadPsr4() + { + return $this->autoloadPsr4; + } + + /** + * Get the PSR-0 autoloading configuration for the package. + * + * @return array> The PSR-0 autoloading configuration. + */ + public function autoloadPsr0() + { + return $this->autoloadPsr0; + } + + /** + * Get the class map autoloading configuration for the package. + * + * @return array The class map autoloading configuration. + */ + public function autoloadClassmap() + { + return $this->autoloadClassmap; + } + + /** + * Get the file autoloading configuration for the package. + * + * @return array The file autoloading configuration for the package. + */ + public function autoloadFiles() + { + return $this->autoloadFiles; + } + + /** + * Get the include path autoloading configuration for the package. + * + * @return array The include path autoloading configuration for the package. + */ + public function includePath() + { + return $this->includePath; + } + + /** + * Get an array of all source paths containing PSR-4 conformant code. + * + * @return array The PSR-4 source paths. + */ + public function allPsr4SourcePaths() + { + $autoloadPsr4Paths = array(); + foreach ($this->autoloadPsr4() as $namespace => $paths) { + $autoloadPsr4Paths = array_merge($autoloadPsr4Paths, $paths); + } + + return $autoloadPsr4Paths; + } + + /** + * Get an array of all source paths containing PSR-0 conformant code. + * + * @return array The PSR-0 source paths. + */ + public function allPsr0SourcePaths() + { + $autoloadPsr0Paths = array(); + foreach ($this->autoloadPsr0() as $namespace => $paths) { + $autoloadPsr0Paths = array_merge($autoloadPsr0Paths, $paths); + } + + return $autoloadPsr0Paths; + } + + /** + * Get an array of all source paths for this package. + * + * @return array All source paths. + */ + public function allSourcePaths() + { + return array_merge( + $this->allPsr4SourcePaths(), + $this->allPsr0SourcePaths(), + $this->autoloadClassmap(), + $this->autoloadFiles(), + $this->includePath() + ); + } + + /** + * Get the target directory for installation. + * + * @return string|null The target directory. + */ + public function targetDir() + { + return $this->targetDir; + } + + /** + * Get the minimum stability for packages. + * + * @return Stability The minimum stability. + */ + public function minimumStability() + { + return $this->minimumStability; + } + + /** + * Returns true if stable packages should take precedence. + * + * @return boolean True if stable packages should take precedence. + */ + public function preferStable() + { + return $this->preferStable; + } + + /** + * Get the custom repositories used by this package. + * + * @return array The custom repositories. + */ + public function repositories() + { + return $this->repositories; + } + + /** + * Get the configuration options for the package that are specific to + * project-type repositories. + * + * @return ProjectConfiguration The project configuration. + */ + public function config() + { + return $this->config; + } + + /** + * Get the hook scripts for the package. + * + * @return ScriptConfiguration The hook scripts. + */ + public function scripts() + { + return $this->scripts; + } + + /** + * Get the arbitrary extra data contained in the project's configuration. + * + * @return mixed The extra data. + */ + public function extra() + { + return $this->extra; + } + + /** + * Get the binary executable files provided by the package. + * + * @return array The executable files. + */ + public function bin() + { + return $this->bin; + } + + /** + * Get the archive configuration for the package. + * + * @return ArchiveConfiguration The archive configuration. + */ + public function archive() + { + return $this->archive; + } + + /** + * Get the raw configuration data. + * + * @return mixed The raw configuration data. + */ + public function rawData() + { + return $this->rawData; + } + + private $name; + private $description; + private $version; + private $type; + private $keywords; + private $homepage; + private $time; + private $license; + private $authors; + private $support; + private $dependencies; + private $devDependencies; + private $conflict; + private $replace; + private $provide; + private $suggest; + private $autoloadPsr4; + private $autoloadPsr0; + private $autoloadClassmap; + private $autoloadFiles; + private $includePath; + private $targetDir; + private $minimumStability; + private $preferStable; + private $repositories; + private $config; + private $scripts; + private $extra; + private $bin; + private $archive; + private $rawData; +} diff --git a/vendor/eloquent/composer-config-reader/src/Element/InstallationMethod.php b/vendor/eloquent/composer-config-reader/src/Element/InstallationMethod.php new file mode 100644 index 0000000..7108db5 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Element/InstallationMethod.php @@ -0,0 +1,35 @@ +|null $options The repository options. + * @param mixed $rawData The raw data describing the repository. + */ + public function __construct( + array $packageData, + array $options = null, + $rawData = null + ) { + parent::__construct( + 'package', + $options, + $rawData + ); + + $this->packageData = $packageData; + } + + /** + * Get the raw package data. + * + * @return array The raw package data. + */ + public function packageData() + { + return $this->packageData; + } + + private $packageData; +} diff --git a/vendor/eloquent/composer-config-reader/src/Element/ProjectConfiguration.php b/vendor/eloquent/composer-config-reader/src/Element/ProjectConfiguration.php new file mode 100644 index 0000000..0afb056 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Element/ProjectConfiguration.php @@ -0,0 +1,362 @@ +|null $githubProtocols The protocols to use when cloning from GitHub. + * @param array|null $githubOauth An associative array of domain name to GitHub OAuth token. + * @param string|null $vendorDir The vendor directory. + * @param string|null $binDir The binary executable directory. + * @param string|null $cacheDir The cache directory, or null if unknown. + * @param string|null $cacheFilesDir The cache directory for package archives, or null if unknown. + * @param string|null $cacheRepoDir The cache directory for package repositories, or null if unknown. + * @param string|null $cacheVcsDir The cache directory for version control repositories, or null if unknown. + * @param integer|null $cacheFilesTtl The cache time-to-live for package archives in seconds. + * @param integer|null $cacheFilesMaxsize The maximum size of the package archive cache in bytes. + * @param boolean|null $prependAutoloader True if the autoloader should be prepended to existing autoloaders. + * @param string|null $autoloaderSuffix The suffix used for the generated autoloader class name. + * @param boolean|null $optimizeAutoloader True if the autoloader should always be optimized. + * @param array|null $githubDomains The list of domains to use in GitHub mode. + * @param boolean|null $notifyOnInstall True if the repository should be notified on installation. + * @param VcsChangePolicy|null $discardChanges The policy for how to treat version control changes when installing or updating. + * @param mixed $rawData The raw data describing the project configuration. + */ + public function __construct( + $processTimeout = null, + $useIncludePath = null, + InstallationMethod $preferredInstall = null, + array $githubProtocols = null, + array $githubOauth = null, + $vendorDir = null, + $binDir = null, + $cacheDir = null, + $cacheFilesDir = null, + $cacheRepoDir = null, + $cacheVcsDir = null, + $cacheFilesTtl = null, + $cacheFilesMaxsize = null, + $prependAutoloader = null, + $autoloaderSuffix = null, + $optimizeAutoloader = null, + array $githubDomains = null, + $notifyOnInstall = null, + VcsChangePolicy $discardChanges = null, + $rawData = null + ) { + if (null === $processTimeout) { + $processTimeout = 300; + } + if (null === $useIncludePath) { + $useIncludePath = false; + } + if (null === $preferredInstall) { + $preferredInstall = InstallationMethod::AUTO(); + } + if (null === $githubProtocols) { + $githubProtocols = array('git', 'https'); + } + if (null === $githubOauth) { + $githubOauth = array(); + } + if (null === $vendorDir) { + $vendorDir = 'vendor'; + } + if (null === $binDir) { + $binDir = 'vendor/bin'; + } + if (null === $cacheFilesDir && null !== $cacheDir) { + $cacheFilesDir = $cacheDir . '/files'; + } + if (null === $cacheRepoDir && null !== $cacheDir) { + $cacheRepoDir = $cacheDir . '/repo'; + } + if (null === $cacheVcsDir && null !== $cacheDir) { + $cacheVcsDir = $cacheDir . '/vcs'; + } + if (null === $cacheFilesTtl) { + $cacheFilesTtl = 15552000; + } + if (null === $cacheFilesMaxsize) { + $cacheFilesMaxsize = 314572800; + } + if (null === $prependAutoloader) { + $prependAutoloader = true; + } + if (null === $optimizeAutoloader) { + $optimizeAutoloader = false; + } + if (null === $githubDomains) { + $githubDomains = array('github.com'); + } + if (null === $notifyOnInstall) { + $notifyOnInstall = true; + } + if (null === $discardChanges) { + $discardChanges = VcsChangePolicy::IGNORE(); + } + + $this->processTimeout = $processTimeout; + $this->useIncludePath = $useIncludePath; + $this->preferredInstall = $preferredInstall; + $this->githubProtocols = $githubProtocols; + $this->githubOauth = $githubOauth; + $this->vendorDir = $vendorDir; + $this->binDir = $binDir; + $this->cacheDir = $cacheDir; + $this->cacheFilesDir = $cacheFilesDir; + $this->cacheRepoDir = $cacheRepoDir; + $this->cacheVcsDir = $cacheVcsDir; + $this->cacheFilesTtl = $cacheFilesTtl; + $this->cacheFilesMaxsize = $cacheFilesMaxsize; + $this->prependAutoloader = $prependAutoloader; + $this->autoloaderSuffix = $autoloaderSuffix; + $this->optimizeAutoloader = $optimizeAutoloader; + $this->githubDomains = $githubDomains; + $this->notifyOnInstall = $notifyOnInstall; + $this->discardChanges = $discardChanges; + $this->rawData = $rawData; + } + + /** + * Get the process timeout. + * + * @return integer The process timeout. + */ + public function processTimeout() + { + return $this->processTimeout; + } + + /** + * Returns true if the autoloader should look for classes in the PHP include + * path. + * + * @return boolean True if the autoloader should look for classes in the PHP include path. + */ + public function useIncludePath() + { + return $this->useIncludePath; + } + + /** + * Get the preferred installation method. + * + * @return InstallationMethod The preferred installation method. + */ + public function preferredInstall() + { + return $this->preferredInstall; + } + + /** + * Get the protocols to use when cloning from GitHub. + * + * @return array The protocols to use when cloning from GitHub. + */ + public function githubProtocols() + { + return $this->githubProtocols; + } + + /** + * Get the GitHub OAuth tokens. + * + * @return array The GitHub OAuth tokens. + */ + public function githubOauth() + { + return $this->githubOauth; + } + + /** + * Get the vendor directory. + * + * @return string The vendor directory. + */ + public function vendorDir() + { + return $this->vendorDir; + } + + /** + * Get the binary executable directory. + * + * @return string The binary executable directory. + */ + public function binDir() + { + return $this->binDir; + } + + /** + * Get the cache directory. + * + * @return string|null The cache directory, or null if the directory is unknown. + */ + public function cacheDir() + { + return $this->cacheDir; + } + + /** + * Get the cache directory for package archives. + * + * @return string|null The cache directory for package archives, or null if the directory is unknown. + */ + public function cacheFilesDir() + { + return $this->cacheFilesDir; + } + + /** + * Get the cache directory for package repositories. + * + * @return string|null The cache directory for package repositories, or null if the directory is unknown. + */ + public function cacheRepoDir() + { + return $this->cacheRepoDir; + } + + /** + * Get the cache directory for version control repositories. + * + * @return string|null The cache directory for version control repositories, or null if the directory is unknown. + */ + public function cacheVcsDir() + { + return $this->cacheVcsDir; + } + + /** + * Get the cache time-to-live for package archives in seconds. + * + * @return integer The cache time-to-live for package archives in seconds. + */ + public function cacheFilesTtl() + { + return $this->cacheFilesTtl; + } + + /** + * Get the maximum size of the package archive cache in bytes. + * + * @return integer The maximum size of the package archive cache in bytes. + */ + public function cacheFilesMaxsize() + { + return $this->cacheFilesMaxsize; + } + + /** + * Returns true if the autoloader should be prepended to existing + * autoloaders. + * + * @return boolean True if the autoloader should be prepended to existing autoloaders. + */ + public function prependAutoloader() + { + return $this->prependAutoloader; + } + + /** + * Get the suffix used for the generated autoloader class name. + * + * @return string|null The suffix used for the generated autoloader class name, or null if the suffix is random. + */ + public function autoloaderSuffix() + { + return $this->autoloaderSuffix; + } + + /** + * Returns true if the autoloader should always be optimized. + * + * @return boolean True if the autoloader should always be optimized. + */ + public function optimizeAutoloader() + { + return $this->optimizeAutoloader; + } + + /** + * Get the list of domains to use in GitHub mode. + * + * @return array The list of domains to use in GitHub mode. + */ + public function githubDomains() + { + return $this->githubDomains; + } + + /** + * Returns true if notify-on-install is enabled. + * + * @return boolean True if notify-on-install is enabled. + */ + public function notifyOnInstall() + { + return $this->notifyOnInstall; + } + + /** + * Get the policy for how to treat version control changes when installing + * or updating. + * + * @return VcsChangePolicy The policy for how to treat version control changes when installing or updating. + */ + public function discardChanges() + { + return $this->discardChanges; + } + + /** + * Get the raw configuration data. + * + * @return mixed The raw configuration data. + */ + public function rawData() + { + return $this->rawData; + } + + private $processTimeout; + private $useIncludePath; + private $preferredInstall; + private $githubProtocols; + private $githubOauth; + private $vendorDir; + private $binDir; + private $cacheDir; + private $cacheFilesDir; + private $cacheRepoDir; + private $cacheVcsDir; + private $cacheFilesTtl; + private $cacheFilesMaxsize; + private $prependAutoloader; + private $autoloaderSuffix; + private $optimizeAutoloader; + private $githubDomains; + private $notifyOnInstall; + private $discardChanges; + private $rawData; +} diff --git a/vendor/eloquent/composer-config-reader/src/Element/Repository.php b/vendor/eloquent/composer-config-reader/src/Element/Repository.php new file mode 100644 index 0000000..a01a371 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Element/Repository.php @@ -0,0 +1,53 @@ +|null $options The repository options. + * @param mixed $rawData The raw data describing the repository. + */ + public function __construct( + $type, + $uri = null, + array $options = null, + $rawData = null + ) { + parent::__construct( + $type, + $options, + $rawData + ); + + $this->uri = $uri; + } + + /** + * Get the repository URI. + * + * @return string|null The repository URI. + */ + public function uri() + { + return $this->uri; + } + + private $uri; +} diff --git a/vendor/eloquent/composer-config-reader/src/Element/RepositoryInterface.php b/vendor/eloquent/composer-config-reader/src/Element/RepositoryInterface.php new file mode 100644 index 0000000..705814e --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Element/RepositoryInterface.php @@ -0,0 +1,25 @@ +|null $preInstallCmd The pre-install commands. + * @param array|null $postInstallCmd The post-install commands. + * @param array|null $preUpdateCmd The pre-update commands. + * @param array|null $postUpdateCmd The post-update commands. + * @param array|null $preStatusCmd The pre-status commands. + * @param array|null $postStatusCmd The post-status commands. + * @param array|null $prePackageInstall The pre-package-install commands. + * @param array|null $postPackageInstall The post-package-install commands. + * @param array|null $prePackageUpdate The pre-package-update commands. + * @param array|null $postPackageUpdate The post-package-update commands. + * @param array|null $prePackageUninstall The pre-package-uninstall commands. + * @param array|null $postPackageUninstall The post-package-uninstall commands. + * @param array|null $preAutoloadDump The pre-autoload-dump commands. + * @param array|null $postAutoloadDump The post-autoload-dump commands. + * @param array|null $postRootPackageInstall The post-root-package-install commands. + * @param array|null $postCreateProjectCmd The post-create-project commands. + * @param mixed $rawData The raw data describing the script configuration. + */ + public function __construct( + array $preInstallCmd = null, + array $postInstallCmd = null, + array $preUpdateCmd = null, + array $postUpdateCmd = null, + array $preStatusCmd = null, + array $postStatusCmd = null, + array $prePackageInstall = null, + array $postPackageInstall = null, + array $prePackageUpdate = null, + array $postPackageUpdate = null, + array $prePackageUninstall = null, + array $postPackageUninstall = null, + array $preAutoloadDump = null, + array $postAutoloadDump = null, + array $postRootPackageInstall = null, + array $postCreateProjectCmd = null, + $rawData = null + ) { + if (null === $preInstallCmd) { + $preInstallCmd = array(); + } + if (null === $postInstallCmd) { + $postInstallCmd = array(); + } + if (null === $preUpdateCmd) { + $preUpdateCmd = array(); + } + if (null === $postUpdateCmd) { + $postUpdateCmd = array(); + } + if (null === $preStatusCmd) { + $preStatusCmd = array(); + } + if (null === $postStatusCmd) { + $postStatusCmd = array(); + } + if (null === $prePackageInstall) { + $prePackageInstall = array(); + } + if (null === $postPackageInstall) { + $postPackageInstall = array(); + } + if (null === $prePackageUpdate) { + $prePackageUpdate = array(); + } + if (null === $postPackageUpdate) { + $postPackageUpdate = array(); + } + if (null === $prePackageUninstall) { + $prePackageUninstall = array(); + } + if (null === $postPackageUninstall) { + $postPackageUninstall = array(); + } + if (null === $preAutoloadDump) { + $preAutoloadDump = array(); + } + if (null === $postAutoloadDump) { + $postAutoloadDump = array(); + } + if (null === $postRootPackageInstall) { + $postRootPackageInstall = array(); + } + if (null === $postCreateProjectCmd) { + $postCreateProjectCmd = array(); + } + + $this->preInstallCmd = $preInstallCmd; + $this->postInstallCmd = $postInstallCmd; + $this->preUpdateCmd = $preUpdateCmd; + $this->postUpdateCmd = $postUpdateCmd; + $this->preStatusCmd = $preStatusCmd; + $this->postStatusCmd = $postStatusCmd; + $this->prePackageInstall = $prePackageInstall; + $this->postPackageInstall = $postPackageInstall; + $this->prePackageUpdate = $prePackageUpdate; + $this->postPackageUpdate = $postPackageUpdate; + $this->prePackageUninstall = $prePackageUninstall; + $this->postPackageUninstall = $postPackageUninstall; + $this->preAutoloadDump = $preAutoloadDump; + $this->postAutoloadDump = $postAutoloadDump; + $this->postRootPackageInstall = $postRootPackageInstall; + $this->postCreateProjectCmd = $postCreateProjectCmd; + $this->rawData = $rawData; + } + + /** + * Get the pre-install commands. + * + * @return array The pre-install commands. + */ + public function preInstallCmd() + { + return $this->preInstallCmd; + } + + /** + * Get the post-install commands. + * + * @return array The post-install commands. + */ + public function postInstallCmd() + { + return $this->postInstallCmd; + } + + /** + * Get the pre-update commands. + * + * @return array The pre-update commands. + */ + public function preUpdateCmd() + { + return $this->preUpdateCmd; + } + + /** + * Get the post-update commands. + * + * @return array The post-update commands. + */ + public function postUpdateCmd() + { + return $this->postUpdateCmd; + } + + /** + * Get the pre-status commands. + * + * @return array The pre-status commands. + */ + public function preStatusCmd() + { + return $this->preStatusCmd; + } + + /** + * Get the post-status commands. + * + * @return array The post-status commands. + */ + public function postStatusCmd() + { + return $this->postStatusCmd; + } + + /** + * Get the pre-package-install commands. + * + * @return array The pre-package-install commands. + */ + public function prePackageInstall() + { + return $this->prePackageInstall; + } + + /** + * Get the post-package-install commands. + * + * @return array The post-package-install commands. + */ + public function postPackageInstall() + { + return $this->postPackageInstall; + } + + /** + * Get the pre-package-update commands. + * + * @return array The pre-package-update commands. + */ + public function prePackageUpdate() + { + return $this->prePackageUpdate; + } + + /** + * Get the post-package-update commands. + * + * @return array The post-package-update commands. + */ + public function postPackageUpdate() + { + return $this->postPackageUpdate; + } + + /** + * Get the pre-package-uninstall commands. + * + * @return array The pre-package-uninstall commands. + */ + public function prePackageUninstall() + { + return $this->prePackageUninstall; + } + + /** + * Get the post-package-uninstall commands. + * + * @return array The post-package-uninstall commands. + */ + public function postPackageUninstall() + { + return $this->postPackageUninstall; + } + + /** + * Get the pre-autoload-dump commands. + * + * @return array The pre-autoload-dump commands. + */ + public function preAutoloadDump() + { + return $this->preAutoloadDump; + } + + /** + * Get the post-autoload-dump commands. + * + * @return array The post-autoload-dump commands. + */ + public function postAutoloadDump() + { + return $this->postAutoloadDump; + } + + /** + * Get the post-root-package-install commands. + * + * @return array The post-root-package-install commands. + */ + public function postRootPackageInstall() + { + return $this->postRootPackageInstall; + } + + /** + * Get the post-create-project commands. + * + * @return array The post-create-project commands. + */ + public function postCreateProjectCmd() + { + return $this->postCreateProjectCmd; + } + + /** + * Get the raw configuration data. + * + * @return mixed The raw configuration data. + */ + public function rawData() + { + return $this->rawData; + } + + private $preInstallCmd; + private $postInstallCmd; + private $preUpdateCmd; + private $postUpdateCmd; + private $preStatusCmd; + private $postStatusCmd; + private $prePackageInstall; + private $postPackageInstall; + private $prePackageUpdate; + private $postPackageUpdate; + private $prePackageUninstall; + private $postPackageUninstall; + private $preAutoloadDump; + private $postAutoloadDump; + private $postRootPackageInstall; + private $postCreateProjectCmd; + private $rawData; +} diff --git a/vendor/eloquent/composer-config-reader/src/Element/Stability.php b/vendor/eloquent/composer-config-reader/src/Element/Stability.php new file mode 100644 index 0000000..fe1ec31 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Element/Stability.php @@ -0,0 +1,45 @@ +email = $email; + $this->issues = $issues; + $this->forum = $forum; + $this->wiki = $wiki; + $this->irc = $irc; + $this->source = $source; + $this->rawData = $rawData; + } + + /** + * Get the support email address. + * + * @return string|null The support email address. + */ + public function email() + { + return $this->email; + } + + /** + * Get the URI of the issue tracker. + * + * @return string|null The URI of the issue tracker. + */ + public function issues() + { + return $this->issues; + } + + /** + * Get the URI of the forum. + * + * @return string|null The URI of the forum. + */ + public function forum() + { + return $this->forum; + } + + /** + * Get the URI of the wiki. + * + * @return string|null The URI of the wiki. + */ + public function wiki() + { + return $this->wiki; + } + + /** + * Get the URI of the IRC channel. + * + * @return string|null The URI of the IRC channel. + */ + public function irc() + { + return $this->irc; + } + + /** + * Get the URI to the source code. + * + * @return string|null The URI to the source code. + */ + public function source() + { + return $this->source; + } + + /** + * Get the raw configuration data. + * + * @return mixed The raw configuration data. + */ + public function rawData() + { + return $this->rawData; + } + + private $email; + private $issues; + private $forum; + private $wiki; + private $irc; + private $source; + private $rawData; +} diff --git a/vendor/eloquent/composer-config-reader/src/Element/VcsChangePolicy.php b/vendor/eloquent/composer-config-reader/src/Element/VcsChangePolicy.php new file mode 100644 index 0000000..9985e70 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Element/VcsChangePolicy.php @@ -0,0 +1,35 @@ +path = $path; + + parent::__construct( + sprintf("Unable to read Composer configuration from '%s'.", $path), + 0, + $previous + ); + } + + /** + * Get the path to the configuration. + * + * @return string The configuration path. + */ + public function path() + { + return $this->path; + } + + private $path; +} diff --git a/vendor/eloquent/composer-config-reader/src/Exception/InvalidConfigurationException.php b/vendor/eloquent/composer-config-reader/src/Exception/InvalidConfigurationException.php new file mode 100644 index 0000000..8d3e3fd --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Exception/InvalidConfigurationException.php @@ -0,0 +1,70 @@ +> $errors The errors in the configuration. + * @param Exception|null $previous The cause, if available. + */ + public function __construct(array $errors, Exception $previous = null) + { + $this->errors = $errors; + + parent::__construct($this->buildMessage($errors), 0, $previous); + } + + /** + * Get the errors in the configuration. + * + * @return array> The configuration errors. + */ + public function errors() + { + return $this->errors; + } + + /** + * Build the exception message. + * + * @param array> $errors The errors in the configuration. + * + * @return string The exception message. + */ + protected function buildMessage(array $errors) + { + $errorList = array(); + foreach ($errors as $error) { + $errorList[] = sprintf( + ' - [%s] %s', + $error['property'], + $error['message'] + ); + } + + return sprintf( + "The supplied Composer configuration is invalid:\n%s", + implode("\n", $errorList) + ); + } + + private $errors; +} diff --git a/vendor/eloquent/composer-config-reader/src/Exception/InvalidJsonException.php b/vendor/eloquent/composer-config-reader/src/Exception/InvalidJsonException.php new file mode 100644 index 0000000..822e154 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Exception/InvalidJsonException.php @@ -0,0 +1,103 @@ +path = $path; + $this->jsonErrorCode = $jsonErrorCode; + switch ($jsonErrorCode) { + case JSON_ERROR_DEPTH: + $this->jsonErrorMessage = + 'The maximum stack depth has been exceeded.'; + break; + case JSON_ERROR_STATE_MISMATCH: + $this->jsonErrorMessage = 'Invalid or malformed JSON.'; + break; + case JSON_ERROR_CTRL_CHAR: + $this->jsonErrorMessage = + 'Control character error, possibly incorrectly encoded.'; + break; + case JSON_ERROR_SYNTAX: + $this->jsonErrorMessage = 'Syntax error.'; + break; + case JSON_ERROR_UTF8: + $this->jsonErrorMessage = + 'Malformed UTF-8 characters, possibly incorrectly encoded.'; + break; + default: + $this->jsonErrorMessage = 'Unknown error.'; + } + + parent::__construct( + sprintf( + "Invalid JSON in Composer configuration at '%s': %s", + $this->path(), + $this->jsonErrorMessage() + ), + 0, + $previous + ); + } + + /** + * Get the path to the configuration. + * + * @return string The configuration path. + */ + public function path() + { + return $this->path; + } + + /** + * Get the error code supplied by PHP. + * + * @return integer The error code. + */ + public function jsonErrorCode() + { + return $this->jsonErrorCode; + } + + /** + * Get the internal error message. + * + * @return string The internal error message. + */ + public function jsonErrorMessage() + { + return $this->jsonErrorMessage; + } + + private $path; + private $jsonErrorCode; + private $jsonErrorMessage; +} diff --git a/vendor/eloquent/composer-config-reader/src/Exception/UndefinedPropertyException.php b/vendor/eloquent/composer-config-reader/src/Exception/UndefinedPropertyException.php new file mode 100644 index 0000000..65993bd --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/Exception/UndefinedPropertyException.php @@ -0,0 +1,53 @@ +property = $property; + + parent::__construct( + sprintf( + "Undefined property '%s' in Composer configuration.", + $this->property() + ), + 0, + $previous + ); + } + + /** + * Get the requested property name. + * + * @return string The property name. + */ + public function property() + { + return $this->property; + } + + private $property; +} diff --git a/vendor/eloquent/composer-config-reader/src/ObjectAccess.php b/vendor/eloquent/composer-config-reader/src/ObjectAccess.php new file mode 100644 index 0000000..7f6ee23 --- /dev/null +++ b/vendor/eloquent/composer-config-reader/src/ObjectAccess.php @@ -0,0 +1,89 @@ +data = $data; + } + + /** + * Get the internal object. + * + * @return stdClass The internal object. + */ + public function data() + { + return $this->data; + } + + /** + * Returns true if the specified property exists. + * + * @param string $property The property name. + * + * @return boolean True if the property exists. + */ + public function exists($property) + { + return property_exists($this->data(), $property); + } + + /** + * Get the value of the specified property. + * + * @param string $property The property name. + * + * @return mixed The value of the property. + * @throws Exception\UndefinedPropertyException If the property does not exist. + */ + public function get($property) + { + if (!$this->exists($property)) { + throw new Exception\UndefinedPropertyException($property); + } + + return $this->data()->$property; + } + + /** + * Get the value of the specified property, and fall back to a default if + * the property does not exist. + * + * @param string $property The property name. + * @param mixed $default The default value to fall back to. + * + * @return mixed The value of the property, or the supplied default. + */ + public function getDefault($property, $default = null) + { + if (!$this->exists($property)) { + return $default; + } + + return $this->data()->$property; + } + + private $data; +} diff --git a/vendor/eloquent/enumeration/.php_cs b/vendor/eloquent/enumeration/.php_cs new file mode 100644 index 0000000..71cdd96 --- /dev/null +++ b/vendor/eloquent/enumeration/.php_cs @@ -0,0 +1,60 @@ +in(__DIR__) + ->exclude( + array( + 'artifacts', + 'vendor', + ) + ); + +return Symfony\CS\Config\Config::create() + ->level(Symfony\CS\FixerInterface::PSR2_LEVEL) + ->fixers( + array( + // symfony + 'blankline_after_open_tag', + 'duplicate_semicolon', + 'extra_empty_lines', + 'include', + 'join_function', + 'list_commas', + 'multiline_array_trailing_comma', + 'namespace_no_leading_whitespace', + 'new_with_braces', + 'no_blank_lines_after_class_opening', + 'no_empty_lines_after_phpdocs', + 'object_operator', + 'operators_spaces', + 'phpdoc_indent', + 'phpdoc_params', + 'phpdoc_short_description', + 'phpdoc_to_comment', + 'phpdoc_trim', + 'phpdoc_type_to_var', + 'phpdoc_var_without_name', + 'pre_increment', + 'remove_leading_slash_use', + 'remove_lines_between_uses', + 'return', + 'self_accessor', + 'single_array_no_trailing_comma', + 'single_blank_line_before_namespace', + 'single_quote', + 'spaces_before_semicolon', + 'spaces_cast', + 'standardize_not_equal', + 'ternary_spaces', + 'trim_array_spaces', + 'unary_operators_spaces', + 'unused_use', + 'whitespacy_lines', + + // contrib + 'concat_with_spaces', + 'multiline_spaces_before_semicolon', + 'ordered_use', + ) + ) + ->finder($finder); diff --git a/vendor/eloquent/enumeration/.sami b/vendor/eloquent/enumeration/.sami new file mode 100644 index 0000000..17d4638 --- /dev/null +++ b/vendor/eloquent/enumeration/.sami @@ -0,0 +1,15 @@ + 'Enumeration API', + 'default_opened_level' => 2, + 'build_dir' => 'artifacts/documentation/api', + 'cache_dir' => 'artifacts/documentation/api-cache', + 'filter' => new SymfonyFilter(), + ) +); diff --git a/vendor/eloquent/enumeration/CHANGELOG.md b/vendor/eloquent/enumeration/CHANGELOG.md new file mode 100644 index 0000000..293366a --- /dev/null +++ b/vendor/eloquent/enumeration/CHANGELOG.md @@ -0,0 +1,64 @@ +# Enumeration changelog + +## 5.1.1 (2015-11-04) + +- **[IMPROVED]** Use `static` in docblocks for better IDE hints ([#20]) (thanks + [@Bilge]). +- **[MAINTENANCE]** General repository maintenance + +[#20]: https://github.com/eloquent/enumeration/pull/20 +[@bilge]: https://github.com/Bilge + +## 5.1.0 (2014-03-13) + +- **[NEW]** Implemented `memberOrNullBy()` and variants + +## 5.0.1 (2014-01-29) + +- **[MAINTENANCE]** General repository maintenance + +## 5.0.0 (2013-11-11) + +- **[BC BREAK]** Renamed classes: + - `Multiton` -> `AbstractMultiton` + - `Enumeration` -> `AbstractEnumeration` +- **[BC BREAK]** Exceptions no longer extend `LogicException`, but instead + directly extend from the base `Exception` class. +- **[NEW]** Implemented `AbstractValueMultiton`, an an abstract base class for + implementing multitons with values. `AbstractEnumeration` now extends from + this base class. +- **[NEW]** Implemented `AbstractUndefinedMemeberException`, an abstract base + class for implementing custom undefined member exceptions. + `UndefinedMemberException` now extends from this base class. +- **[NEW]** Multiton instances now implement formal interfaces: + - `AbstractMultiton` instances implement `MultitonInterface`. + - `AbstractValueMultiton` instances implement `ValueMultitonInterface`. + - `AbstractEnumeration` instances implement `EnumerationInterface` +- **[NEW]** Implemented `membersBy()` and `membersByPredicate()` which help to + retrieve sets of members by various criteria. + +## 4.0.0 (2013-08-13) + +- **[BC BREAK]** `Multiton` method name changes: + - `multitonInstances` -> `members` + - `instanceByKey` -> `memberByKey` + - `instanceBy` -> `memberBy` + - `instanceByPredicate` -> `memberByPredicate` + - `initializeMultiton` -> `initializeMembers` + - `registerMultiton` -> `registerMember` + - `createUndefinedInstanceException` -> `createUndefinedMemberException` +- **[BC BREAK]** `Enumeration` method name changes: + - `instanceByValue` -> `memberByValue` +- **[BC BREAK]** Renamed classes: + - `UndefinedInstanceException` -> `UndefinedMemberException` + - `UndefinedInstanceExceptionInterface` -> `UndefinedMemberExceptionInterface` +- **[NEW]** Case insensitive options for member search methods +- **[NEW]** Defaulting variants of member search methods +- **[MAINTENANCE]** General repository maintenance + +## 3.0.2 (2013-03-04) + +- **[NEW]** [Archer] integration +- **[NEW]** Implemented changelog + +[archer]: (https://github.com/IcecaveStudios/archer) diff --git a/vendor/eloquent/enumeration/CONTRIBUTING.md b/vendor/eloquent/enumeration/CONTRIBUTING.md new file mode 100644 index 0000000..b576d85 --- /dev/null +++ b/vendor/eloquent/enumeration/CONTRIBUTING.md @@ -0,0 +1,33 @@ +# Contributing + +**Enumeration** is open source software; contributions from the community are +encouraged. Please take a moment to read these guidelines before submitting +changes. + +## Code style + +All PHP code must adhere to the [PSR-2] standards. + +[psr-2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md + +## Branching and pull requests + +As a guideline, please follow this process: + +1. [Fork the repository]. +2. Create a topic branch for the change, branching from **develop** +(`git checkout -b branch-name develop`). +3. Make the relevant changes. +4. [Squash] commits if necessary (`git rebase -i develop`). +5. Submit a pull request to the **develop** branch. + +[fork the repository]: https://help.github.com/articles/fork-a-repo +[squash]: http://git-scm.com/book/en/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages + +## Tests + +- Run the tests with `vendor/bin/archer t path/to/tests`, or simply + `vendor/bin/archer` to run the entire suite. +- Generate a coverage report with `vendor/bin/archer c path/to/tests`, or simply + `vendor/bin/archer c` to generate coverage for the entire suite. The coverage + report will be created at `artifacts/tests/coverage/index.html`. diff --git a/vendor/eloquent/enumeration/LICENSE b/vendor/eloquent/enumeration/LICENSE new file mode 100644 index 0000000..d97ca11 --- /dev/null +++ b/vendor/eloquent/enumeration/LICENSE @@ -0,0 +1,19 @@ +Copyright © 2015 Erin Millard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/eloquent/enumeration/README.md b/vendor/eloquent/enumeration/README.md new file mode 100644 index 0000000..3174f4f --- /dev/null +++ b/vendor/eloquent/enumeration/README.md @@ -0,0 +1,276 @@ +# Enumeration + +*An enumeration implementation for PHP.* + +[![The most recent stable version is 5.1.1][version-image]][semantic versioning] +[![Current build status image][build-image]][current build status] +[![Current coverage status image][coverage-image]][current coverage status] + +[build-image]: http://img.shields.io/travis/eloquent/enumeration/develop.svg?style=flat-square "Current build status for the develop branch" +[current build status]: https://travis-ci.org/eloquent/enumeration +[coverage-image]: https://img.shields.io/codecov/c/github/eloquent/enumeration/develop.svg?style=flat-square "Current test coverage for the develop branch" +[current coverage status]: https://codecov.io/github/eloquent/enumeration +[semantic versioning]: http://semver.org/ +[version-image]: http://img.shields.io/:semver-5.1.1-green.svg?style=flat-square "This project uses semantic versioning" + +## Installation and documentation + +- Available as [Composer] package [eloquent/enumeration]. +- [API documentation] available. + +[api documentation]: http://lqnt.co/enumeration/artifacts/documentation/api/ +[composer]: http://getcomposer.org/ +[eloquent/enumeration]: https://packagist.org/packages/eloquent/enumeration + +## What is an Enumeration? + +In terms of software development, an enumeration (or "enumerated type") is +essentially a fixed set of values. These values are called "members" or +"elements". + +An enumeration is used in circumstances where it is desirable to allow an +argument to be only one of a particular set of values, and where anything else +is considered invalid. + +## A basic example + +*Enumeration* can be used like [C++ enumerated types]. Here is an example, +representing a set of HTTP request methods: + +```php +use Eloquent\Enumeration\AbstractEnumeration; + +final class HttpRequestMethod extends AbstractEnumeration +{ + const OPTIONS = 'OPTIONS'; + const GET = 'GET'; + const HEAD = 'HEAD'; + const POST = 'POST'; + const PUT = 'PUT'; + const DELETE = 'DELETE'; + const TRACE = 'TRACE'; + const CONNECT = 'CONNECT'; +} +``` + +This class can now be used in a type hint to easily accept any valid HTTP +request method: + +```php +function handleHttpRequest(HttpRequestMethod $method, $url, $body = null) +{ + // handle request... +} +``` + +[c++ enumerated types]: https://en.wikipedia.org/wiki/Enumerated_type#C.2B.2B + +## Accessing enumeration members + +Members are accessed by static method calls, like so: + +```php +handleHttpRequest(HttpRequestMethod::GET(), 'http://example.org/'); +handleHttpRequest(HttpRequestMethod::POST(), 'http://example.org/', 'foo=bar&baz=qux'); +``` + +For each member of the enumeration, a single instance of the enumeration class +is instantiated (that is, an instance of `HttpRequestMethod` in the above +example). This means that strict comparison (===) can be used to determine +which member has been passed to a function: + +```php +function handleHttpRequest(HttpRequestMethod $method, $url, $body = null) +{ + if ($method === HttpRequestMethod::POST()) { + // handle POST requests... + } else { + // handle other requests... + } +} +``` + +## Java-style enumerations + +[Java's enum types] have slightly more functionality than C++ enumerated types. +They can have additional properties and/or methods, and are really just a +specialised kind of class where there are a fixed set of instances. + +This is sometimes called the [Multiton] pattern, and in fact, all enumerations +in this implementation are Multitons. The `AbstractEnumeration` class simply +defines its members based upon class constants. + +Here is an example borrowed from the Java documentation for its enum types. The +following multiton describes all of the planets in our solar system, including +their masses and radii: + +```php +use Eloquent\Enumeration\AbstractMultiton; + +final class Planet extends AbstractMultiton +{ + /** + * Universal gravitational constant. + * + * @var float + */ + const G = 6.67300E-11; + + /** + * @return float + */ + public function surfaceGravity() + { + return self::G * $this->mass / ($this->radius * $this->radius); + } + + /** + * @param float $otherMass + * + * @return float + */ + public function surfaceWeight($otherMass) + { + return $otherMass * $this->surfaceGravity(); + } + + protected static function initializeMembers() + { + new static('MERCURY', 3.302e23, 2.4397e6); + new static('VENUS', 4.869e24, 6.0518e6); + new static('EARTH', 5.9742e24, 6.37814e6); + new static('MARS', 6.4191e23, 3.3972e6); + new static('JUPITER', 1.8987e27, 7.1492e7); + new static('SATURN', 5.6851e26, 6.0268e7); + new static('URANUS', 8.6849e25, 2.5559e7); + new static('NEPTUNE', 1.0244e26, 2.4764e7); + // new static('PLUTO', 1.31e22, 1.180e6); + } + + /** + * @param string $key + * @param float $mass + * @param float $radius + */ + protected function __construct($key, $mass, $radius) + { + parent::__construct($key); + + $this->mass = $mass; + $this->radius = $radius; + } + + private $mass; + private $radius; +} +``` + +The above class can be used to take a known weight on earth (in any unit) and +calculate the weight on all of the planets (in the same unit): + +```php +$earthWeight = 175; +$mass = $earthWeight / Planet::EARTH()->surfaceGravity(); + +foreach (Planet::members() as $planet) { + echo sprintf( + 'Your weight on %s is %f' . PHP_EOL, + $planet, + $planet->surfaceWeight($mass) + ); +} +``` + +If the above script is executed, it will produce something like the following +output: + +``` +Your weight on MERCURY is 66.107480 +Your weight on VENUS is 158.422560 +Your weight on EARTH is 175.000000 +Your weight on MARS is 66.279359 +Your weight on JUPITER is 442.677903 +Your weight on SATURN is 186.513785 +Your weight on URANUS is 158.424919 +Your weight on NEPTUNE is 199.055584 +``` + +[java's enum types]: https://en.wikipedia.org/wiki/Enumerated_type#Java +[multiton]: http://en.wikipedia.org/wiki/Multiton_pattern + +## Enumerations and class inheritance + +When an enumeration is defined, the intent is usually to define a set of valid +values that should not change, at least within the lifetime of a program's +execution. + +Since PHP has no in-built support for enumerations, this library implements them +as regular PHP classes. Classes, however, allow for much more extensibility than +is desirable in a true enumeration. + +For example, a naive enumeration implementation might allow a developer to +extend the `HttpRequestMethod` class from the examples above (assuming the +`final` keyword is removed): + +```php +class CustomHttpMethod extends HttpRequestMethod +{ + const PATCH = 'PATCH'; +} +``` + +The problem with this scenario is that all the code written to expect only the +HTTP methods defined in `HttpRequestMethod` is now compromised. Anybody can +extend `HttpRequestMethod` to add custom values, essentially voiding the reason +for defining `HttpRequestMethod` in the first place. + +This library provides built-in protection from these kinds of circumstances. +Attempting to define an enumeration that extends another enumeration will result +in an exception being thrown, unless the 'base' enumeration is abstract. + +### Abstract enumerations + +Assuming that there really is a need to extend `HttpRequestMethod`, the way to +go about it is to define an abstract base class, then extend this class to +create the desired concrete enumerations: + +```php +use Eloquent\Enumeration\AbstractEnumeration; + +abstract class AbstractHttpRequestMethod extends AbstractEnumeration +{ + const OPTIONS = 'OPTIONS'; + const GET = 'GET'; + const HEAD = 'HEAD'; + const POST = 'POST'; + const PUT = 'PUT'; + const DELETE = 'DELETE'; + const TRACE = 'TRACE'; + const CONNECT = 'CONNECT'; +} + +final class HttpRequestMethod extends AbstractHttpRequestMethod {} + +final class CustomHttpMethod extends AbstractHttpRequestMethod +{ + const PATCH = 'PATCH'; +} +``` + +In this way, when a developer uses a type hint for `HttpRequestMethod`, there is +no chance they will ever receive the 'PATCH' method: + +```php +function handleHttpRequest(HttpRequestMethod $method, $url, $body = null) +{ + // only handles normal requests... +} + +function handleCustomHttpRequest( + CustomHttpRequestMethod $method, + $url, + $body = null +) { + // handles normal requests, and custom requests... +} +``` diff --git a/vendor/eloquent/enumeration/composer.json b/vendor/eloquent/enumeration/composer.json new file mode 100644 index 0000000..74b9975 --- /dev/null +++ b/vendor/eloquent/enumeration/composer.json @@ -0,0 +1,27 @@ +{ + "name": "eloquent/enumeration", + "description": "An enumeration implementation for PHP.", + "keywords": ["enum", "enumeration", "set", "class", "multiton", "type"], + "homepage": "https://github.com/eloquent/enumeration", + "license": "MIT", + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "require": { + "php": ">=5.3" + }, + "require-dev": { + "icecave/archer": "dev-develop", + "phpunit/phpunit": "^4", + "sami/sami": "^3" + }, + "autoload": { + "psr-4": { + "Eloquent\\Enumeration\\": "src" + } + } +} diff --git a/vendor/eloquent/enumeration/composer.lock b/vendor/eloquent/enumeration/composer.lock new file mode 100644 index 0000000..577a636 --- /dev/null +++ b/vendor/eloquent/enumeration/composer.lock @@ -0,0 +1,1502 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "1cf5f9f0045c5549e7db91bea42edb51", + "content-hash": "57027998ad2cfc38acdab30e978605db", + "packages": [], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14 21:17:01" + }, + { + "name": "icecave/archer", + "version": "dev-develop", + "source": { + "type": "git", + "url": "https://github.com/IcecaveStudios/archer.git", + "reference": "8a140d4838d5920ed49dc9c5fa300016cc85109b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/IcecaveStudios/archer/zipball/8a140d4838d5920ed49dc9c5fa300016cc85109b", + "reference": "8a140d4838d5920ed49dc9c5fa300016cc85109b", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "symfony/console": "^2", + "symfony/process": "^2" + }, + "require-dev": { + "eloquent/liberator": "^2", + "eloquent/phony": "^0.5", + "phpunit/phpunit": "^4", + "sami/sami": "^3" + }, + "suggest": { + "ext-openssl": "OpenSSL is required to encrypt GitHub OAuth tokens for artifact publication." + }, + "bin": [ + "bin/archer", + "bin/woodhouse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Icecave\\Archer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + }, + { + "name": "James Harris", + "email": "james.harris@icecave.com.au", + "homepage": "https://github.com/jmalloc" + } + ], + "description": "Testing, CI and documentation of PHP projects by convention.", + "homepage": "https://github.com/IcecaveStudios/archer", + "keywords": [ + "api", + "artifacts", + "convention", + "coverage", + "documentation", + "phake", + "phpunit", + "project", + "test", + "testing", + "unit" + ], + "time": "2015-10-26 00:32:44" + }, + { + "name": "michelf/php-markdown", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/michelf/php-markdown.git", + "reference": "e1aabe18173231ebcefc90e615565742fc1c7fd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/michelf/php-markdown/zipball/e1aabe18173231ebcefc90e615565742fc1c7fd9", + "reference": "e1aabe18173231ebcefc90e615565742fc1c7fd9", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-lib": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Michelf": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "John Gruber", + "homepage": "http://daringfireball.net/" + }, + { + "name": "Michel Fortin", + "email": "michel.fortin@michelf.ca", + "homepage": "https://michelf.ca/", + "role": "Developer" + } + ], + "description": "PHP Markdown", + "homepage": "https://michelf.ca/projects/php-markdown/", + "keywords": [ + "markdown" + ], + "time": "2015-03-01 12:03:08" + }, + { + "name": "nikic/php-parser", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "files": [ + "lib/bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2015-09-19 14:15:08" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2015-02-03 12:10:50" + }, + { + "name": "phpspec/prophecy", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7", + "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "phpdocumentor/reflection-docblock": "~2.0", + "sebastian/comparator": "~1.1" + }, + "require-dev": { + "phpspec/phpspec": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2015-08-13 10:07:40" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "^1.3.2", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2015-10-06 15:47:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2015-06-21 13:08:43" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21 13:50:34" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2015-06-21 08:01:12" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2015-09-15 10:49:45" + }, + { + "name": "phpunit/phpunit", + "version": "4.8.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "625f8c345606ed0f3a141dfb88f4116f0e22978e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/625f8c345606ed0f3a141dfb88f4116f0e22978e", + "reference": "625f8c345606ed0f3a141dfb88f4116f0e22978e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "^1.3.1", + "phpunit/php-code-coverage": "~2.1", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": ">=1.0.6", + "phpunit/phpunit-mock-objects": "~2.3", + "sebastian/comparator": "~1.1", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.3", + "sebastian/exporter": "~1.2", + "sebastian/global-state": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.1|~3.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.8.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2015-10-23 06:48:33" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2015-10-02 06:51:40" + }, + { + "name": "pimple/pimple", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a", + "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ], + "time": "2015-09-11 15:10:35" + }, + { + "name": "sami/sami", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/Sami.git", + "reference": "504f99a1783e2e0e8817a57be946f7c699b83163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/Sami/zipball/504f99a1783e2e0e8817a57be946f7c699b83163", + "reference": "504f99a1783e2e0e8817a57be946f7c699b83163", + "shasum": "" + }, + "require": { + "michelf/php-markdown": "~1.3", + "nikic/php-parser": "~1.0", + "php": ">=5.3.9", + "phpdocumentor/reflection-docblock": "~2.0", + "pimple/pimple": "~3.0", + "symfony/console": "~2.1", + "symfony/filesystem": "~2.1", + "symfony/finder": "~2.1", + "symfony/process": "~2.1", + "symfony/yaml": "~2.1", + "twig/twig": "~1.20|~2.0" + }, + "bin": [ + "sami.php" + ], + "type": "application", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Sami\\": "Sami/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Sami, an API documentation generator", + "homepage": "http://sami.sensiolabs.org", + "keywords": [ + "phpdoc" + ], + "time": "2015-08-30 14:15:00" + }, + { + "name": "sebastian/comparator", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2015-07-26 15:48:44" + }, + { + "name": "sebastian/diff", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "http://www.github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2015-02-22 15:13:53" + }, + { + "name": "sebastian/environment", + "version": "1.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44", + "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2015-08-03 06:14:51" + }, + { + "name": "sebastian/exporter", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2015-06-21 07:55:53" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2015-10-12 03:26:01" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba", + "reference": "994d4a811bafe801fb06dccbee797863ba2792ba", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2015-06-21 08:04:50" + }, + { + "name": "sebastian/version", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2015-06-21 13:59:46" + }, + { + "name": "symfony/console", + "version": "v2.7.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "5efd632294c8320ea52492db22292ff853a43766" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/5efd632294c8320ea52492db22292ff853a43766", + "reference": "5efd632294c8320ea52492db22292ff853a43766", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2015-10-20 14:38:46" + }, + { + "name": "symfony/filesystem", + "version": "v2.7.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "56fd6df73be859323ff97418d97edc1d756df6df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/56fd6df73be859323ff97418d97edc1d756df6df", + "reference": "56fd6df73be859323ff97418d97edc1d756df6df", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2015-10-18 20:23:18" + }, + { + "name": "symfony/finder", + "version": "v2.7.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", + "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2015-10-11 09:39:48" + }, + { + "name": "symfony/process", + "version": "v2.7.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/4a959dd4e19c2c5d7512689413921e0a74386ec7", + "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2015-10-23 14:47:27" + }, + { + "name": "symfony/yaml", + "version": "v2.7.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "eca9019c88fbe250164affd107bc8057771f3f4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/eca9019c88fbe250164affd107bc8057771f3f4d", + "reference": "eca9019c88fbe250164affd107bc8057771f3f4d", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2015-10-11 09:39:48" + }, + { + "name": "twig/twig", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "5868cd822fd6cf626d5f805439575f9c323cee2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/5868cd822fd6cf626d5f805439575f9c323cee2a", + "reference": "5868cd822fd6cf626d5f805439575f9c323cee2a", + "shasum": "" + }, + "require": { + "php": ">=5.2.7" + }, + "require-dev": { + "symfony/debug": "~2.7", + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.23-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "http://twig.sensiolabs.org/contributors", + "role": "Contributors" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ], + "time": "2015-10-29 23:29:01" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "icecave/archer": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.3" + }, + "platform-dev": [] +} diff --git a/vendor/eloquent/enumeration/src/AbstractEnumeration.php b/vendor/eloquent/enumeration/src/AbstractEnumeration.php new file mode 100644 index 0000000..17808f0 --- /dev/null +++ b/vendor/eloquent/enumeration/src/AbstractEnumeration.php @@ -0,0 +1,39 @@ +getConstants() as $key => $value) { + new static($key, $value); + } + } +} diff --git a/vendor/eloquent/enumeration/src/AbstractMultiton.php b/vendor/eloquent/enumeration/src/AbstractMultiton.php new file mode 100644 index 0000000..fa2e3ce --- /dev/null +++ b/vendor/eloquent/enumeration/src/AbstractMultiton.php @@ -0,0 +1,500 @@ +{$property}() === $value. + * @throws UndefinedMemberExceptionInterface If no associated member is found. + */ + final public static function memberBy( + $property, + $value, + $isCaseSensitive = null + ) { + $member = static::memberByWithDefault( + $property, + $value, + null, + $isCaseSensitive + ); + + if (null === $member) { + throw static::createUndefinedMemberException( + get_called_class(), + $property, + $value + ); + } + + return $member; + } + + /** + * Returns a single member by comparison with the result of an accessor + * method. Additionally returns a default if no associated member is found. + * + * @api + * + * @param string $property The name of the property (accessor method) to match. + * @param mixed $value The value to match. + * @param MultitonInterface|null $default The default value to return. + * @param boolean|null $isCaseSensitive True if the search should be case sensitive. + * + * @return static|null The first member for which $member->{$property}() === $value, or the default value. + */ + final public static function memberByWithDefault( + $property, + $value, + MultitonInterface $default = null, + $isCaseSensitive = null + ) { + if (null === $isCaseSensitive) { + $isCaseSensitive = true; + } + + if (!$isCaseSensitive && is_scalar($value)) { + $value = strtoupper(strval($value)); + } + + return static::memberByPredicateWithDefault( + function (MultitonInterface $member) use ( + $property, + $value, + $isCaseSensitive + ) { + $memberValue = $member->{$property}(); + + if (!$isCaseSensitive && is_scalar($memberValue)) { + $memberValue = strtoupper(strval($memberValue)); + } + + return $memberValue === $value; + }, + $default + ); + } + + /** + * Returns a single member by comparison with the result of an accessor + * method. Additionally returns null if the supplied value is null. + * + * @api + * + * @param string $property The name of the property (accessor method) to match. + * @param mixed $value The value to match, or null. + * @param boolean|null $isCaseSensitive True if the search should be case sensitive. + * + * @return static|null The first member for which $member->{$property}() === $value, or null if the supplied value is null. + * @throws UndefinedMemberExceptionInterface If no associated member is found. + */ + final public static function memberOrNullBy( + $property, + $value, + $isCaseSensitive = null + ) { + $member = static::memberByWithDefault( + $property, + $value, + null, + $isCaseSensitive + ); + if (null === $member) { + if (null === $value) { + return null; + } + + throw static::createUndefinedMemberException( + get_called_class(), + $property, + $value + ); + } + + return $member; + } + + /** + * Returns a single member by predicate callback. + * + * @api + * + * @param callable $predicate The predicate applies to the member to find a match. + * + * @return static The first member for which $predicate($member) evaluates to boolean true. + * @throws UndefinedMemberExceptionInterface If no associated member is found. + */ + final public static function memberByPredicate($predicate) + { + $member = static::memberByPredicateWithDefault($predicate); + + if (null === $member) { + throw static::createUndefinedMemberException( + get_called_class(), + '', + '' + ); + } + + return $member; + } + + /** + * Returns a single member by predicate callback. Additionally returns a + * default if no associated member is found. + * + * @api + * + * @param callable $predicate The predicate applied to the member to find a match. + * @param MultitonInterface|null $default The default value to return. + * + * @return static The first member for which $predicate($member) evaluates to boolean true, or the default value. + */ + final public static function memberByPredicateWithDefault( + $predicate, + MultitonInterface $default = null + ) { + foreach (static::members() as $member) { + if ($predicate($member)) { + return $member; + } + } + + return $default; + } + + /** + * Returns an array of all members in this multiton. + * + * @api + * + * @return array All members. + */ + final public static function members() + { + $class = get_called_class(); + + if (!array_key_exists($class, self::$members)) { + self::$members[$class] = array(); + static::initializeMembers(); + } + + return self::$members[$class]; + } + + /** + * Returns a set of members by comparison with the result of an accessor + * method. + * + * @api + * + * @param string $property The name of the property (accessor method) to match. + * @param mixed $value The value to match. + * @param boolean|null $isCaseSensitive True if the search should be case sensitive. + * + * @return array All members for which $member->{$property}() === $value. + */ + final public static function membersBy( + $property, + $value, + $isCaseSensitive = null + ) { + if (null === $isCaseSensitive) { + $isCaseSensitive = true; + } + + if (!$isCaseSensitive && is_scalar($value)) { + $value = strtoupper(strval($value)); + } + + return static::membersByPredicate( + function (MultitonInterface $member) use ( + $property, + $value, + $isCaseSensitive + ) { + $memberValue = $member->{$property}(); + + if (!$isCaseSensitive && is_scalar($memberValue)) { + $memberValue = strtoupper(strval($memberValue)); + } + + return $memberValue === $value; + } + ); + } + + /** + * Returns a set of members by predicate callback. + * + * @api + * + * @param callable $predicate The predicate applied to the members to find matches. + * + * @return array All members for which $predicate($member) evaluates to boolean true. + */ + final public static function membersByPredicate($predicate) + { + $members = array(); + + foreach (static::members() as $key => $member) { + if ($predicate($member)) { + $members[$key] = $member; + } + } + + return $members; + } + + /** + * Maps static method calls to members. + * + * @api + * + * @param string $key The string key associated with the member. + * @param array $arguments Ignored. + * + * @return static The member associated with the given string key. + * @throws UndefinedMemberExceptionInterface If no associated member is found. + */ + final public static function __callStatic($key, array $arguments) + { + return static::memberByKey($key); + } + + /** + * Returns the string key of this member. + * + * @api + * + * @return string The associated string key of this member. + */ + final public function key() + { + return $this->key; + } + + /** + * Check if this member is in the specified list of members. + * + * @api + * + * @param MultitonInterface $a The first member to check. + * @param MultitonInterface $b The second member to check. + * @param MultitonInterface $c,... Additional members to check. + * + * @return boolean True if this member is in the specified list of members. + */ + final public function anyOf(MultitonInterface $a, MultitonInterface $b) + { + return $this->anyOfArray(func_get_args()); + } + + /** + * Check if this member is in the specified list of members. + * + * @api + * + * @param array $values An array of members to search. + * + * @return boolean True if this member is in the specified list of members. + */ + final public function anyOfArray(array $values) + { + return in_array($this, $values, true); + } + + /** + * Returns a string representation of this member. + * + * @api + * + * Unless overridden, this is simply the string key. + * + * @return string The string representation. + */ + public function __toString() + { + return $this->key(); + } + + /** + * Override this method in child classes to implement one-time + * initialization for a multiton class. + * + * This method is called the first time the members of a multiton are + * accessed. It is called via late static binding, and hence can be + * overridden in child classes. + * + * @api + */ + protected static function initializeMembers() + { + } + + /** + * Override this method in child classes to implement custom undefined + * member exceptions for a multiton class. + * + * @api + * + * @param string $className The name of the class from which the member was requested. + * @param string $property The name of the property used to search for the member. + * @param mixed $value The value of the property used to search for the member. + * @param NativeException|null $cause The cause, if available. + * + * @return UndefinedMemberExceptionInterface The newly created exception. + */ + protected static function createUndefinedMemberException( + $className, + $property, + $value, + NativeException $previous = null + ) { + return new UndefinedMemberException( + $className, + $property, + $value, + $previous + ); + } + + /** + * Construct and register a new multiton member. + * + * @api + * + * If you override the constructor in a child class, you MUST call the parent + * constructor. Calling this constructor is the only way to set the string + * key for this member, and to ensure that the member is correctly + * registered. + * + * @param string $key The string key to associate with this member. + * + * @throws ExtendsConcreteException If the constructed member has an invalid inheritance hierarchy. + */ + protected function __construct($key) + { + $this->key = $key; + + self::registerMember($this); + } + + /** + * Registers the supplied member. + * + * Do not attempt to call this method directly. Instead, ensure that + * AbstractMultiton::__construct() is called from any child classes, as this + * will also handle registration of the member. + * + * @param MultitonInterface $member The member to register. + * @throws ExtendsConcreteException If the supplied member has an invalid inheritance hierarchy. + */ + private static function registerMember(MultitonInterface $member) + { + $reflector = new ReflectionObject($member); + $parentClass = $reflector->getParentClass(); + + if (!$parentClass->isAbstract()) { + throw new ExtendsConcreteException( + get_class($member), + $parentClass->getName() + ); + } + + self::$members[get_called_class()][$member->key()] = $member; + } + + private static $members = array(); + private $key; +} diff --git a/vendor/eloquent/enumeration/src/AbstractValueMultiton.php b/vendor/eloquent/enumeration/src/AbstractValueMultiton.php new file mode 100644 index 0000000..f22d2f0 --- /dev/null +++ b/vendor/eloquent/enumeration/src/AbstractValueMultiton.php @@ -0,0 +1,130 @@ + All members with the supplied value. + */ + final public static function membersByValue($value, $isCaseSensitive = null) + { + return static::membersBy('value', $value, $isCaseSensitive); + } + + /** + * Returns the value of this member. + * + * @api + * + * @return mixed The value of this member. + */ + final public function value() + { + return $this->value; + } + + /** + * Construct and register a new value multiton member. + * + * @api + * + * @param string $key The string key to associate with this member. + * @param mixed $value The value of this member. + * + * @throws ExtendsConcreteException If the constructed member has an invalid inheritance hierarchy. + */ + protected function __construct($key, $value) + { + parent::__construct($key); + + $this->value = $value; + } + + private $value; +} diff --git a/vendor/eloquent/enumeration/src/EnumerationInterface.php b/vendor/eloquent/enumeration/src/EnumerationInterface.php new file mode 100644 index 0000000..875fad8 --- /dev/null +++ b/vendor/eloquent/enumeration/src/EnumerationInterface.php @@ -0,0 +1,21 @@ +className = $className; + $this->property = $property; + $this->value = $value; + + parent::__construct($message, 0, $cause); + } + + /** + * Get the class name. + * + * @return string The class name. + */ + public function className() + { + return $this->className; + } + + /** + * Get the property name. + * + * @return string The property name. + */ + public function property() + { + return $this->property; + } + + /** + * Get the value of the property used to search for the member. + * + * @return mixed The value. + */ + public function value() + { + return $this->value; + } + + private $className; + private $property; + private $value; +} diff --git a/vendor/eloquent/enumeration/src/Exception/ExtendsConcreteException.php b/vendor/eloquent/enumeration/src/Exception/ExtendsConcreteException.php new file mode 100644 index 0000000..308781d --- /dev/null +++ b/vendor/eloquent/enumeration/src/Exception/ExtendsConcreteException.php @@ -0,0 +1,74 @@ +className = $className; + $this->parentClass = $parentClass; + + parent::__construct( + sprintf( + "Class '%s' cannot extend concrete class '%s'.", + $this->className(), + $this->parentClass() + ), + 0, + $cause + ); + } + + /** + * Get the class name of the supplied member. + * + * @return string The class name. + */ + public function className() + { + return $this->className; + } + + /** + * Get the parent class name. + * + * @return string The parent class name. + */ + public function parentClass() + { + return $this->parentClass; + } + + private $className; + private $parentClass; +} diff --git a/vendor/eloquent/enumeration/src/Exception/UndefinedMemberException.php b/vendor/eloquent/enumeration/src/Exception/UndefinedMemberException.php new file mode 100644 index 0000000..dbf343b --- /dev/null +++ b/vendor/eloquent/enumeration/src/Exception/UndefinedMemberException.php @@ -0,0 +1,48 @@ + $values An array of members to search. + * + * @return boolean True if this member is in the specified list of members. + */ + public function anyOfArray(array $values); + + /** + * Returns a string representation of this member. + * + * @api + * + * Unless overridden, this is simply the string key. + * + * @return string + */ + public function __toString(); +} diff --git a/vendor/eloquent/enumeration/src/ValueMultitonInterface.php b/vendor/eloquent/enumeration/src/ValueMultitonInterface.php new file mode 100644 index 0000000..86ac0aa --- /dev/null +++ b/vendor/eloquent/enumeration/src/ValueMultitonInterface.php @@ -0,0 +1,29 @@ +foo('not so private...'); // outputs 'foo is not so private...' +echo $liberator->bar.' = blown'; // outputs 'mind = blown' +``` + +### For classes + +The same concept applies for static methods and properties: + +```php +class SeriousBusiness +{ + static private function baz($adjective) + { + return 'baz is '.$adjective; + } + + static private $qux = 'mind'; +} +``` + +To access these, a **class liberator** must be used instead of an +**object liberator**, but they operate in a similar manner: + +```php +use Eloquent\Liberator\Liberator; + +$liberator = Liberator::liberateClass('SeriousBusiness'); + +echo $liberator->baz('not so private...'); // outputs 'baz is not so private...' +echo $liberator->qux.' = blown'; // outputs 'mind = blown' +``` + +Alternatively, Liberator can generate a class that can be used statically: + +```php +use Eloquent\Liberator\Liberator; + +$liberatorClass = Liberator::liberateClassStatic('SeriousBusiness'); + +echo $liberatorClass::baz('not so private...'); // outputs 'baz is not so private...' +echo $liberatorClass::liberator()->qux.' = blown'; // outputs 'mind = blown' +``` + +Unfortunately, there is (currently) no __getStatic() or __setStatic() in PHP, +so accessing static properties in this way is a not as elegant as it could be. + +## Applications for Liberator + +* Writing [white-box](http://en.wikipedia.org/wiki/White-box_testing) style unit + tests (testing protected/private methods). +* Modifying behaviour of poorly designed third-party libraries. diff --git a/vendor/eloquent/liberator/composer.json b/vendor/eloquent/liberator/composer.json new file mode 100644 index 0000000..3e53895 --- /dev/null +++ b/vendor/eloquent/liberator/composer.json @@ -0,0 +1,26 @@ +{ + "name": "eloquent/liberator", + "description": "A proxy for circumventing PHP access modifier restrictions.", + "keywords": ["access","modifier","object","proxy","private","protected","reflection"], + "homepage": "https://github.com/eloquent/liberator", + "license": "MIT", + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "require": { + "php": ">=5.3.0", + "eloquent/pops": "~3" + }, + "require-dev": { + "icecave/archer": "~0.2" + }, + "autoload": { + "psr-0": { + "Eloquent\\Liberator": "src" + } + } +} diff --git a/vendor/eloquent/liberator/composer.lock b/vendor/eloquent/liberator/composer.lock new file mode 100644 index 0000000..d4d1d43 --- /dev/null +++ b/vendor/eloquent/liberator/composer.lock @@ -0,0 +1,256 @@ +{ + "hash": "01616caf6008c198d376a6a45b115ad7", + "packages": [ + { + "name": "eloquent/pops", + "version": "3.1.0", + "source": { + "type": "git", + "url": "git://github.com/eloquent/pops.git", + "reference": "3.1.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/eloquent/pops/zipball/3.1.0", + "reference": "3.1.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Eloquent\\Pops": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "description": "PHP object proxy system.", + "homepage": "https://github.com/eloquent/pops", + "keywords": [ + "escaping", + "object", + "proxy" + ], + "time": "2012-08-02 06:17:58" + } + ], + "packages-dev": [ + { + "name": "icecave/archer", + "version": "0.2.1", + "source": { + "type": "git", + "url": "https://github.com/IcecaveStudios/archer.git", + "reference": "0.2.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/IcecaveStudios/archer/zipball/0.2.1", + "reference": "0.2.1", + "shasum": "" + }, + "require": { + "phake/phake": ">=1.0,<2.0", + "php": ">=5.3", + "symfony/console": ">=2.0,<3.0", + "symfony/process": ">=2.0,<3.0" + }, + "suggest": { + "ext-openssl": "OpenSSL is required to encrypt GitHub OAuth tokens for artifact publication." + }, + "bin": [ + "bin/archer", + "bin/woodhouse" + ], + "type": "library", + "autoload": { + "psr-0": { + "Icecave\\Archer": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + }, + { + "name": "James Harris", + "email": "james.harris@icecave.com.au" + } + ], + "description": "PHP testing and continuous integration by convention.", + "homepage": "https://github.com/IcecaveStudios/archer", + "keywords": [ + "artifacts", + "coverage", + "phake", + "phpunit", + "test", + "testing", + "unit" + ], + "time": "2013-02-27 04:42:20" + }, + { + "name": "phake/phake", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "git://github.com/mlively/Phake.git", + "reference": "v1.0.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/mlively/Phake/zipball/v1.0.3", + "reference": "v1.0.3", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "src" + ], + "license": [ + "BSD" + ], + "authors": [ + { + "name": "Mike Lively", + "email": "m@digitalsandwich.com" + } + ], + "description": "The Phake mock testing library", + "homepage": "https://github.com/mlively/Phake", + "keywords": [ + "mock", + "testing" + ], + "time": "2012-05-14 08:06:51" + }, + { + "name": "symfony/console", + "version": "v2.2.0", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "v2.2.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/v2.2.0", + "reference": "v2.2.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "http://symfony.com", + "time": "2013-03-01 06:43:14" + }, + { + "name": "symfony/process", + "version": "v2.2.0", + "target-dir": "Symfony/Component/Process", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "v2.2.0-RC3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/v2.2.0-RC3", + "reference": "v2.2.0-RC3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "http://symfony.com", + "time": "2013-02-18 21:28:10" + } + ], + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": [ + + ] +} diff --git a/vendor/eloquent/liberator/src/Eloquent/Liberator/Liberator.php b/vendor/eloquent/liberator/src/Eloquent/Liberator/Liberator.php new file mode 100644 index 0000000..426280b --- /dev/null +++ b/vendor/eloquent/liberator/src/Eloquent/Liberator/Liberator.php @@ -0,0 +1,78 @@ +liberatorReflector = new ReflectionClass($class); + } + + /** + * @param string $method + * @param array &$arguments + * + * @return mixed + */ + public function popsCall($method, array &$arguments) + { + if ($this->liberatorReflector->hasMethod($method)) { + $method = $this->liberatorReflector->getMethod($method); + $method->setAccessible(true); + + return static::popsProxySubValue( + $method->invokeArgs(null, $arguments), + $this->popsRecursive + ); + } + + return parent::popsCall($method, $arguments); + } + + /** + * @param string $method + * @param array &$arguments + * + * @return mixed + */ + public function liberatorCall($method, array &$arguments) + { + return $this->popsCall($method, $arguments); + } + + /** + * @param string $property + * @param mixed $value + */ + public function __set($property, $value) + { + if ($propertyReflector = $this->liberatorPropertyReflector($property)) { + $propertyReflector->setValue(null, $value); + + return; + } + + throw new LogicException( + 'Access to undeclared static property: '. + $this->popsClass. + '::$'. + $property + ); + } + + /** + * @param string $property + * + * @return mixed + */ + public function __get($property) + { + if ($propertyReflector = $this->liberatorPropertyReflector($property)) { + return static::popsProxySubValue( + $propertyReflector->getValue(null), + $this->popsRecursive + ); + } + + throw new LogicException( + 'Access to undeclared static property: '. + $this->popsClass. + '::$'. + $property + ); + } + + /** + * @param string $property + * + * @return boolean + */ + public function __isset($property) + { + if ($propertyReflector = $this->liberatorPropertyReflector($property)) { + return null !== $propertyReflector->getValue(null); + } + + return parent::__isset($property); + } + + /** + * @param string $property + */ + public function __unset($property) + { + if ($propertyReflector = $this->liberatorPropertyReflector($property)) { + $propertyReflector->setValue(null, null); + + return; + } + + throw new LogicException( + 'Access to undeclared static property: '. + $this->popsClass. + '::$'. + $property + ); + } + + /** + * @return string + */ + protected static function popsProxyClass() + { + return __NAMESPACE__.'\Liberator'; + } + + /** + * @param string $property + * + * @return ReflectionProperty|null + */ + protected function liberatorPropertyReflector($property) + { + $classReflector = $this->liberatorReflector; + + while ($classReflector) { + if ($classReflector->hasProperty($property)) { + $propertyReflector = $classReflector->getProperty($property); + $propertyReflector->setAccessible(true); + + return $propertyReflector; + } + + $classReflector = $classReflector->getParentClass(); + } + + return null; + } + + /** + * @var ReflectionClass + */ + protected $liberatorReflector; +} diff --git a/vendor/eloquent/liberator/src/Eloquent/Liberator/LiberatorObject.php b/vendor/eloquent/liberator/src/Eloquent/Liberator/LiberatorObject.php new file mode 100644 index 0000000..72b4fbb --- /dev/null +++ b/vendor/eloquent/liberator/src/Eloquent/Liberator/LiberatorObject.php @@ -0,0 +1,155 @@ +liberatorReflector = new ReflectionObject($object); + } + + /** + * @param string $method + * @param array &$arguments + * + * @return mixed + */ + public function popsCall($method, array &$arguments) + { + if ($this->liberatorReflector->hasMethod($method)) { + $method = $this->liberatorReflector->getMethod($method); + $method->setAccessible(true); + + return $this->popsProxySubValue( + $method->invokeArgs($this->popsObject, $arguments) + ); + } + + return parent::popsCall($method, $arguments); + } + + /** + * @param string $method + * @param array &$arguments + * + * @return mixed + */ + public function liberatorCall($method, array &$arguments) + { + return $this->popsCall($method, $arguments); + } + + /** + * @param string $property + * @param mixed $value + */ + public function __set($property, $value) + { + if ($propertyReflector = $this->liberatorPropertyReflector($property)) { + $propertyReflector->setValue($this->popsObject, $value); + + return; + } + + parent::__set($property, $value); + } + + /** + * @param string $property + * + * @return mixed + */ + public function __get($property) + { + if ($propertyReflector = $this->liberatorPropertyReflector($property)) { + return $this->popsProxySubValue( + $propertyReflector->getValue($this->popsObject) + ); + } + + return parent::__get($property); + } + + /** + * @param string $property + * + * @return boolean + */ + public function __isset($property) + { + if ($propertyReflector = $this->liberatorPropertyReflector($property)) { + return null !== $propertyReflector->getValue($this->popsObject); + } + + return parent::__isset($property); + } + + /** + * @param string $property + */ + public function __unset($property) + { + if ($propertyReflector = $this->liberatorPropertyReflector($property)) { + $propertyReflector->setValue($this->popsObject, null); + + return; + } + + parent::__unset($property); + } + + /** + * @return string + */ + protected static function popsProxyClass() + { + return __NAMESPACE__.'\Liberator'; + } + + /** + * @param string $property + * + * @return ReflectionProperty|null + */ + protected function liberatorPropertyReflector($property) + { + $classReflector = $this->liberatorReflector; + + while ($classReflector) { + if ($classReflector->hasProperty($property)) { + $propertyReflector = $classReflector->getProperty($property); + $propertyReflector->setAccessible(true); + + return $propertyReflector; + } + + $classReflector = $classReflector->getParentClass(); + } + + return null; + } + + /** + * @var ReflectionObject + */ + protected $liberatorReflector; +} diff --git a/vendor/eloquent/liberator/src/Eloquent/Liberator/LiberatorProxy.php b/vendor/eloquent/liberator/src/Eloquent/Liberator/LiberatorProxy.php new file mode 100644 index 0000000..bdf73e6 --- /dev/null +++ b/vendor/eloquent/liberator/src/Eloquent/Liberator/LiberatorProxy.php @@ -0,0 +1,18 @@ +wat(); // outputs "What is this? I don't even..." +echo $proxy->wat(); // outputs "WHAT IS THIS? I DON'T EVEN..." + +echo $confusion->derp; // outputs 'Has anyone really been far even as decided to use even?' +echo $proxy->derp; // outputs 'HAS ANYONE REALLY BEEN FAR EVEN AS DECIDED TO USE EVEN?' +``` + +## Recursive proxies + +Pops proxies can be applied to any value recursively. This comes in handy when +designing, for example, an output escaper (similar to Symfony). + +Here's an example of how such a system could be created for escaping HTML +output: + +```php +namespace OutputEscaper; + +use Eloquent\Pops\Pops; +use Eloquent\Pops\ProxyArray; +use Eloquent\Pops\ProxyClass; +use Eloquent\Pops\ProxyObject; +use Eloquent\Pops\ProxyPrimitive; + +/** + * Escapes output for use in HTML. + */ +class OutputEscaperProxy extends Pops +{ + /** + * The class to use when proxying arrays. + * + * @return string + */ + static protected function proxyArrayClass() + { + return __NAMESPACE__.'\OutputEscaperProxyArray'; + } + + /** + * The class to use when proxying classes. + * + * @return string + */ + static protected function proxyClassClass() + { + return __NAMESPACE__.'\OutputEscaperProxyClass'; + } + + /** + * The class to use when proxying objects. + * + * @return string + */ + static protected function proxyObjectClass() + { + return __NAMESPACE__.'\OutputEscaperProxyObject'; + } + + /** + * The class to use when proxying primitives. + * + * @return string + */ + static protected function proxyPrimitiveClass() + { + return __NAMESPACE__.'\OutputEscaperProxyPrimitive'; + } +} + +/** + * Wraps an array to escape any sub-values for use in HTML. + */ +class OutputEscaperProxyArray extends ProxyArray +{ + /** + * The class to use when proxying sub-values. + * + * @return string + */ + protected static function popsProxyClass() + { + return __NAMESPACE__.'\OutputEscaperProxy'; + } +} + +/** + * Wraps a class to escape any sub-values for use in HTML. + */ +class OutputEscaperProxyClass extends ProxyClass +{ + /** + * The class to use when proxying sub-values. + * + * @return string + */ + protected static function popsProxyClass() + { + return __NAMESPACE__.'\OutputEscaperProxy'; + } +} + +/** + * Wraps an object to escape any sub-values for use in HTML. + */ +class OutputEscaperProxyObject extends ProxyObject +{ + /** + * The class to use when proxying sub-values. + * + * @return string + */ + protected static function popsProxyClass() + { + return __NAMESPACE__.'\OutputEscaperProxy'; + } +} + +/** + * Wraps a primitive to escape its value for use in HTML. + */ +class OutputEscaperProxyPrimitive extends ProxyPrimitive +{ + /** + * Returns the HTML-escaped version of this primitive. + * + * @return string + */ + public function __toString() + { + return htmlspecialchars( + (string) $this->popsPrimitive, + ENT_QUOTES, + 'UTF-8' + ); + } +} +``` + +The output escaper can now be used like so: + +```php +use OutputEscaper\OutputEscaperProxy; +use Eloquent\Pops\Safe\SafeProxy; + +$list = new ArrayIterator(array( + 'foo', + 'bar', + '', + SafeProxy::proxy('ooh...'), +)); +$proxy = OutputEscaperProxy::proxy($list, true); + +echo '
    '.PHP_EOL; +foreach ($proxy as $item) { + echo '
  • '.$item.'
  • '.PHP_EOL; +} +echo '
'; +``` + +Which would output: + +```html +
    +
  • foo
  • +
  • bar
  • +
  • <script>alert(document.cookie);</script>
  • +
  • ooh...
  • +
+``` + +Note that the above example should **NOT** be used in production. Output +escaping is a complex issue that should not be taken lightly. + +### Excluding values from recursion + +Note that in the above example, the last list item was wrapped in a *Safe* +proxy. When Pops applies its proxies, it will skip anything marked as safe in +this manner. + +## Calling methods with by-reference parameters + +Because of PHP limitations, methods with arguments that are passed by reference +must be called in a special way. + +To explain futher, let's assume our class from before also has a method which +accepts a reference: + +```php +class Confusion +{ + public function butWho(&$wasPhone) + { + $wasPhone = 'Hello? Yes this is dog.'; + } +} +``` + +This method cannot be proxied normally because the $wasPhone argument is passed +by reference. The correct way to call the above butWho() method through a Pops +proxy looks like this: + +```php +$proxy = Pops::proxy(new Confusion); + +$wasPhone = null; +$arguments = array(&$wasPhone); + +$proxy->popsCall('butWho', $arguments); + +echo $wasPhone; // outputs 'Hello? Yes this is dog.' +``` + +Note that there **must** be a variable for the $wasPhone argument, and there +**must** be a variable for the arguments themselves. Neither can be passed +directly as a value. The arguments must also contain a **reference** to +$wasPhone argument. + + +[Build Status]: https://raw.github.com/eloquent/pops/gh-pages/artifacts/images/icecave/regular/build-status.png +[Test Coverage]: https://raw.github.com/eloquent/pops/gh-pages/artifacts/images/icecave/regular/coverage.png diff --git a/vendor/eloquent/pops/composer.json b/vendor/eloquent/pops/composer.json new file mode 100644 index 0000000..274682d --- /dev/null +++ b/vendor/eloquent/pops/composer.json @@ -0,0 +1,25 @@ +{ + "name": "eloquent/pops", + "description": "PHP object proxy system.", + "keywords": ["object","proxy","escaping"], + "homepage": "https://github.com/eloquent/pops", + "license": "MIT", + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + } + ], + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "icecave/archer": "~0.2" + }, + "autoload": { + "psr-0": { + "Eloquent\\Pops": "src" + } + } +} diff --git a/vendor/eloquent/pops/composer.lock b/vendor/eloquent/pops/composer.lock new file mode 100644 index 0000000..3f18f61 --- /dev/null +++ b/vendor/eloquent/pops/composer.lock @@ -0,0 +1,214 @@ +{ + "hash": "0c8700d2d0b5c329c9bfdef6853e60b5", + "packages": [ + + ], + "packages-dev": [ + { + "name": "icecave/archer", + "version": "0.2.1", + "source": { + "type": "git", + "url": "https://github.com/IcecaveStudios/archer.git", + "reference": "0.2.1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/IcecaveStudios/archer/zipball/0.2.1", + "reference": "0.2.1", + "shasum": "" + }, + "require": { + "phake/phake": ">=1.0,<2.0", + "php": ">=5.3", + "symfony/console": ">=2.0,<3.0", + "symfony/process": ">=2.0,<3.0" + }, + "suggest": { + "ext-openssl": "OpenSSL is required to encrypt GitHub OAuth tokens for artifact publication." + }, + "bin": [ + "bin/archer", + "bin/woodhouse" + ], + "type": "library", + "autoload": { + "psr-0": { + "Icecave\\Archer": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + }, + { + "name": "James Harris", + "email": "james.harris@icecave.com.au" + } + ], + "description": "PHP testing and continuous integration by convention.", + "homepage": "https://github.com/IcecaveStudios/archer", + "keywords": [ + "artifacts", + "coverage", + "phake", + "phpunit", + "test", + "testing", + "unit" + ], + "time": "2013-02-27 04:42:20" + }, + { + "name": "phake/phake", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "git://github.com/mlively/Phake.git", + "reference": "v1.0.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/mlively/Phake/zipball/v1.0.3", + "reference": "v1.0.3", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "src" + ], + "license": [ + "BSD" + ], + "authors": [ + { + "name": "Mike Lively", + "email": "m@digitalsandwich.com" + } + ], + "description": "The Phake mock testing library", + "homepage": "https://github.com/mlively/Phake", + "keywords": [ + "mock", + "testing" + ], + "time": "2012-05-14 08:06:51" + }, + { + "name": "symfony/console", + "version": "v2.2.0", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "v2.2.0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/v2.2.0", + "reference": "v2.2.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "http://symfony.com", + "time": "2013-03-01 06:43:14" + }, + { + "name": "symfony/process", + "version": "v2.2.0", + "target-dir": "Symfony/Component/Process", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "v2.2.0-RC3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/v2.2.0-RC3", + "reference": "v2.2.0-RC3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "http://symfony.com", + "time": "2013-02-18 21:28:10" + } + ], + "aliases": [ + + ], + "minimum-stability": "stable", + "stability-flags": [ + + ] +} diff --git a/vendor/eloquent/pops/src/Eloquent/Pops/Pops.php b/vendor/eloquent/pops/src/Eloquent/Pops/Pops.php new file mode 100644 index 0000000..aeb3b49 --- /dev/null +++ b/vendor/eloquent/pops/src/Eloquent/Pops/Pops.php @@ -0,0 +1,139 @@ +newInstanceArgs(func_get_args()); + } + + /** + * @param string $class + * @param boolean $recursive + * + * @return ProxyClass + */ + public static function proxyClass($class, $recursive = null) + { + $proxyClassClass = new ReflectionClass(static::proxyClassClass()); + + return $proxyClassClass->newInstanceArgs(func_get_args()); + } + + /** + * @param string $class + * @param boolean $recursive + * @param string $proxyClass + * + * @return string + */ + public static function proxyClassStatic( + $class, + $recursive = null, + $proxyClass = null + ) { + $method = static::proxyClassClass().'::popsGenerateStaticClassProxy'; + + return call_user_func_array($method, func_get_args()); + } + + /** + * @param object $object + * @param boolean $recursive + * + * @return ProxyObject + */ + public static function proxyObject($object, $recursive = null) + { + $class = new ReflectionClass(static::proxyObjectClass()); + + return $class->newInstanceArgs(func_get_args()); + } + + /** + * @param mixed $primitive + * + * @return ProxyPrimitive + */ + public static function proxyPrimitive($primitive) + { + $class = new ReflectionClass(static::proxyPrimitiveClass()); + + return $class->newInstanceArgs(func_get_args()); + } + + /** + * @return string + */ + protected static function proxyArrayClass() + { + return __NAMESPACE__.'\ProxyArray'; + } + + /** + * @return string + */ + protected static function proxyClassClass() + { + return __NAMESPACE__.'\ProxyClass'; + } + + /** + * @return string + */ + protected static function proxyObjectClass() + { + return __NAMESPACE__.'\ProxyObject'; + } + + /** + * @return string + */ + protected static function proxyPrimitiveClass() + { + return __NAMESPACE__.'\ProxyPrimitive'; + } +} diff --git a/vendor/eloquent/pops/src/Eloquent/Pops/Proxy.php b/vendor/eloquent/pops/src/Eloquent/Pops/Proxy.php new file mode 100644 index 0000000..f44acab --- /dev/null +++ b/vendor/eloquent/pops/src/Eloquent/Pops/Proxy.php @@ -0,0 +1,16 @@ +popsArray = $array; + $this->popsRecursive = $recursive; + $this->popsInnerIterator = new ArrayIterator($this->popsArray); + } + + /** + * @return array + */ + public function popsArray() + { + return $this->popsArray; + } + + /** + * @param string $property + * @param mixed $value + */ + public function offsetSet($property, $value) + { + $this->popsArray[$property] = $value; + } + + /** + * @param string $property + * + * @return mixed + */ + public function offsetGet($property) + { + return $this->popsProxySubValue( + $this->popsArray[$property] + ); + } + + /** + * @param string $property + * + * @return boolean + */ + public function offsetExists($property) + { + return isset($this->popsArray[$property]); + } + + /** + * @param string $property + */ + public function offsetUnset($property) + { + unset($this->popsArray[$property]); + } + + /** + * @return integer + */ + public function count() + { + return count($this->popsArray); + } + + /** + * @return mixed + */ + public function current() + { + return $this->popsProxySubValue( + $this->popsInnerIterator->current() + ); + } + + /** + * @return scalar + */ + public function key() + { + return $this->popsInnerIterator->key(); + } + + public function next() + { + $this->popsInnerIterator->next(); + } + + public function rewind() + { + $this->popsInnerIterator->rewind(); + } + + /** + * @return boolean + */ + public function valid() + { + return $this->popsInnerIterator->valid(); + } + + /** + * @return string + */ + public function __toString() + { + return (string) $this->popsProxySubValue( + (string) $this->popsArray + ); + } + + /** + * @return string + */ + protected static function popsProxyClass() + { + return __NAMESPACE__.'\Pops'; + } + + /** + * @param mixed $value + * + * @return mixed + */ + protected function popsProxySubValue($value) + { + if ($this->popsRecursive) { + $popsClass = static::popsProxyClass(); + + return $popsClass::proxy($value, true); + } + + return $value; + } + + /** + * @var array + */ + protected $popsArray; + + /** + * @var boolean + */ + protected $popsRecursive; + + /** + * @var Iterator + */ + protected $popsInnerIterator; +} diff --git a/vendor/eloquent/pops/src/Eloquent/Pops/ProxyClass.php b/vendor/eloquent/pops/src/Eloquent/Pops/ProxyClass.php new file mode 100644 index 0000000..5b2786d --- /dev/null +++ b/vendor/eloquent/pops/src/Eloquent/Pops/ProxyClass.php @@ -0,0 +1,337 @@ +popsClass = $class; + $this->popsRecursive = $recursive; + } + + /** + * @return string + */ + public function popsClass() + { + return $this->popsClass; + } + + /** + * @param string $method + * @param array &$arguments + * + * @return mixed + */ + public function popsCall($method, array &$arguments) + { + return static::popsProxySubValue( + call_user_func_array($this->popsClass.'::'.$method, $arguments), + $this->popsRecursive + ); + } + + /** + * @param string $method + * @param array $arguments + * + * @return mixed + */ + public function __call($method, array $arguments) + { + return $this->popsCall($method, $arguments); + } + + /** + * @param string $property + * @param mixed $value + */ + public function __set($property, $value) + { + $class = $this->popsClass; + $class::$$property = $value; + } + + /** + * @param string $property + * + * @return mixed + */ + public function __get($property) + { + $class = $this->popsClass; + + return static::popsProxySubValue( + $class::$$property, + $this->popsRecursive + ); + } + + /** + * @param string $property + * + * @return boolean + */ + public function __isset($property) + { + $class = $this->popsClass; + + return isset($class::$$property); + } + + /** + * @param string $property + */ + public function __unset($property) + { + $class = $this->popsClass; + + $class::$$property = null; + } + + /** + * @return string + */ + protected static function popsProxyClass() + { + return __NAMESPACE__.'\Pops'; + } + + /** + * @param mixed $value + * @param boolean $recursive + * + * @return mixed + */ + protected static function popsProxySubValue($value, $recursive) + { + if ($recursive) { + $popsClass = static::popsProxyClass(); + + return $popsClass::proxy($value, true); + } + + return $value; + } + + /** + * @param string $originalClass + * @param boolean $recursive + * @param string $proxyClass + * + * @return string + */ + protected static function popsStaticClassProxyDefinition( + $originalClass, + $recursive, + &$proxyClass + ) { + $proxyClass = static::popsStaticClassProxyDefinitionProxyClass( + $originalClass, + $proxyClass + ); + + return + static::popsStaticClassProxyDefinitionHeader( + $proxyClass + ). + ' { '. + static::popsStaticClassProxyDefinitionBody( + $originalClass, + $recursive + ). + ' }' + ; + } + + /** + * @param string $originalClass + * @param string $proxyClass + * + * @return string + */ + protected static function popsStaticClassProxyDefinitionProxyClass( + $originalClass, + $proxyClass + ) { + if (null === $proxyClass) { + $originalClassParts = explode('\\', $originalClass); + $proxyClassPrefix = array_pop($originalClassParts).'_Pops_'; + $proxyClassNamespace = implode('\\', $originalClassParts); + $proxyClass = uniqid($proxyClassPrefix); + if ($proxyClassNamespace) { + $proxyClass = $proxyClassNamespace.'\\'.$proxyClass; + } + } + + return $proxyClass; + } + + /** + * @param string $proxyClass + * + * @return string + */ + protected static function popsStaticClassProxyDefinitionHeader($proxyClass) + { + $proxyClassParts = explode('\\', $proxyClass); + $proxyClass = array_pop($proxyClassParts); + $proxyClassNamespace = implode('\\', $proxyClassParts); + + $header = 'class '.$proxyClass.' extends \\'.get_called_class(); + if ($proxyClassNamespace) { + $header = 'namespace '.$proxyClassNamespace.'; '.$header; + } + + return $header; + } + + /** + * @param string $originalClass + * @param boolean $recursive + * + * @return string + */ + protected static function popsStaticClassProxyDefinitionBody( + $originalClass, + $recursive + ) { + return + 'protected static $popsStaticOriginalClass = '. + var_export($originalClass, true).';'. + ' protected static $popsStaticRecursive = '. + var_export($recursive, true).';' + ; + } + + /** + * @var string + */ + protected static $popsStaticOriginalClass; + + /** + * @var string + */ + protected static $popsStaticRecursive; + + /** + * @var array + */ + protected static $popsStaticProxies = array(); + + /** + * @var string + */ + protected $popsClass; + + /** + * @var boolean + */ + protected $popsRecursive; +} diff --git a/vendor/eloquent/pops/src/Eloquent/Pops/ProxyObject.php b/vendor/eloquent/pops/src/Eloquent/Pops/ProxyObject.php new file mode 100644 index 0000000..0163423 --- /dev/null +++ b/vendor/eloquent/pops/src/Eloquent/Pops/ProxyObject.php @@ -0,0 +1,287 @@ +popsObject = $object; + $this->popsRecursive = $recursive; + } + + /** + * @return object + */ + public function popsObject() + { + return $this->popsObject; + } + + /** + * @param string $method + * @param array &$arguments + * + * @return mixed + */ + public function popsCall($method, array &$arguments) + { + return $this->popsProxySubValue( + call_user_func_array(array($this->popsObject, $method), $arguments) + ); + } + + /** + * @param string $method + * @param array $arguments + * + * @return mixed + */ + public function __call($method, array $arguments) + { + return $this->popsCall($method, $arguments); + } + + /** + * @param string $property + * @param mixed $value + */ + public function __set($property, $value) + { + $this->popsObject->$property = $value; + } + + /** + * @param string $property + * + * @return mixed + */ + public function __get($property) + { + return $this->popsProxySubValue( + $this->popsObject->$property + ); + } + + /** + * @param string $property + * + * @return boolean + */ + public function __isset($property) + { + return isset($this->popsObject->$property); + } + + /** + * @param string $property + */ + public function __unset($property) + { + unset($this->popsObject->$property); + } + + /** + * @param string $property + * @param mixed $value + */ + public function offsetSet($property, $value) + { + $this->__call('offsetSet', func_get_args()); + } + + /** + * @param string $property + * + * @return mixed + */ + public function offsetGet($property) + { + return $this->__call('offsetGet', func_get_args()); + } + + /** + * @param string $property + * + * @return boolean + */ + public function offsetExists($property) + { + return $this->__call('offsetExists', func_get_args()); + } + + /** + * @param string $property + */ + public function offsetUnset($property) + { + $this->__call('offsetUnset', func_get_args()); + } + + /** + * @return integer + */ + public function count() + { + return $this->__call('count', array()); + } + + /** + * @return mixed + */ + public function current() + { + return $this->popsProxySubValue( + $this->popsInnerIterator()->current() + ); + } + + /** + * @return scalar + */ + public function key() + { + return $this->popsInnerIterator()->key(); + } + + public function next() + { + $this->popsInnerIterator()->next(); + } + + public function rewind() + { + $this->popsInnerIterator()->rewind(); + } + + /** + * @return boolean + */ + public function valid() + { + return $this->popsInnerIterator()->valid(); + } + + /** + * @return string + */ + public function __toString() + { + return (string) $this->__call('__toString', array()); + } + + /** + * @return mixed + */ + public function __invoke() + { + if (!method_exists($this->popsObject, '__invoke')) { + throw new BadMethodCallException( + 'Call to undefined method '. + get_class($this->popsObject).'::__invoke()' + ); + } + + return $this->popsProxySubValue( + call_user_func_array($this->popsObject, func_get_args()) + ); + } + + /** + * @return string + */ + protected static function popsProxyClass() + { + return __NAMESPACE__.'\Pops'; + } + + /** + * @return Iterator + */ + protected function popsInnerIterator() + { + if (null !== $this->popsInnerIterator) { + return $this->popsInnerIterator; + } + + if ($this->popsObject instanceof Iterator) { + $this->popsInnerIterator = $this->popsObject; + } elseif ($this->popsObject instanceof IteratorAggregate) { + $this->popsInnerIterator = $this->popsObject->getIterator(); + } else { + throw new LogicException( + 'Proxied object is not an instance of Traversable' + ); + } + + return $this->popsInnerIterator; + } + + /** + * @param mixed $value + * + * @return mixed + */ + protected function popsProxySubValue($value) + { + if ($this->popsRecursive) { + $popsClass = static::popsProxyClass(); + + return $popsClass::proxy($value, true); + } + + return $value; + } + + /** + * @var object + */ + protected $popsObject; + + /** + * @var boolean + */ + protected $popsRecursive; + + /** + * @var Iterator + */ + protected $popsInnerIterator; +} diff --git a/vendor/eloquent/pops/src/Eloquent/Pops/ProxyPrimitive.php b/vendor/eloquent/pops/src/Eloquent/Pops/ProxyPrimitive.php new file mode 100644 index 0000000..5c9cade --- /dev/null +++ b/vendor/eloquent/pops/src/Eloquent/Pops/ProxyPrimitive.php @@ -0,0 +1,44 @@ +popsPrimitive = $primitive; + } + + /** + * @return object + */ + public function popsPrimitive() + { + return $this->popsPrimitive; + } + + /** + * @return string + */ + public function __toString() + { + return (string) $this->popsPrimitive; + } + + /** + * @var mixed + */ + protected $popsPrimitive; +} diff --git a/vendor/eloquent/pops/src/Eloquent/Pops/Safe/Safe.php b/vendor/eloquent/pops/src/Eloquent/Pops/Safe/Safe.php new file mode 100644 index 0000000..6ed92ba --- /dev/null +++ b/vendor/eloquent/pops/src/Eloquent/Pops/Safe/Safe.php @@ -0,0 +1,18 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_WhiteSpace_MultiLineArrayCommaSniff. + * + * Throws warnings if the last item in a multi line array does not have a + * trailing comma + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author wicliff wolda + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_Arrays_MultiLineArrayCommaSniff + implements PHP_CodeSniffer_Sniff +{ + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + ); + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array( + T_ARRAY, + T_OPEN_SHORT_ARRAY, + ); + + }//end register() + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + $open = $tokens[$stackPtr]; + + if ($open['code'] === T_ARRAY) { + $closePtr = $open['parenthesis_closer']; + } else { + $closePtr = $open['bracket_closer']; + } + + if ($open['line'] <> $tokens[$closePtr]['line']) { + $lastComma = $phpcsFile->findPrevious(T_COMMA, $closePtr); + + while ($lastComma < $closePtr -1) { + $lastComma++; + + if ($tokens[$lastComma]['code'] !== T_WHITESPACE + && $tokens[$lastComma]['code'] !== T_COMMENT + ) { + $phpcsFile->addError( + 'Add a comma after each item in a multi-line array', + $stackPtr, + 'Invalid' + ); + break; + } + } + } + + }//end process() + +}//end class + diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Classes/MultipleClassesOneFileSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Classes/MultipleClassesOneFileSniff.php new file mode 100644 index 0000000..b8132b8 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Classes/MultipleClassesOneFileSniff.php @@ -0,0 +1,91 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_Classes_MultipleClassesOneFileSniff. + * + * Throws errors if multiple classes are defined in a single file. + * + * Symfony coding standard specifies: "Define one class per file;" + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author Dave Hauenstein + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_Classes_MultipleClassesOneFileSniff implements PHP_CodeSniffer_Sniff +{ + /** + * The number of times the T_CLASS token is encountered in the file. + * + * @var int + */ + protected $classCount = 0; + + /** + * The current file this class is operating on. + * + * @var string + */ + protected $currentFile; + + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + ); + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array(T_CLASS); + } + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile All the tokens found in the document. + * @param int $stackPtr The position of the current token in + * the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + if ($this->currentFile !== $phpcsFile->getFilename()) { + $this->classCount = 0; + $this->currentFile = $phpcsFile->getFilename(); + } + + $this->classCount++; + + if ($this->classCount > 1) { + $phpcsFile->addError( + 'Multiple classes defined in a single file', + $stackPtr + ); + } + + return; + } +} diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Classes/PropertyDeclarationSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Classes/PropertyDeclarationSniff.php new file mode 100644 index 0000000..0134db0 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Classes/PropertyDeclarationSniff.php @@ -0,0 +1,92 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_Classes_PropertyDeclarationSniff. + * + * Throws warnings if properties are declared after methods + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author wicliff wolda + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_Classes_PropertyDeclarationSniff implements PHP_CodeSniffer_Sniff +{ + + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + ); + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array( + T_CLASS, + ); + }//end register() + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + $scope = $phpcsFile->findNext( + T_FUNCTION, + $stackPtr, + isset($tokens[$stackPtr]['scope_closer']) ? $tokens[$stackPtr]['scope_closer'] : null + ); + + $wantedTokens = array( + T_PUBLIC, + T_PROTECTED, + T_PRIVATE + ); + + while ($scope) { + $scope = $phpcsFile->findNext( + $wantedTokens, + $scope + 1, + isset($tokens[$stackPtr]['scope_closer']) ? $tokens[$stackPtr]['scope_closer'] : null + ); + + if ($scope && $tokens[$scope + 2]['code'] === T_VARIABLE) { + $phpcsFile->addError( + 'Declare class properties before methods', + $scope, + 'Invalid' + ); + } + } + }//end process() + +}//end class diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Commenting/ClassCommentSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Commenting/ClassCommentSniff.php new file mode 100644 index 0000000..e053676 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Commenting/ClassCommentSniff.php @@ -0,0 +1,114 @@ + + * @author Marc McIntyre + * @copyright 2006 Squiz Pty Ltd (ABN 77 084 670 600) + * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence + * @version CVS: $Id: ClassCommentSniff.php 301632 2010-07-28 01:57:56Z squiz $ + * @link http://pear.php.net/package/PHP_CodeSniffer + */ + +if (class_exists('PHP_CodeSniffer_Tokenizers_Comment', true) === false) { + $error = 'Class PHP_CodeSniffer_Tokenizers_Comment not found'; + throw new PHP_CodeSniffer_Exception($error); +} + +if (class_exists('PEAR_Sniffs_Commenting_ClassCommentSniff', true) === false) { + $error = 'Class PEAR_Sniffs_Commenting_ClassCommentSniff not found'; + throw new PHP_CodeSniffer_Exception($error); +} + +/** + * Parses and verifies the doc comments for classes. + * + * Verifies that : + *
    + *
  • A doc comment exists.
  • + *
  • There is a blank newline after the short description.
  • + *
  • There is a blank newline between the long and short description.
  • + *
  • There is a blank newline between the long description and tags.
  • + *
  • Check the order of the tags.
  • + *
  • Check the indentation of each tag.
  • + *
  • Check required and optional tags and the format of their content.
  • + *
+ * + * @category PHP + * @package PHP_CodeSniffer + * @author Greg Sherwood + * @author Marc McIntyre + * @copyright 2006 Squiz Pty Ltd (ABN 77 084 670 600) + * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence + * @version Release: 1.3.0RC2 + * @link http://pear.php.net/package/PHP_CodeSniffer + */ +class Symfony2_Sniffs_Commenting_ClassCommentSniff extends PEAR_Sniffs_Commenting_ClassCommentSniff +{ + /** + * Tags in correct order and related info. + * + * @var array + */ + protected $tags = array( + 'category' => array( + 'required' => false, + 'allow_multiple' => false, + 'order_text' => 'precedes @package', + ), + 'package' => array( + 'required' => false, + 'allow_multiple' => false, + 'order_text' => 'follows @category', + ), + 'subpackage' => array( + 'required' => false, + 'allow_multiple' => false, + 'order_text' => 'follows @package', + ), + 'author' => array( + 'required' => false, + 'allow_multiple' => true, + 'order_text' => 'follows @subpackage (if used) or @package', + ), + 'copyright' => array( + 'required' => false, + 'allow_multiple' => true, + 'order_text' => 'follows @author', + ), + 'license' => array( + 'required' => false, + 'allow_multiple' => false, + 'order_text' => 'follows @copyright (if used) or @author', + ), + 'version' => array( + 'required' => false, + 'allow_multiple' => false, + 'order_text' => 'follows @license', + ), + 'link' => array( + 'required' => false, + 'allow_multiple' => true, + 'order_text' => 'follows @version', + ), + 'see' => array( + 'required' => false, + 'allow_multiple' => true, + 'order_text' => 'follows @link', + ), + 'since' => array( + 'required' => false, + 'allow_multiple' => false, + 'order_text' => 'follows @see (if used) or @link', + ), + 'deprecated' => array( + 'required' => false, + 'allow_multiple' => false, + 'order_text' => 'follows @since (if used) or @see (if used) or @link', + ), + ); +} diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Commenting/FunctionCommentSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Commenting/FunctionCommentSniff.php new file mode 100644 index 0000000..8ca9682 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Commenting/FunctionCommentSniff.php @@ -0,0 +1,168 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +if (class_exists('PEAR_Sniffs_Commenting_FunctionCommentSniff', true) === false) { + $error = 'Class PEAR_Sniffs_Commenting_FunctionCommentSniff not found'; + throw new PHP_CodeSniffer_Exception($error); +} + +/** + * Symfony2 standard customization to PEARs FunctionCommentSniff. + * + * Verifies that : + *
    + *
  • There is a @return tag if a return statement exists inside the method
  • + *
+ * + * @category PHP + * @package PHP_CodeSniffer + * @author Felix Brandt + * @license http://spdx.org/licenses/BSD-3-Clause BSD 3-clause "New" or "Revised" License + * @link http://pear.php.net/package/PHP_CodeSniffer + */ +class Symfony2_Sniffs_Commenting_FunctionCommentSniff extends PEAR_Sniffs_Commenting_FunctionCommentSniff +{ + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + if (false === $commentEnd = $phpcsFile->findPrevious(array(T_COMMENT, T_DOC_COMMENT, T_CLASS, T_FUNCTION, T_OPEN_TAG), ($stackPtr - 1))) { + return; + } + + $tokens = $phpcsFile->getTokens(); + $code = $tokens[$commentEnd]['code']; + + // a comment is not required on protected/private methods + $method = $phpcsFile->getMethodProperties($stackPtr); + $commentRequired = 'public' == $method['scope']; + + if (($code === T_COMMENT && !$commentRequired) + || ($code !== T_DOC_COMMENT && !$commentRequired) + ) { + return; + } + + parent::process($phpcsFile, $stackPtr); + } + + /** + * Process the return comment of this function comment. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * @param int $commentStart The position in the stack where the comment started. + * + * @return void + */ + protected function processReturn(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $commentStart) + { + + if ($this->isInheritDoc($phpcsFile, $stackPtr)) { + return; + } + + $tokens = $phpcsFile->getTokens(); + + // Only check for a return comment if a non-void return statement exists + if (isset($tokens[$stackPtr]['scope_opener'])) { + // Start inside the function + $start = $phpcsFile->findNext(T_OPEN_CURLY_BRACKET, $stackPtr, $tokens[$stackPtr]['scope_closer']); + for ($i = $start; $i < $tokens[$stackPtr]['scope_closer']; ++$i) { + // Skip closures + if ($tokens[$i]['code'] === T_CLOSURE) { + $i = $tokens[$i]['scope_closer']; + continue; + } + + // Found a return not in a closure statement + // Run the check on the first which is not only 'return;' + if ($tokens[$i]['code'] === T_RETURN && $this->isMatchingReturn($tokens, $i)) { + parent::processReturn($phpcsFile, $stackPtr, $commentStart); + break; + } + } + } + + } /* end processReturn() */ + + /** + * Is the comment an inheritdoc? + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * + * @return boolean True if the comment is an inheritdoc + */ + protected function isInheritDoc(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + + $start = $phpcsFile->findPrevious(T_DOC_COMMENT_OPEN_TAG, $stackPtr - 1); + $end = $phpcsFile->findNext(T_DOC_COMMENT_CLOSE_TAG, $start); + + $content = $phpcsFile->getTokensAsString($start, ($end - $start)); + + return preg_match('#{@inheritdoc}#i', $content) === 1; + } // end isInheritDoc() + + /** + * Process the function parameter comments. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * @param int $commentStart The position in the stack where the comment started. + * + * @return void + */ + protected function processParams(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $commentStart) + { + $tokens = $phpcsFile->getTokens(); + + if ($this->isInheritDoc($phpcsFile, $stackPtr)) { + return; + } + + parent::processParams($phpcsFile, $stackPtr, $commentStart); + } // end processParams() + + /** + * Is the return statement matching? + * + * @param array $tokens Array of tokens + * @param int $returnPos Stack position of the T_RETURN token to process + * + * @return boolean True if the return does not return anything + */ + protected function isMatchingReturn($tokens, $returnPos) + { + do { + $returnPos++; + } while ($tokens[$returnPos]['code'] === T_WHITESPACE); + + return $tokens[$returnPos]['code'] !== T_SEMICOLON; + } + +}//end class diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Formatting/BlankLineBeforeReturnSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Formatting/BlankLineBeforeReturnSniff.php new file mode 100644 index 0000000..96ff513 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Formatting/BlankLineBeforeReturnSniff.php @@ -0,0 +1,93 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_Formatting_BlankLineBeforeReturnSniff. + * + * Throws errors if there's no blank line before return statements. Symfony + * coding standard specifies: "Add a blank line before return statements, + * unless the return is alone inside a statement-group (like an if statement);" + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author Dave Hauenstein + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_Formatting_BlankLineBeforeReturnSniff implements PHP_CodeSniffer_Sniff +{ + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + 'JS', + ); + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array(T_RETURN); + } + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile All the tokens found in the document. + * @param int $stackPtr The position of the current token in + * the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + $current = $stackPtr; + $previousLine = $tokens[$stackPtr]['line'] - 1; + $prevLineTokens = array(); + + while ($current >= 0 && $tokens[$current]['line'] >= $previousLine) { + if ($tokens[$current]['line'] == $previousLine + && $tokens[$current]['type'] !== 'T_WHITESPACE' + && $tokens[$current]['type'] !== 'T_COMMENT' + && $tokens[$current]['type'] !== 'T_DOC_COMMENT_CLOSE_TAG' + && $tokens[$current]['type'] !== 'T_DOC_COMMENT_WHITESPACE' + ) { + $prevLineTokens[] = $tokens[$current]['type']; + } + $current--; + } + + if (isset($prevLineTokens[0]) + && ($prevLineTokens[0] === 'T_OPEN_CURLY_BRACKET' + || $prevLineTokens[0] === 'T_COLON') + ) { + return; + } else if (count($prevLineTokens) > 0) { + $phpcsFile->addError( + 'Missing blank line before return statement', + $stackPtr + ); + } + + return; + } +} diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Functions/ScopeOrderSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Functions/ScopeOrderSniff.php new file mode 100644 index 0000000..ea6f356 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Functions/ScopeOrderSniff.php @@ -0,0 +1,107 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_Functions_ScopeOrderSniff. + * + * Throws warnings if properties are declared after methods + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author wicliff wolda + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_Functions_ScopeOrderSniff implements PHP_CodeSniffer_Sniff +{ + + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + ); + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array( + T_CLASS, + T_INTERFACE, + ); + }//end register() + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + $function = $stackPtr; + + $scopes = array( + 0 => T_PUBLIC, + 1 => T_PROTECTED, + 2 => T_PRIVATE, + ); + + $whitelisted = array( + '__construct', + 'setUp', + 'tearDown', + ); + + while ($function) { + $function = $phpcsFile->findNext( + T_FUNCTION, + $function + 1, + isset($tokens[$stackPtr]['scope_closer']) ? $tokens[$stackPtr]['scope_closer'] : null + ); + + if (isset($tokens[$function]['parenthesis_opener'])) { + $scope = $phpcsFile->findPrevious($scopes, $function -1, $stackPtr); + $name = $phpcsFile->findNext(T_STRING, $function + 1, $tokens[$function]['parenthesis_opener']); + + if ($scope && $name && !in_array($tokens[$name]['content'], $whitelisted)) { + $current = array_keys($scopes, $tokens[$scope]['code']); + $current = $current[0]; + + if (isset($previous) && $current < $previous) { + $phpcsFile->addError( + 'Declare public methods first, then protected ones and finally private ones', + $scope, + 'Invalid' + ); + } + + $previous = $current; + } + } + } + }//end process() + +}//end class diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/NamingConventions/ValidClassNameSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/NamingConventions/ValidClassNameSniff.php new file mode 100644 index 0000000..7206507 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/NamingConventions/ValidClassNameSniff.php @@ -0,0 +1,145 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_NamingConventions_ValidClassNameSniff. + * + * Throws errors if symfony's naming conventions are not met. + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author Dave Hauenstein + * @author wicliff wolda + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_NamingConventions_ValidClassNameSniff implements PHP_CodeSniffer_Sniff +{ + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + ); + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array( + T_INTERFACE, + T_TRAIT, + T_EXTENDS, + T_ABSTRACT + ); + } + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile All the tokens found in the document. + * @param int $stackPtr The position of the current token in + * the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + $line = $tokens[$stackPtr]['line']; + + while ($tokens[$stackPtr]['line'] == $line) { + + /* + * Suffix interfaces with Interface; + */ + if ('T_INTERFACE' == $tokens[$stackPtr]['type']) { + $name = $phpcsFile->findNext(T_STRING, $stackPtr); + + if ($name && substr($tokens[$name]['content'], -9) != 'Interface') { + $phpcsFile->addError( + 'Interface name is not suffixed with "Interface"', + $stackPtr, + 'InvalidInterfaceName' + ); + } + break; + } + + /* + * Suffix traits with Trait; + */ + if ('T_TRAIT' == $tokens[$stackPtr]['type']) { + $name = $phpcsFile->findNext(T_STRING, $stackPtr); + + if ($name && substr($tokens[$name]['content'], -5) != 'Trait') { + $phpcsFile->addError( + 'Trait name is not suffixed with "Trait"', + $stackPtr, + 'InvalidTraitName' + ); + } + break; + } + + /* + * Suffix exceptions with Exception; + */ + if ('T_EXTENDS' == $tokens[$stackPtr]['type']) { + $extend = $phpcsFile->findNext(T_STRING, $stackPtr); + + if ($extend && substr($tokens[$extend]['content'], -9) == 'Exception') { + $class = $phpcsFile->findPrevious(T_CLASS, $stackPtr); + $name = $phpcsFile->findNext(T_STRING, $class); + + if ($name && substr($tokens[$name]['content'], -9) != 'Exception') { + $phpcsFile->addError( + 'Exception name is not suffixed with "Exception"', + $stackPtr, + 'InvalidExceptionName' + ); + } + } + break; + } + + /* + * Prefix abstract classes with Abstract. + */ + if ('T_ABSTRACT' == $tokens[$stackPtr]['type']) { + $name = $phpcsFile->findNext(T_STRING, $stackPtr); + $function = $phpcsFile->findNext(T_FUNCTION, $stackPtr); + + // making sure we're not dealing with an abstract function + if ($name && (is_null($function) || $name < $function) && substr($tokens[$name]['content'], 0, 8) != 'Abstract') { + $phpcsFile->addError( + 'Abstract class name is not prefixed with "Abstract"', + $stackPtr, + 'InvalidAbstractName' + ); + } + break; + } + + $stackPtr++; + } + + return; + } +} diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Objects/ObjectInstantiationSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Objects/ObjectInstantiationSniff.php new file mode 100644 index 0000000..1cd15c8 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Objects/ObjectInstantiationSniff.php @@ -0,0 +1,92 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_Objects_ObjectInstantiationSniff. + * + * Throws a warning if an object isn't instantiated using parenthesis. + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author wicliff wolda + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_Objects_ObjectInstantiationSniff implements PHP_CodeSniffer_Sniff +{ + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + ); + + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array( + T_NEW, + ); + + }//end register() + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + $allowed = array( + T_STRING, + T_NS_SEPARATOR, + T_VARIABLE, + T_STATIC, + ); + + $object = $stackPtr; + $line = $tokens[$object]['line']; + + while ($object && $tokens[$object]['line'] === $line) { + $object = $phpcsFile->findNext($allowed, $object + 1); + + if ($tokens[$object]['line'] === $line && !in_array($tokens[$object + 1]['code'], $allowed)) { + if ($tokens[$object + 1]['code'] !== T_OPEN_PARENTHESIS) { + $phpcsFile->addError( + 'Use parentheses when instantiating classes', + $stackPtr, + 'Invalid' + ); + } + + break; + } + } + + }//end process() + +}//end class diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Scope/MethodScopeSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Scope/MethodScopeSniff.php new file mode 100644 index 0000000..9d9dae9 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/Scope/MethodScopeSniff.php @@ -0,0 +1,71 @@ + + * @author Marc McIntyre + * @copyright 2006 Squiz Pty Ltd (ABN 77 084 670 600) + * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence + * @version CVS: $Id: MethodScopeSniff.php 301632 2010-07-28 01:57:56Z squiz $ + * @link http://pear.php.net/package/PHP_CodeSniffer + */ + +if (class_exists('PHP_CodeSniffer_Standards_AbstractScopeSniff', true) === false) { + throw new PHP_CodeSniffer_Exception('Class PHP_CodeSniffer_Standards_AbstractScopeSniff not found'); +} + +/** + * Verifies that class members have scope modifiers. + * + * @category PHP + * @package PHP_CodeSniffer + * @author Greg Sherwood + * @author Marc McIntyre + * @copyright 2006 Squiz Pty Ltd (ABN 77 084 670 600) + * @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence + * @version Release: 1.3.0 + * @link http://pear.php.net/package/PHP_CodeSniffer + */ +class Symfony2_Sniffs_Scope_MethodScopeSniff extends PHP_CodeSniffer_Standards_AbstractScopeSniff +{ + /** + * Constructs a Symfony2_Sniffs_Scope_MethodScopeSniff. + */ + public function __construct() + { + parent::__construct(array(T_CLASS), array(T_FUNCTION)); + + }//end __construct() + + /** + * Processes the function tokens within the class. + * + * @param PHP_CodeSniffer_File $phpcsFile The file where this token was found. + * @param int $stackPtr The position where the token was found. + * @param int $currScope The current scope opener token. + * + * @return void + */ + protected function processTokenWithinScope(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $currScope) + { + $tokens = $phpcsFile->getTokens(); + + $methodName = $phpcsFile->getDeclarationName($stackPtr); + if ($methodName === null) { + // Ignore closures. + return; + } + + $modifier = $phpcsFile->findPrevious(PHP_CodeSniffer_Tokens::$scopeModifiers, $stackPtr); + if (($modifier === false) || ($tokens[$modifier]['line'] !== $tokens[$stackPtr]['line'])) { + $error = 'No scope modifier specified for function "%s"'; + $data = array($methodName); + $phpcsFile->addError($error, $stackPtr, 'Missing', $data); + } + + }//end processTokenWithinScope() +}//end class diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/AssignmentSpacingSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/AssignmentSpacingSniff.php new file mode 100644 index 0000000..8c050b4 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/AssignmentSpacingSniff.php @@ -0,0 +1,71 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_WhiteSpace_AssignmentSpacingSniff. + * + * Throws warnings if an assignment operator isn't surrounded with whitespace. + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author wicliff wolda + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_WhiteSpace_AssignmentSpacingSniff implements PHP_CodeSniffer_Sniff +{ + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + ); + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return PHP_CodeSniffer_Tokens::$assignmentTokens; + + }//end register() + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + + if ($tokens[$stackPtr -1]['code'] !== T_WHITESPACE || $tokens[$stackPtr +1]['code'] !== T_WHITESPACE) { + $phpcsFile->addError( + 'Add a single space around assignment operators', + $stackPtr, + 'Invalid' + ); + } + }//end process() + +}//end class diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/BinaryOperatorSpacingSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/BinaryOperatorSpacingSniff.php new file mode 100644 index 0000000..f04ee44 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/BinaryOperatorSpacingSniff.php @@ -0,0 +1,71 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_WhiteSpace_BinaryOperatorSpacingSniff. + * + * Throws warnings if a binary operator isn't surrounded with whitespace. + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author wicliff wolda + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_WhiteSpace_BinaryOperatorSpacingSniff +{ + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + ); + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return PHP_CodeSniffer_Tokens::$comparisonTokens; + + }//end register() + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + + if ($tokens[$stackPtr -1]['code'] !== T_WHITESPACE || $tokens[$stackPtr +1]['code'] !== T_WHITESPACE) { + $phpcsFile->addError( + 'Add a single space around binary operators', + $stackPtr, + 'Invalid' + ); + } + }//end process() + +}//end class diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/CommaSpacingSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/CommaSpacingSniff.php new file mode 100644 index 0000000..c98c95a --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/CommaSpacingSniff.php @@ -0,0 +1,77 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_WhiteSpace_CommaSpacingSniff. + * + * Throws warnings if comma isn't followed by a whitespace. + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author wicliff wolda + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_WhiteSpace_CommaSpacingSniff implements PHP_CodeSniffer_Sniff +{ + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + ); + + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array( + T_COMMA, + ); + + }//end register() + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + $line = $tokens[$stackPtr]['line']; + + if ($tokens[$stackPtr + 1]['line'] === $line && $tokens[$stackPtr + 1]['code'] !== T_WHITESPACE) { + $phpcsFile->addError( + 'Add a single space after each comma delimiter', + $stackPtr, + 'Invalid' + ); + } + + }//end process() + +}//end class + diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/DiscourageFitzinatorSniff.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/DiscourageFitzinatorSniff.php new file mode 100644 index 0000000..1ee81cc --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Sniffs/WhiteSpace/DiscourageFitzinatorSniff.php @@ -0,0 +1,79 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Symfony2_Sniffs_WhiteSpace_DiscourageFitzinatorSniff. + * + * Throws warnings if a file contains trailing whitespace. + * + * @category PHP + * @package PHP_CodeSniffer-Symfony2 + * @author Justin Hileman + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Sniffs_WhiteSpace_DiscourageFitzinatorSniff implements PHP_CodeSniffer_Sniff +{ + + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + 'JS', + 'CSS', + ); + + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array(T_WHITESPACE); + + } + + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile All the tokens found in the document. + * @param int $stackPtr The position of the current token in + * the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + + // Make sure this is trailing whitespace. + $line = $tokens[$stackPtr]['line']; + if (($stackPtr < count($tokens) - 1) && $tokens[($stackPtr + 1)]['line'] === $line) { + return; + } + + if (strpos($tokens[$stackPtr]['content'], "\n") > 0 || strpos($tokens[$stackPtr]['content'], "\r") > 0) { + $warning = 'Please trim any trailing whitespace'; + $phpcsFile->addWarning($warning, $stackPtr); + } + + } + +} diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Arrays/MultiLineArrayCommaUnitTest.inc b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Arrays/MultiLineArrayCommaUnitTest.inc new file mode 100644 index 0000000..dc8f061 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Arrays/MultiLineArrayCommaUnitTest.inc @@ -0,0 +1,73 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Unit test class for the MultiLineArrayComma sniff. + * + * A sniff unit test checks a .inc file for expected violations of a single + * coding standard. Expected errors and warnings are stored in this class. + * + * @category PHP + * @package PHP_CodeSniffer + * @author Craige leeder + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Tests_Arrays_MultiLineArrayCommaUnitTest extends AbstractSniffUnitTest +{ + /** + * Returns the lines where errors should occur. + * + * The key of the array should represent the line number and the value + * should represent the number of errors that should occur on that line. + * + * @return array + */ + public function getErrorList() + { + return array( + 11 => 1, + 24 => 1, + 37 => 1, + 47 => 1, + 60 => 1, + 70 => 1, + ); + } + + /** + * Returns the lines where warnings should occur. + * + * The key of the array should represent the line number and the value + * should represent the number of errors that should occur on that line. + * + * @return array(int => int) + */ + public function getWarningList() + { + return array(); + } +} diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Commenting/FunctionCommentUnitTest.inc b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Commenting/FunctionCommentUnitTest.inc new file mode 100644 index 0000000..e4819eb --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Commenting/FunctionCommentUnitTest.inc @@ -0,0 +1,29 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Unit test class for the FunctionComment sniff. + * + * A sniff unit test checks a .inc file for expected violations of a single + * coding standard. Expected errors and warnings are stored in this class. + * + * @category PHP + * @package PHP_CodeSniffer + * @author Sullivan Senechal + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Tests_Commenting_FunctionCommentUnitTest extends AbstractSniffUnitTest +{ + /** + * Returns the lines where errors should occur. + * + * The key of the array should represent the line number and the value + * should represent the number of errors that should occur on that line. + * + * @return array + */ + public function getErrorList() + { + return array( + 5 => 1, + ); + } + + /** + * Returns the lines where warnings should occur. + * + * The key of the array should represent the line number and the value + * should represent the number of warnings that should occur on that line. + * + * @return array(int => int) + */ + protected function getWarningList() + { + return array(); + } +} diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Formatting/BlankLineBeforeReturnUnitTest.inc b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Formatting/BlankLineBeforeReturnUnitTest.inc new file mode 100644 index 0000000..90dd845 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Formatting/BlankLineBeforeReturnUnitTest.inc @@ -0,0 +1,46 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Unit test class for the BlankLineBeforeReturn sniff. + * + * A sniff unit test checks a .inc file for expected violations of a single + * coding standard. Expected errors and warnings are stored in this class. + * + * @category PHP + * @package PHP_CodeSniffer + * @author Tom Klingenberg + * @copyright 2012 Tom Klingenberg, some rights reserved. + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ +class Symfony2_Tests_Formatting_BlankLineBeforeReturnUnitTest extends AbstractSniffUnitTest +{ + /** + * Returns the lines where errors should occur. + * + * The key of the array should represent the line number and the value + * should represent the number of errors that should occur on that line. + * + * @return array(int => int) + */ + public function getErrorList() + { + return array( + 37 => 1 + ); + } + + /** + * Returns the lines where warnings should occur. + * + * The key of the array should represent the line number and the value + * should represent the number of errors that should occur on that line. + * + * @return array(int => int) + */ + public function getWarningList() + { + return array(); + } +} diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Objects/ObjectInstantiationUnitTest.inc b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Objects/ObjectInstantiationUnitTest.inc new file mode 100644 index 0000000..bc9f522 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Objects/ObjectInstantiationUnitTest.inc @@ -0,0 +1,28 @@ +foo); +new Foo\Bar(); +new Foo\Bar(true); +new Foo\Bar($this->foo); +new \Foo\Bar(); +new \Foo\Bar(true); +new \Foo\Bar($this->foo); +new $foo(); +new $foo(true); +new $foo($this->foo); +new static(); +new static(true); +new static($this->foo); diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Objects/ObjectInstantiationUnitTest.php b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Objects/ObjectInstantiationUnitTest.php new file mode 100644 index 0000000..f33b41a --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/Tests/Objects/ObjectInstantiationUnitTest.php @@ -0,0 +1,63 @@ + + * @license http://spdx.org/licenses/MIT MIT License + * @version GIT: master + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +/** + * Unit test class for the ObjectInstantiation sniff. + * + * A sniff unit test checks a .inc file for expected violations of a single + * coding standard. Expected errors and warnings are stored in this class. + * + * @category PHP + * @package PHP_CodeSniffer + * @author Roman Weich + * @license http://spdx.org/licenses/MIT MIT License + * @link https://github.com/escapestudios/Symfony2-coding-standard + */ + +class Symfony2_Tests_Objects_ObjectInstantiationUnitTest extends AbstractSniffUnitTest +{ + /** + * Returns the lines where errors should occur. + * + * The key of the array should represent the line number and the value + * should represent the number of errors that should occur on that line. + * + * @return array + */ + public function getErrorList() + { + return array( + 4 => 1, + 5 => 1, + 6 => 1, + 7 => 1, + 8 => 1, + 9 => 1, + 10 => 1, + ); + } + + /** + * Returns the lines where warnings should occur. + * + * The key of the array should represent the line number and the value + * should represent the number of errors that should occur on that line. + * + * @return array(int => int) + */ + public function getWarningList() + { + return array(); + } +} diff --git a/vendor/escapestudios/symfony2-coding-standard/Symfony2/ruleset.xml b/vendor/escapestudios/symfony2-coding-standard/Symfony2/ruleset.xml new file mode 100755 index 0000000..28b8f7f --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/Symfony2/ruleset.xml @@ -0,0 +1,98 @@ + + + The Symfony2 coding standard. + + + */Resources/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + 0 + + + + 0 + + + + There should always be a description, followed by a blank line, before the tags of a class comment. + + diff --git a/vendor/escapestudios/symfony2-coding-standard/TESTING.md b/vendor/escapestudios/symfony2-coding-standard/TESTING.md new file mode 100644 index 0000000..b3c9ca0 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/TESTING.md @@ -0,0 +1,8 @@ +Testing +======= + +Contributions to this repository will only be accepted if all tests pass successfully: + +* PHP syntax/lint checks +* Unit tests: [PHPUnit](https://phpunit.de/) +* Coding standard-checks: [PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer/wiki) diff --git a/vendor/escapestudios/symfony2-coding-standard/build.properties b/vendor/escapestudios/symfony2-coding-standard/build.properties new file mode 100644 index 0000000..ed97144 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/build.properties @@ -0,0 +1,6 @@ +#composer +composer.url = http://getcomposer.org/composer.phar +composer.path = ${basedir}/composer.phar + +#PHP Code Sniffer +phpcs.standard = PEAR diff --git a/vendor/escapestudios/symfony2-coding-standard/build.xml b/vendor/escapestudios/symfony2-coding-standard/build.xml new file mode 100644 index 0000000..a001ece --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/build.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/escapestudios/symfony2-coding-standard/composer.json b/vendor/escapestudios/symfony2-coding-standard/composer.json new file mode 100644 index 0000000..fecf740 --- /dev/null +++ b/vendor/escapestudios/symfony2-coding-standard/composer.json @@ -0,0 +1,31 @@ +{ + "name": "escapestudios/symfony2-coding-standard", + "type": "coding-standard", + "description": "CodeSniffer ruleset for the Symfony2 coding standard", + "keywords": ["Symfony2", "coding standard", "phpcs"], + "homepage": "https://github.com/escapestudios/Symfony2-coding-standard", + "license": "MIT", + "authors": [ + { + "name": "David Joos", + "email": "david.joos@escapestudios.com" + }, + { + "name": "Community contributors", + "homepage": "https://github.com/escapestudios/Symfony2-coding-standard/graphs/contributors" + } + ], + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "minimum-stability": "dev", + "support" : { + "source": "https://github.com/escapestudios/Symfony2-coding-standard", + "issues": "https://github.com/escapestudios/Symfony2-coding-standard/issues" + }, + "require": { + "squizlabs/php_codesniffer": "~2.0" + } +} diff --git a/vendor/firegento/psr0autoloader b/vendor/firegento/psr0autoloader new file mode 160000 index 0000000..c5e913c --- /dev/null +++ b/vendor/firegento/psr0autoloader @@ -0,0 +1 @@ +Subproject commit c5e913c72b856471086a25acb3b5593bbef220f1 diff --git a/vendor/icecave/isolator/CHANGELOG.md b/vendor/icecave/isolator/CHANGELOG.md new file mode 100644 index 0000000..6570281 --- /dev/null +++ b/vendor/icecave/isolator/CHANGELOG.md @@ -0,0 +1,43 @@ +# Isolator Changelog + +### 2.3.0 (2014-08-12) + +* **[NEW]** Added support for isolation of the `new` operator + +### 2.2.1 (2014-02-27) + +* **[IMPROVED]** Updated autoloader to [PSR-4](http://www.php-fig.org/psr/psr-4/) + +### 2.2.0 (2013-06-04) + +* **[NEW]** Added `IsolatorTrait` to easily add an isolator dependency to a class +* **[NEW]** Added `Isolator::className()` method to get the actual class name of the generated isolator +* **[IMPROVED]** Several minor improvements to PSR compliance, documentation and test coverage + +### 2.1.2 (2013-04-04) + +* **[FIX]** Return values of isolated `include/require[_once]` calls are now propagated correctly +* **[NEW]** Integrated `icecave/archer` (previously `icecave/testing`) + +### 2.1.1 (2013-01-13) + +* **[NEW]** Integrated `icecave/testing` +* **[IMPROVED]** Improved documentation +* **[IMPROVED]** Improved PSR compliance + +### 2.1.0 (2012-08-12) + +* **[NEW]** Added support for isolation of inclusion directives (`include/require[_once]`) + +### 2.0.0 (2012-08-04) + +* **[BC]** Changed vendor namespace from `IcecaveStudios` to `Icecave` +* **[BC]** Changed composer package name from `IcecaveStudios/isolator` to `icecave/isolator` + +### 1.0.1 (2012-07-29) + +* **[IMPROVED]** Re-organised directory layout to be consistent with other Composer projects + +### 1.0.0 (2012-07-09) + +* Initial release diff --git a/vendor/icecave/isolator/CONTRIBUTING.md b/vendor/icecave/isolator/CONTRIBUTING.md new file mode 100644 index 0000000..0cdaefe --- /dev/null +++ b/vendor/icecave/isolator/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# Contributing + +**Isolator** is open source software; contributions from the community are encouraged. Please take a moment to read these guidelines before submitting changes. + +### Code style + +All PHP code must adhere to the [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) standard. + +### Branching and pull requests + +As a guideline, please follow this process: + + 1. [Fork the repository](https://help.github.com/articles/fork-a-repo). + 2. Create a topic branch for the change: + * New features should branch from **develop**. + * Bug fixes to existing versions should branch from **master**. + * Please ensure the branch is clearly labelled as a feature or fix. + 3. Make the relevant changes. + 4. [Squash](http://git-scm.com/book/en/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) commits if necessary. + 4. Submit a pull request to the **develop** branch. + +Please note this is a general guideline only. +For more information on the branching structure please see the [git-flow cheatsheet](http://danielkummer.github.com/git-flow-cheatsheet/). diff --git a/vendor/icecave/isolator/LICENSE.md b/vendor/icecave/isolator/LICENSE.md new file mode 100644 index 0000000..1160fb4 --- /dev/null +++ b/vendor/icecave/isolator/LICENSE.md @@ -0,0 +1,9 @@ +# License + +**© 2012-2014, [James Harris](https://github.com/jmalloc), [Erin Millard](https://github.com/ezzatron)** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** diff --git a/vendor/icecave/isolator/README.md b/vendor/icecave/isolator/README.md new file mode 100644 index 0000000..e200b66 --- /dev/null +++ b/vendor/icecave/isolator/README.md @@ -0,0 +1,171 @@ +# Isolator + +[![Build Status]](https://travis-ci.org/IcecaveStudios/isolator) +[![Test Coverage]](https://coveralls.io/r/IcecaveStudios/isolator?branch=develop) +[![SemVer]](http://semver.org) + +**Isolator** simplifies testing of classes that make use of global functions by treating all global functions as methods +on an "isolator" object. + +* Install via [Composer](http://getcomposer.org) package [icecave/isolator](https://packagist.org/packages/icecave/isolator) +* Read the [API documentation](http://icecavestudios.github.io/isolator/artifacts/documentation/api/) + +## Rationale + +A large number of PHP extensions (and the PHP core) implement their functionality as global functions. Testing classes +that use these functions quickly becomes difficult due to the inability to replace them with [test doubles](http://en.wikipedia.org/wiki/Test_double). + +**Isolator** endeavours to solve this problem by acting as a proxy between your class and global functions. An isolator +instance is passed into your object as a [dependency](http://en.wikipedia.org/wiki/Dependency_injection) and used in +place of any global function calls that you may want to replace when testing. + +## Example + +The following class makes use of [file_get_contents()](http://php.net/manual/en/function.file-get-contents.php) to read +the contents of a file. + +```php +class MyDocument +{ + public function __construct($filename) + { + $this->filename = $filename; + } + + public function getContents() + { + return file_get_contents($this->filename); + } + + protected $filename; +} +``` + +Despite the simplicity of the example, the class immediately becomes difficult to test due to it's reliance on the +filesystem. In order to test this class you might be inclined to set up some static fixtures on disk, make a temporary +directory when your test suite is set up or perhaps even use a [virtual filesystem wrapper](http://code.google.com/p/bovigo/wiki/vfsStream). + +**Isolator** provides a fourth alternative. Given below is the same example rewritten using an `Isolator` instance. + +```php +use Icecave\Isolator\Isolator; + +class MyDocument +{ + public function __construct($filename, Isolator $isolator = null) + { + $this->filename = $filename; + $this->isolator = Isolator::get($isolator); + } + + public function getContents() + { + return $this->isolator->file_get_contents($this->filename); + } + + protected $filename; + protected $isolator; +} +``` + +MyDocument now takes an instance of `Isolator` in it's constructor. It would be a pain - and unnecessary - to specify +the `Isolator` instance every time you construct an object in your production code, so a shared instance is made +accessible using the `Isolator::get()` method. If a non-null value is passed to `Isolator::get()` it is returned +unchanged, allowing you to replace the isolator when necessary. + +`MyDocument::getContents()` is also updated to use the isolator instance rather than calling the global function +directly. The behavior of `MyDocument` remains unchanged but testing the class is easy, as will be shown in the example +test suite below. + +*Note: The test below is written for the [PHPUnit](http://www.phpunit.de) testing framework, using [Phake](https://github.com/mlively/Phake) +for mocking. Phake provides a more flexible alternative to PHPUnit's built-in mock objects.* + +```php +use Icecave\Isolator\Isolator; + +class MyDocumentTest extends PHPUnit_Framework_TestCase +{ + public function setUp() + { + // First a mocked isolator instance is created ... + $this->isolator = Phake::mock(Isolator::className()); + + // That isolator instance is provided to the MyDocument instance + // that is to be tested ... + $this->myDocument = new MyDocument('foo.txt', $this->isolator); + } + + public function testGetContents() + { + // Phake is used to configure the mocked isolator to return a known + // string when file_get_contents() is called with a parameter equal + // to 'foo.txt' ... + Phake::when($this->isolator) + ->file_get_contents('foo.txt') + ->thenReturn('This is the file contents.'); + + // MyDocument::getContents() is called, and it's result checked ... + $contents = $this->myDocument->getContents(); + $this->assertEquals($contents, 'This is the file contents.'); + + // Finally Phake is used to verify that a call to file_get_contents() + // was made as expected ... + Phake::verify($this->isolator) + ->file_get_contents('foo.txt'); + } +} +``` + +The test verifies the behavior of the `MyDocument` class completely, without requiring any disk access. + +Using an isolator is most helpful when testing code that uses global functions which maintain global state or utilize +external resources such as databases, filesystems, etc. It is usually unnecessary to mock out deterministic functions +such as `strlen()`, for example. + +## Isolator Trait + +In PHP 5.4 and later, it is also possible to use `IsolatorTrait` to bring an isolator into your class. The isolator +instance is accessed using `$this->isolator()` and can be set via `$this->setIsolator()`. + +```php +use Icecave\Isolator\IsolatorTrait; + +class MyDocument +{ + use IsolatorTrait; + + public function __construct($filename) + { + $this->filename = $filename; + } + + public function getContents() + { + return $this->isolator()->file_get_contents($this->filename); + } + + protected $filename; + protected $isolator; +} +``` + +## Language Constructs + +**Isolator** can also be used to invoke the following function-like language constructs: + + * `include`, `include_once`, `require` and `require_once` + * `exit` and `die` + * `echo` + * `eval` + * `new` + +## Peculiarities + +Several of PHP's core global functions have some peculiarities and inconsitencies in the way they are defined. +**Isolator** attempts to accomodate such inconsistencies when possible, but may have issues with some native C functions +for which parameter reflection information is non-standard or incorrect. + + +[Build Status]: http://img.shields.io/travis/IcecaveStudios/isolator/develop.svg +[Test Coverage]: http://img.shields.io/coveralls/IcecaveStudios/isolator/develop.svg +[SemVer]: http://img.shields.io/:semver-2.3.0-brightgreen.svg diff --git a/vendor/icecave/isolator/composer.json b/vendor/icecave/isolator/composer.json new file mode 100644 index 0000000..5834fd2 --- /dev/null +++ b/vendor/icecave/isolator/composer.json @@ -0,0 +1,28 @@ +{ + "name": "icecave/isolator", + "description": "Dependency injection for global functions.", + "keywords": ["test", "phpunit", "phake", "unit", "mock", "fake"], + "homepage": "https://github.com/IcecaveStudios/isolator", + "license": "MIT", + "authors": [ + { + "name": "James Harris", + "email": "james.harris@icecave.com.au", + "homepage": "https://github.com/jmalloc" + } + ], + "require": { + "php": ">=5.3" + }, + "require-dev": { + "icecave/archer": "~1" + }, + "suggest": { + "eloquent/asplode": "Drop-in exception-based error handling." + }, + "autoload": { + "psr-4": { + "Icecave\\Isolator\\": "src" + } + } +} diff --git a/vendor/icecave/isolator/composer.lock b/vendor/icecave/isolator/composer.lock new file mode 100644 index 0000000..f91e8c3 --- /dev/null +++ b/vendor/icecave/isolator/composer.lock @@ -0,0 +1,997 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "cd3bd98a401c759263120c414cdb77c5", + "packages": [], + "packages-dev": [ + { + "name": "dflydev/markdown", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-markdown.git", + "reference": "6baed9b50f29c980795b6656d43722aadb126f7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-markdown/zipball/6baed9b50f29c980795b6656d43722aadb126f7e", + "reference": "6baed9b50f29c980795b6656d43722aadb126f7e", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "dflydev\\markdown": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Michel Fortin", + "homepage": "http://michelf.com" + }, + { + "name": "John Gruber", + "homepage": "http://daringfireball.net" + } + ], + "description": "PHP Markdown & Extra", + "homepage": "http://github.com/dflydev/dflydev-markdown", + "keywords": [ + "markdown" + ], + "time": "2013-09-23 12:00:18" + }, + { + "name": "guzzle/guzzle", + "version": "v3.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle3.git", + "reference": "54991459675c1a2924122afbb0e5609ade581155" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/54991459675c1a2924122afbb0e5609ade581155", + "reference": "54991459675c1a2924122afbb0e5609ade581155", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=5.3.3", + "symfony/event-dispatcher": "~2.1" + }, + "replace": { + "guzzle/batch": "self.version", + "guzzle/cache": "self.version", + "guzzle/common": "self.version", + "guzzle/http": "self.version", + "guzzle/inflection": "self.version", + "guzzle/iterator": "self.version", + "guzzle/log": "self.version", + "guzzle/parser": "self.version", + "guzzle/plugin": "self.version", + "guzzle/plugin-async": "self.version", + "guzzle/plugin-backoff": "self.version", + "guzzle/plugin-cache": "self.version", + "guzzle/plugin-cookie": "self.version", + "guzzle/plugin-curlauth": "self.version", + "guzzle/plugin-error-response": "self.version", + "guzzle/plugin-history": "self.version", + "guzzle/plugin-log": "self.version", + "guzzle/plugin-md5": "self.version", + "guzzle/plugin-mock": "self.version", + "guzzle/plugin-oauth": "self.version", + "guzzle/service": "self.version", + "guzzle/stream": "self.version" + }, + "require-dev": { + "doctrine/cache": "~1.3", + "monolog/monolog": "~1.0", + "phpunit/phpunit": "3.7.*", + "psr/log": "~1.0", + "symfony/class-loader": "~2.1", + "zendframework/zend-cache": "2.*,<2.3", + "zendframework/zend-log": "2.*,<2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.9-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle": "src/", + "Guzzle\\Tests": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Guzzle Community", + "homepage": "https://github.com/guzzle/guzzle/contributors" + } + ], + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2014-08-11 04:32:36" + }, + { + "name": "icecave/archer", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/IcecaveStudios/archer.git", + "reference": "49e90d8c0d0a63e537b26d90591367093ebf45be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/IcecaveStudios/archer/zipball/49e90d8c0d0a63e537b26d90591367093ebf45be", + "reference": "49e90d8c0d0a63e537b26d90591367093ebf45be", + "shasum": "" + }, + "require": { + "phake/phake": "~1", + "php": ">=5.3", + "sami/sami": "~1.1.0", + "satooshi/php-coveralls": "~0.6", + "symfony/console": "~2", + "symfony/process": "~2" + }, + "require-dev": { + "eloquent/liberator": "~1", + "symfony/event-dispatcher": "~2.1" + }, + "suggest": { + "ext-openssl": "OpenSSL is required to encrypt GitHub OAuth tokens for artifact publication." + }, + "bin": [ + "bin/archer", + "bin/woodhouse" + ], + "type": "library", + "autoload": { + "psr-4": { + "Icecave\\Archer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Erin Millard", + "email": "ezzatron@gmail.com", + "homepage": "http://ezzatron.com/" + }, + { + "name": "James Harris", + "email": "james.harris@icecave.com.au", + "homepage": "https://github.com/jmalloc" + } + ], + "description": "Testing, CI and documentation of PHP projects by convention.", + "homepage": "https://github.com/IcecaveStudios/archer", + "keywords": [ + "api", + "artifacts", + "convention", + "coverage", + "documentation", + "phake", + "phpunit", + "project", + "test", + "testing", + "unit" + ], + "time": "2014-06-23 00:33:17" + }, + { + "name": "nikic/php-parser", + "version": "v0.9.5", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "ef70767475434bdb3615b43c327e2cae17ef12eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ef70767475434bdb3615b43c327e2cae17ef12eb", + "reference": "ef70767475434bdb3615b43c327e2cae17ef12eb", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9-dev" + } + }, + "autoload": { + "psr-0": { + "PHPParser": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2014-07-23 18:24:17" + }, + { + "name": "phake/phake", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/mlively/Phake.git", + "reference": "14e4788698e4a21774220c22f3dcaa2e97648b61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mlively/Phake/zipball/14e4788698e4a21774220c22f3dcaa2e97648b61", + "reference": "14e4788698e4a21774220c22f3dcaa2e97648b61", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "doctrine/common": "2.3.*", + "ext-soap": "*", + "hamcrest/hamcrest-php": "1.1.*", + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "src" + ], + "license": [ + "BSD" + ], + "authors": [ + { + "name": "Mike Lively", + "email": "m@digitalsandwich.com" + } + ], + "description": "The Phake mock testing library", + "homepage": "https://github.com/mlively/Phake", + "keywords": [ + "mock", + "testing" + ], + "time": "2014-04-16 14:49:56" + }, + { + "name": "pimple/pimple", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/fabpot/Pimple.git", + "reference": "ae11e57e8c2bb414b2ff93396dbbfc0eb92feb94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fabpot/Pimple/zipball/ae11e57e8c2bb414b2ff93396dbbfc0eb92feb94", + "reference": "ae11e57e8c2bb414b2ff93396dbbfc0eb92feb94", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ], + "time": "2013-03-08 08:21:40" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "sami/sami", + "version": "v1.1", + "source": { + "type": "git", + "url": "https://github.com/fabpot/Sami.git", + "reference": "46c58957ce4823c613e8535626b81e2fd80a9865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fabpot/Sami/zipball/46c58957ce4823c613e8535626b81e2fd80a9865", + "reference": "46c58957ce4823c613e8535626b81e2fd80a9865", + "shasum": "" + }, + "require": { + "dflydev/markdown": "1.0.*", + "nikic/php-parser": "0.9.*", + "php": ">=5.3.0", + "pimple/pimple": "1.0.*", + "symfony/console": "~2.1", + "symfony/filesystem": "~2.1", + "symfony/finder": "~2.1", + "symfony/process": "~2.1", + "symfony/yaml": "~2.1", + "twig/twig": "1.*" + }, + "bin": [ + "sami.php" + ], + "type": "application", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Sami": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Sami, an API documentation generator", + "homepage": "http://sami.sensiolabs.org", + "keywords": [ + "phpdoc" + ], + "time": "2013-08-04 13:56:41" + }, + { + "name": "satooshi/php-coveralls", + "version": "v0.6.1", + "source": { + "type": "git", + "url": "https://github.com/satooshi/php-coveralls.git", + "reference": "dd0df95bd37a7cf5c5c50304dfe260ffe4b50760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/dd0df95bd37a7cf5c5c50304dfe260ffe4b50760", + "reference": "dd0df95bd37a7cf5c5c50304dfe260ffe4b50760", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-simplexml": "*", + "guzzle/guzzle": ">=3.0", + "php": ">=5.3", + "psr/log": "1.0.0", + "symfony/config": ">=2.0", + "symfony/console": ">=2.0", + "symfony/stopwatch": ">=2.2", + "symfony/yaml": ">=2.0" + }, + "require-dev": { + "apigen/apigen": "2.8.*@stable", + "pdepend/pdepend": "dev-master", + "phpmd/phpmd": "dev-master", + "phpunit/php-invoker": ">=1.1.0,<1.2.0", + "phpunit/phpunit": "3.7.*@stable", + "sebastian/finder-facade": "dev-master", + "sebastian/phpcpd": "1.4.*@stable", + "squizlabs/php_codesniffer": "1.4.*@stable", + "theseer/fdomdocument": "dev-master" + }, + "bin": [ + "composer/bin/coveralls" + ], + "type": "library", + "autoload": { + "psr-0": { + "Contrib\\Component": "src/", + "Contrib\\Bundle": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kitamura Satoshi", + "email": "with.no.parachute@gmail.com", + "homepage": "https://www.facebook.com/satooshi.jp" + } + ], + "description": "PHP client library for Coveralls API", + "homepage": "https://github.com/satooshi/php-coveralls", + "keywords": [ + "ci", + "coverage", + "github", + "test" + ], + "time": "2013-05-04 08:07:33" + }, + { + "name": "symfony/config", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Config", + "source": { + "type": "git", + "url": "https://github.com/symfony/Config.git", + "reference": "8d044668c7ccb4ade684e368d910e3aadcff6f6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Config/zipball/8d044668c7ccb4ade684e368d910e3aadcff6f6c", + "reference": "8d044668c7ccb4ade684e368d910e3aadcff6f6c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/filesystem": "~2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Config\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Config Component", + "homepage": "http://symfony.com", + "time": "2014-08-05 09:00:40" + }, + { + "name": "symfony/console", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/cd2d1e4bac2206b337326b0140ff475fe9ad5f63", + "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Console Component", + "homepage": "http://symfony.com", + "time": "2014-08-05 09:00:40" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.5.3", + "target-dir": "Symfony/Component/EventDispatcher", + "source": { + "type": "git", + "url": "https://github.com/symfony/EventDispatcher.git", + "reference": "8faf5cc7e80fde74a650a36e60d32ce3c3e0457b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/8faf5cc7e80fde74a650a36e60d32ce3c3e0457b", + "reference": "8faf5cc7e80fde74a650a36e60d32ce3c3e0457b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.0", + "symfony/dependency-injection": "~2.0", + "symfony/stopwatch": "~2.2" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "http://symfony.com", + "time": "2014-07-28 13:20:46" + }, + { + "name": "symfony/filesystem", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Filesystem", + "source": { + "type": "git", + "url": "https://github.com/symfony/Filesystem.git", + "reference": "c1309b0ee195ad264a4314435bdaecdfacb8ae9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/c1309b0ee195ad264a4314435bdaecdfacb8ae9c", + "reference": "c1309b0ee195ad264a4314435bdaecdfacb8ae9c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "http://symfony.com", + "time": "2014-07-09 09:05:48" + }, + { + "name": "symfony/finder", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Finder", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "090fe4eaff414d8f2171c7a4748ea868d530775f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/090fe4eaff414d8f2171c7a4748ea868d530775f", + "reference": "090fe4eaff414d8f2171c7a4748ea868d530775f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Finder Component", + "homepage": "http://symfony.com", + "time": "2014-07-28 13:20:46" + }, + { + "name": "symfony/process", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Process", + "source": { + "type": "git", + "url": "https://github.com/symfony/Process.git", + "reference": "e0997d2a9a1a763484b34b989900b61322a9b056" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Process/zipball/e0997d2a9a1a763484b34b989900b61322a9b056", + "reference": "e0997d2a9a1a763484b34b989900b61322a9b056", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Process Component", + "homepage": "http://symfony.com", + "time": "2014-08-05 09:00:40" + }, + { + "name": "symfony/stopwatch", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Stopwatch", + "source": { + "type": "git", + "url": "https://github.com/symfony/Stopwatch.git", + "reference": "086c8c98c3016f59f5e6e7b15b751c2384b311e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/086c8c98c3016f59f5e6e7b15b751c2384b311e5", + "reference": "086c8c98c3016f59f5e6e7b15b751c2384b311e5", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Stopwatch\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "http://symfony.com", + "time": "2014-08-06 06:44:37" + }, + { + "name": "symfony/yaml", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", + "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2014-08-05 09:00:40" + }, + { + "name": "twig/twig", + "version": "v1.16.0", + "source": { + "type": "git", + "url": "https://github.com/fabpot/Twig.git", + "reference": "8ce37115802e257a984a82d38254884085060024" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fabpot/Twig/zipball/8ce37115802e257a984a82d38254884085060024", + "reference": "8ce37115802e257a984a82d38254884085060024", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.16-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "https://github.com/fabpot/Twig/graphs/contributors", + "role": "Contributors" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ], + "time": "2014-07-05 12:19:05" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "platform": { + "php": ">=5.3" + }, + "platform-dev": [] +} diff --git a/vendor/icecave/isolator/src/Generator.php b/vendor/icecave/isolator/src/Generator.php new file mode 100644 index 0000000..e5867aa --- /dev/null +++ b/vendor/icecave/isolator/src/Generator.php @@ -0,0 +1,159 @@ +ellipsisExpansion = $ellipsisExpansion; + $this->isolator = $isolator ?: new Isolator; // Note, Isolator::getIsolator is not used to avoid recursion. + } + + public function generateClass(array $functionReflectors, $className = null, $baseClassName = 'Isolator') + { + if ($className === null) { + $className = 'Isolator' . self::$count++; + } + + $code = 'namespace ' . __NAMESPACE__ . ' {' . PHP_EOL; + $code .= 'class ' . $className . ' extends ' . $baseClassName . ' {' . PHP_EOL; + $code .= PHP_EOL; + + foreach ($functionReflectors as $reflector) { + if ($this->requiresIsolatorProxy($reflector)) { + $code .= $this->generateProxyMethod($reflector); + $code .= PHP_EOL; + } + } + + $code .= '} // End class.' . PHP_EOL; + $code .= '} // End namespace.' . PHP_EOL; + + $this->isolator->eval($code); + + return new ReflectionClass(__NAMESPACE__ . '\\' . $className); + } + + public function requiresIsolatorProxy(ReflectionFunction $reflector) + { + if ($reflector->isDisabled()) { + return false; + } elseif ($reflector->returnsReference()) { + return true; + } + + foreach ($reflector->getParameters() as $parameter) { + if ($parameter->isPassedByReference()) { + return true; + } + } + + return false; + } + + public function inspect(ReflectionFunction $reflector) + { + $minArity = 0; + $maxArity = 0; + $refIndices = array(); + + foreach ($reflector->getParameters() as $parameter) { + $refIndices[$maxArity++] = $parameter->isPassedByReference(); + + if (!$parameter->isOptional()) { + ++$minArity; + } + + if ($parameter->getName() === '...') { + $ref = $parameter->isPassedByReference(); + for ($count = 1; $count < $this->ellipsisExpansion; ++$count) { + $refIndices[$maxArity++] = $ref; + } + break; + } + } + + return array($minArity, $maxArity, $refIndices); + } + + public function generateProxyMethod(ReflectionFunction $reflector) + { + list($minArity, $maxArity, $refIndices) = $this->inspect($reflector); + $name = $reflector->getName(); + $code = $this->generateSignature($name, $reflector->returnsReference(), $minArity, $maxArity, $refIndices) . ' {' . PHP_EOL; + $code .= $this->generateSwitch($name, $minArity, $maxArity); + $code .= $this->generateReturn($name, $maxArity); + $code .= '} // End function ' . $name . '.' . PHP_EOL; + $code .= PHP_EOL; + + return $code; + } + + protected function generateSignature($name, $returnsReference, $minArity, $maxArity, $refIndices) + { + $parameters = array(); + for ($index = 0; $index < $maxArity; ++$index) { + $param = ''; + if ($refIndices[$index]) { + $param .= '&'; + } + $param .= '$_' . $index; + if ($index >= $minArity) { + $param .= ' = null'; + } + $parameters[] = $param; + } + + return sprintf( + 'public function %s%s(%s)' + , $returnsReference ? '&' : '' + , str_replace('\\', '_', $name) + , implode(', ', $parameters) + ); + } + + protected function generateSwitch($name, $minArity, $maxArity) + { + if ($minArity === $maxArity) { + return ''; + } + + $code = 'switch (func_num_args()) {' . PHP_EOL; + + for ($arity = $minArity; $arity < $maxArity; ++$arity) { + $code .= sprintf( + 'case %d: %s' + , $arity + , $this->generateReturn($name, $arity) + ); + } + + $code .= '} // End switch.' . PHP_EOL; + + return $code; + } + + protected function generateReturn($name, $arity) + { + $arguments = array(); + for ($index = 0; $index < $arity; ++$index) { + $arguments[] = '$_' . $index; + } + + return sprintf( + 'return \%s(%s);' . PHP_EOL + , $name + , implode(', ', $arguments) + ); + } + + private static $count = 0; + protected $ellipsisExpansionDepth; + protected $isolator; +} diff --git a/vendor/icecave/isolator/src/Isolator.php b/vendor/icecave/isolator/src/Isolator.php new file mode 100644 index 0000000..dc19364 --- /dev/null +++ b/vendor/icecave/isolator/src/Isolator.php @@ -0,0 +1,144 @@ +newInstanceArgs($arguments); + } + + return call_user_func_array($name, $arguments); + } + + /** + * Fetch an isolator instance. + * + * This convenience method returns the global isolator instance, or $instance if provided. + * + * @param Isolator|null $instance An existing isolator instance, if available. + * + * @return Isolator The global isolator instance, or $instance if provided. + */ + public static function get(Isolator $instance = null) + { + if ($instance) { + return $instance; + } + + return static::getIsolator(); + } + + /** + * Fetch the isolator class name. + * + * @return string The concrete class name for the global isolator instance. + */ + public static function className() + { + return get_class(static::get()); + } + + /** + * Fetch the default isolator instance, constructing it if necessary. + * + * @param boolean $handleReferences Indicates whether or not the isolator should account for functions with reference parameters and return types. + * @param Generator|null $generator The Generator instance to use to construct the concreate isolator class, or null to use the default. + * @param Isolator|null $isolator The isolator used to access the global list of functions, or null to use the default. + */ + public static function getIsolator($handleReferences = true, Generator $generator = null, Isolator $isolator = null) + { + // Global instance already initialized ... + if (self::$instance !== null) { + return self::$instance; + } + + // No need to handle references, rely on default Isolator::__call() method ... + if (!$handleReferences) { + return self::$instance = new self; + } + + // Construct an isolator generator to create the concreate isolator class ... + if ($generator === null) { + $generator = new Generator; + } + + // Get a basic isolator to use for reflection ... + if ($isolator === null) { + $isolator = new self; + } + + // Create reflectors for each of the globally defined functions ... + $functionReflectors = array(); + foreach ($isolator->get_defined_functions() as $functions) { + foreach ($functions as $name) { + $functionReflectors[] = new ReflectionFunction($name); + } + } + + // Generate the concrete isolator class and install it as the global instance ... + $classReflector = $generator->generateClass($functionReflectors); + + return self::$instance = $classReflector->newInstance(); + } + + /** + * Reset the default isolator instance. + */ + public static function resetIsolator() + { + self::$instance = null; + } + + private static $instance; +} diff --git a/vendor/icecave/isolator/src/IsolatorTrait.php b/vendor/icecave/isolator/src/IsolatorTrait.php new file mode 100644 index 0000000..fc0b196 --- /dev/null +++ b/vendor/icecave/isolator/src/IsolatorTrait.php @@ -0,0 +1,30 @@ +isolator); + } + + /** + * Set the {@see Isolator} instance to be used by this object. + * + * @param Isolator|null $isolator The isolator instance to be used by this object, or null to use the global instance. + */ + public function setIsolator(Isolator $isolator = null) + { + $this->isolator = $isolator; + } + + private $isolator; +} diff --git a/vendor/icecave/isolator/src/PackageInfo.php b/vendor/icecave/isolator/src/PackageInfo.php new file mode 100644 index 0000000..30f10ed --- /dev/null +++ b/vendor/icecave/isolator/src/PackageInfo.php @@ -0,0 +1,8 @@ +retrieve('file://' . realpath('schema.json')); +$data = json_decode(file_get_contents('data.json')); + +// If you use $ref or if you are unsure, resolve those references here +// This modifies the $schema object +$refResolver = new JsonSchema\RefResolver($retriever); +$refResolver->resolve($schema, 'file://' . __DIR__); + +// Validate +$validator = new JsonSchema\Validator(); +$validator->check($data, $schema); + +if ($validator->isValid()) { + echo "The supplied JSON validates against the schema.\n"; +} else { + echo "JSON does not validate. Violations:\n"; + foreach ($validator->getErrors() as $error) { + echo sprintf("[%s] %s\n", $error['property'], $error['message']); + } +} +``` + +## Running the tests + + $ vendor/bin/phpunit diff --git a/vendor/justinrainbow/json-schema/bin/validate-json b/vendor/justinrainbow/json-schema/bin/validate-json new file mode 100755 index 0000000..e93d53a --- /dev/null +++ b/vendor/justinrainbow/json-schema/bin/validate-json @@ -0,0 +1,245 @@ +#!/usr/bin/env php + + */ + +/** + * Dead simple autoloader + * + * @param string $className Name of class to load + * + * @return void + */ +function __autoload($className) +{ + $className = ltrim($className, '\\'); + $fileName = ''; + $namespace = ''; + if ($lastNsPos = strrpos($className, '\\')) { + $namespace = substr($className, 0, $lastNsPos); + $className = substr($className, $lastNsPos + 1); + $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; + } + $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; + if (stream_resolve_include_path($fileName)) { + require_once $fileName; + } +} + +/** + * Show the json parse error that happened last + * + * @return void + */ +function showJsonError() +{ + $constants = get_defined_constants(true); + $json_errors = array(); + foreach ($constants['json'] as $name => $value) { + if (!strncmp($name, 'JSON_ERROR_', 11)) { + $json_errors[$value] = $name; + } + } + + echo 'JSON parse error: ' . $json_errors[json_last_error()] . "\n"; +} + +function getUrlFromPath($path) +{ + if (parse_url($path, PHP_URL_SCHEME) !== null) { + //already an URL + return $path; + } + if ($path{0} == '/') { + //absolute path + return 'file://' . $path; + } + + //relative path: make absolute + return 'file://' . getcwd() . '/' . $path; +} + +/** + * Take a HTTP header value and split it up into parts. + * + * @return array Key "_value" contains the main value, all others + * as given in the header value + */ +function parseHeaderValue($headerValue) +{ + if (strpos($headerValue, ';') === false) { + return array('_value' => $headerValue); + } + + $parts = explode(';', $headerValue); + $arData = array('_value' => array_shift($parts)); + foreach ($parts as $part) { + list($name, $value) = explode('=', $part); + $arData[$name] = trim($value, ' "\''); + } + return $arData; +} + + +// support running this tool from git checkout +if (is_dir(__DIR__ . '/../src/JsonSchema')) { + set_include_path(__DIR__ . '/../src' . PATH_SEPARATOR . get_include_path()); +} + +$arOptions = array(); +$arArgs = array(); +array_shift($argv);//script itself +foreach ($argv as $arg) { + if ($arg{0} == '-') { + $arOptions[$arg] = true; + } else { + $arArgs[] = $arg; + } +} + +if (count($arArgs) == 0 + || isset($arOptions['--help']) || isset($arOptions['-h']) +) { + echo << array( + 'header' => array( + 'Accept: */*', + 'Connection: Close' + ), + 'max_redirects' => 5 + ) + ) +); +$dataString = file_get_contents($pathData, false, $context); +if ($dataString == '') { + echo "Data file is not readable or empty.\n"; + exit(3); +} + +$data = json_decode($dataString); +unset($dataString); +if ($data === null) { + echo "Error loading JSON data file\n"; + showJsonError(); + exit(5); +} + +if ($pathSchema === null) { + if (isset($http_response_header)) { + array_shift($http_response_header);//HTTP/1.0 line + foreach ($http_response_header as $headerLine) { + list($hName, $hValue) = explode(':', $headerLine, 2); + $hName = strtolower($hName); + if ($hName == 'link') { + //Link: ; rel="describedBy" + $hParts = parseHeaderValue($hValue); + if (isset($hParts['rel']) && $hParts['rel'] == 'describedBy') { + $pathSchema = trim($hParts['_value'], ' <>'); + } + } else if ($hName == 'content-type') { + //Content-Type: application/my-media-type+json; + // profile=http://example.org/schema# + $hParts = parseHeaderValue($hValue); + if (isset($hParts['profile'])) { + $pathSchema = $hParts['profile']; + } + + } + } + } + if (is_object($data) && property_exists($data, '$schema')) { + $pathSchema = $data->{'$schema'}; + } + + //autodetect schema + if ($pathSchema === null) { + echo "JSON data must be an object and have a \$schema property.\n"; + echo "You can pass the schema file on the command line as well.\n"; + echo "Schema autodetection failed.\n"; + exit(6); + } +} +if ($pathSchema{0} == '/') { + $pathSchema = 'file://' . $pathSchema; +} + +$resolver = new JsonSchema\Uri\UriResolver(); +$retriever = new JsonSchema\Uri\UriRetriever(); +try { + $urlSchema = $resolver->resolve($pathSchema, $urlData); + + if (isset($arOptions['--dump-schema-url'])) { + echo $urlSchema . "\n"; + exit(); + } + + $schema = $retriever->retrieve($urlSchema); + if ($schema === null) { + echo "Error loading JSON schema file\n"; + echo $urlSchema . "\n"; + showJsonError(); + exit(2); + } +} catch (Exception $e) { + echo "Error loading JSON schema file\n"; + echo $urlSchema . "\n"; + echo $e->getMessage() . "\n"; + exit(2); +} +$refResolver = new JsonSchema\RefResolver($retriever); +$refResolver->resolve($schema, $urlSchema); + +if (isset($arOptions['--dump-schema'])) { + $options = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0; + echo json_encode($schema, $options) . "\n"; + exit(); +} + +try { + $validator = new JsonSchema\Validator(); + $validator->check($data, $schema); + + if ($validator->isValid()) { + echo "OK. The supplied JSON validates against the schema.\n"; + } else { + echo "JSON does not validate. Violations:\n"; + foreach ($validator->getErrors() as $error) { + echo sprintf("[%s] %s\n", $error['property'], $error['message']); + } + exit(23); + } +} catch (Exception $e) { + echo "JSON does not validate. Error:\n"; + echo $e->getMessage() . "\n"; + echo "Error code: " . $e->getCode() . "\n"; + exit(24); +} +?> diff --git a/vendor/justinrainbow/json-schema/composer.json b/vendor/justinrainbow/json-schema/composer.json new file mode 100644 index 0000000..68b3933 --- /dev/null +++ b/vendor/justinrainbow/json-schema/composer.json @@ -0,0 +1,58 @@ +{ + "name": "justinrainbow/json-schema", + "description": "A library to validate a json schema.", + "keywords": ["json", "schema"], + "homepage": "https://github.com/justinrainbow/json-schema", + "type": "library", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "repositories": [{ + "type": "package", + "package": { + "name": "json-schema/JSON-Schema-Test-Suite", + "version": "1.1.0", + "source": { + "url": "https://github.com/json-schema/JSON-Schema-Test-Suite", + "type": "git", + "reference": "1.1.0" + } + } + }], + "require": { + "php": ">=5.3.29" + }, + "require-dev": { + "json-schema/JSON-Schema-Test-Suite": "1.1.0", + "phpunit/phpunit": "~3.7", + "phpdocumentor/phpdocumentor": "~2" + }, + "autoload": { + "psr-4": { "JsonSchema\\": "src/JsonSchema/" } + }, + "autoload-dev": { + "psr-4": { "JsonSchema\\Tests\\": "tests/JsonSchema/Tests/" } + }, + "bin": ["bin/validate-json"], + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + } +} diff --git a/vendor/justinrainbow/json-schema/phpunit.xml.dist b/vendor/justinrainbow/json-schema/phpunit.xml.dist new file mode 100644 index 0000000..0136d8e --- /dev/null +++ b/vendor/justinrainbow/json-schema/phpunit.xml.dist @@ -0,0 +1,26 @@ + + + + + + tests + + + + + + ./src/JsonSchema/ + + + diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php new file mode 100644 index 0000000..b43bace --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php @@ -0,0 +1,112 @@ + + * @author Bruno Prieto Reis + */ +class CollectionConstraint extends Constraint +{ + /** + * {@inheritDoc} + */ + public function check($value, $schema = null, $path = null, $i = null) + { + // Verify minItems + if (isset($schema->minItems) && count($value) < $schema->minItems) { + $this->addError($path, "There must be a minimum of " . $schema->minItems . " items in the array", 'minItems', array('minItems' => $schema->minItems,)); + } + + // Verify maxItems + if (isset($schema->maxItems) && count($value) > $schema->maxItems) { + $this->addError($path, "There must be a maximum of " . $schema->maxItems . " items in the array", 'maxItems', array('maxItems' => $schema->maxItems,)); + } + + // Verify uniqueItems + if (isset($schema->uniqueItems) && $schema->uniqueItems) { + $unique = $value; + if (is_array($value) && count($value)) { + $unique = array_map(function($e) { return var_export($e, true); }, $value); + } + if (count(array_unique($unique)) != count($value)) { + $this->addError($path, "There are no duplicates allowed in the array", 'uniqueItems'); + } + } + + // Verify items + if (isset($schema->items)) { + $this->validateItems($value, $schema, $path, $i); + } + } + + /** + * Validates the items + * + * @param array $value + * @param \stdClass $schema + * @param string $path + * @param string $i + */ + protected function validateItems($value, $schema = null, $path = null, $i = null) + { + if (is_object($schema->items)) { + // just one type definition for the whole array + foreach ($value as $k => $v) { + $initErrors = $this->getErrors(); + + // First check if its defined in "items" + $this->checkUndefined($v, $schema->items, $path, $k); + + // Recheck with "additionalItems" if the first test fails + if (count($initErrors) < count($this->getErrors()) && (isset($schema->additionalItems) && $schema->additionalItems !== false)) { + $secondErrors = $this->getErrors(); + $this->checkUndefined($v, $schema->additionalItems, $path, $k); + } + + // Reset errors if needed + if (isset($secondErrors) && count($secondErrors) < count($this->getErrors())) { + $this->errors = $secondErrors; + } else if (isset($secondErrors) && count($secondErrors) === count($this->getErrors())) { + $this->errors = $initErrors; + } + } + } else { + // Defined item type definitions + foreach ($value as $k => $v) { + if (array_key_exists($k, $schema->items)) { + $this->checkUndefined($v, $schema->items[$k], $path, $k); + } else { + // Additional items + if (property_exists($schema, 'additionalItems')) { + if ($schema->additionalItems !== false) { + $this->checkUndefined($v, $schema->additionalItems, $path, $k); + } else { + $this->addError( + $path, 'The item ' . $i . '[' . $k . '] is not defined and the definition does not allow additional items', 'additionalItems', array('additionalItems' => $schema->additionalItems,)); + } + } else { + // Should be valid against an empty schema + $this->checkUndefined($v, new \stdClass(), $path, $k); + } + } + } + + // Treat when we have more schema definitions than values, not for empty arrays + if(count($value) > 0) { + for ($k = count($value); $k < count($schema->items); $k++) { + $this->checkUndefined(new UndefinedConstraint(), $schema->items[$k], $path, $k); + } + } + } + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php new file mode 100644 index 0000000..cb3ee80 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php @@ -0,0 +1,291 @@ + + * @author Bruno Prieto Reis + */ +abstract class Constraint implements ConstraintInterface +{ + protected $checkMode = self::CHECK_MODE_NORMAL; + protected $uriRetriever; + protected $errors = array(); + protected $inlineSchemaProperty = '$schema'; + + const CHECK_MODE_NORMAL = 1; + const CHECK_MODE_TYPE_CAST = 2; + + /** + * @var null|Factory + */ + private $factory; + + /** + * @param int $checkMode + * @param UriRetriever $uriRetriever + * @param Factory $factory + */ + public function __construct($checkMode = self::CHECK_MODE_NORMAL, UriRetriever $uriRetriever = null, Factory $factory = null) + { + $this->checkMode = $checkMode; + $this->uriRetriever = $uriRetriever; + $this->factory = $factory; + } + + /** + * @return UriRetriever $uriRetriever + */ + public function getUriRetriever() + { + if (is_null($this->uriRetriever)) + { + $this->setUriRetriever(new UriRetriever); + } + + return $this->uriRetriever; + } + + /** + * @return Factory + */ + public function getFactory() + { + if (!$this->factory) { + $this->factory = new Factory($this->getUriRetriever()); + } + + return $this->factory; + } + + /** + * @param UriRetriever $uriRetriever + */ + public function setUriRetriever(UriRetriever $uriRetriever) + { + $this->uriRetriever = $uriRetriever; + } + + /** + * {@inheritDoc} + */ + public function addError($path, $message, $constraint='', array $more=null) + { + $error = array( + 'property' => $path, + 'message' => $message, + 'constraint' => $constraint, + ); + + if (is_array($more) && count($more) > 0) + { + $error += $more; + } + + $this->errors[] = $error; + } + + /** + * {@inheritDoc} + */ + public function addErrors(array $errors) + { + $this->errors = array_merge($this->errors, $errors); + } + + /** + * {@inheritDoc} + */ + public function getErrors() + { + return $this->errors; + } + + /** + * {@inheritDoc} + */ + public function isValid() + { + return !$this->getErrors(); + } + + /** + * Clears any reported errors. Should be used between + * multiple validation checks. + */ + public function reset() + { + $this->errors = array(); + } + + /** + * Bubble down the path + * + * @param string $path Current path + * @param mixed $i What to append to the path + * + * @return string + */ + protected function incrementPath($path, $i) + { + if ($path !== '') { + if (is_int($i)) { + $path .= '[' . $i . ']'; + } elseif ($i == '') { + $path .= ''; + } else { + $path .= '.' . $i; + } + } else { + $path = $i; + } + + return $path; + } + + /** + * Validates an array + * + * @param mixed $value + * @param mixed $schema + * @param mixed $path + * @param mixed $i + */ + protected function checkArray($value, $schema = null, $path = null, $i = null) + { + $validator = $this->getFactory()->createInstanceFor('collection'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Validates an object + * + * @param mixed $value + * @param mixed $schema + * @param mixed $path + * @param mixed $i + * @param mixed $patternProperties + */ + protected function checkObject($value, $schema = null, $path = null, $i = null, $patternProperties = null) + { + $validator = $this->getFactory()->createInstanceFor('object'); + $validator->check($value, $schema, $path, $i, $patternProperties); + + $this->addErrors($validator->getErrors()); + } + + /** + * Validates the type of a property + * + * @param mixed $value + * @param mixed $schema + * @param mixed $path + * @param mixed $i + */ + protected function checkType($value, $schema = null, $path = null, $i = null) + { + $validator = $this->getFactory()->createInstanceFor('type'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Checks a undefined element + * + * @param mixed $value + * @param mixed $schema + * @param mixed $path + * @param mixed $i + */ + protected function checkUndefined($value, $schema = null, $path = null, $i = null) + { + $validator = $this->getFactory()->createInstanceFor('undefined'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Checks a string element + * + * @param mixed $value + * @param mixed $schema + * @param mixed $path + * @param mixed $i + */ + protected function checkString($value, $schema = null, $path = null, $i = null) + { + $validator = $this->getFactory()->createInstanceFor('string'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Checks a number element + * + * @param mixed $value + * @param mixed $schema + * @param mixed $path + * @param mixed $i + */ + protected function checkNumber($value, $schema = null, $path = null, $i = null) + { + $validator = $this->getFactory()->createInstanceFor('number'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * Checks a enum element + * + * @param mixed $value + * @param mixed $schema + * @param mixed $path + * @param mixed $i + */ + protected function checkEnum($value, $schema = null, $path = null, $i = null) + { + $validator = $this->getFactory()->createInstanceFor('enum'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + protected function checkFormat($value, $schema = null, $path = null, $i = null) + { + $validator = $this->getFactory()->createInstanceFor('format'); + $validator->check($value, $schema, $path, $i); + + $this->addErrors($validator->getErrors()); + } + + /** + * @param string $uri JSON Schema URI + * @return string JSON Schema contents + */ + protected function retrieveUri($uri) + { + if (null === $this->uriRetriever) { + $this->setUriRetriever(new UriRetriever); + } + $jsonSchema = $this->uriRetriever->retrieve($uri); + // TODO validate using schema + return $jsonSchema; + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php new file mode 100644 index 0000000..34280f4 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php @@ -0,0 +1,60 @@ + + */ +interface ConstraintInterface +{ + /** + * returns all collected errors + * + * @return array + */ + public function getErrors(); + + /** + * adds errors to this validator + * + * @param array $errors + */ + public function addErrors(array $errors); + + /** + * adds an error + * + * @param string $path + * @param string $message + * @param string $constraint the constraint/rule that is broken, e.g.: 'minLength' + * @param array $more more array elements to add to the error + */ + public function addError($path, $message, $constraint='', array $more=null); + + /** + * checks if the validator has not raised errors + * + * @return boolean + */ + public function isValid(); + + /** + * invokes the validation of an element + * + * @abstract + * @param mixed $value + * @param mixed $schema + * @param mixed $path + * @param mixed $i + */ + public function check($value, $schema = null, $path = null, $i = null); +} \ No newline at end of file diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php new file mode 100644 index 0000000..df413e4 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php @@ -0,0 +1,46 @@ + + * @author Bruno Prieto Reis + */ +class EnumConstraint extends Constraint +{ + /** + * {@inheritDoc} + */ + public function check($element, $schema = null, $path = null, $i = null) + { + // Only validate enum if the attribute exists + if ($element instanceof UndefinedConstraint && (!isset($schema->required) || !$schema->required)) { + return; + } + + foreach ($schema->enum as $enum) { + $type = gettype($element); + if ($type === gettype($enum)) { + if ($type == "object") { + if ($element == $enum) + return; + } else { + if ($element === $enum) + return; + + } + } + } + + $this->addError($path, "Does not have a value in the enumeration " . print_r($schema->enum, true), 'enum', array('enum' => $schema->enum,)); + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php new file mode 100644 index 0000000..8cd25c1 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Factory.php @@ -0,0 +1,96 @@ + 'JsonSchema\Constraints\CollectionConstraint', + 'collection' => 'JsonSchema\Constraints\CollectionConstraint', + 'object' => 'JsonSchema\Constraints\ObjectConstraint', + 'type' => 'JsonSchema\Constraints\TypeConstraint', + 'undefined' => 'JsonSchema\Constraints\UndefinedConstraint', + 'string' => 'JsonSchema\Constraints\StringConstraint', + 'number' => 'JsonSchema\Constraints\NumberConstraint', + 'enum' => 'JsonSchema\Constraints\EnumConstraint', + 'format' => 'JsonSchema\Constraints\FormatConstraint', + 'schema' => 'JsonSchema\Constraints\SchemaConstraint', + 'validator' => 'JsonSchema\Validator', + ); + + /** + * @param UriRetriever $uriRetriever + */ + public function __construct(UriRetriever $uriRetriever = null) + { + if (!$uriRetriever) { + $uriRetriever = new UriRetriever(); + } + + $this->uriRetriever = $uriRetriever; + } + + /** + * @return UriRetriever + */ + public function getUriRetriever() + { + return $this->uriRetriever; + } + + /** + * @param string $name + * @param string $class + * @return Factory + */ + public function setConstraintClass($name, $class) + { + // Ensure class exists + if (!class_exists($class)) { + throw new InvalidArgumentException('Unknown constraint ' . $name); + } + // Ensure class is appropriate + if (!in_array('JsonSchema\Constraints\ConstraintInterface', class_implements($class))) { + throw new InvalidArgumentException('Invalid class ' . $name); + } + $this->constraintMap[$name] = $class; + return $this; + } + + /** + * Create a constraint instance for the given constraint name. + * + * @param string $constraintName + * @return ConstraintInterface|ObjectConstraint + * @throws InvalidArgumentException if is not possible create the constraint instance. + */ + public function createInstanceFor($constraintName) + { + if (array_key_exists($constraintName, $this->constraintMap)) { + return new $this->constraintMap[$constraintName](Constraint::CHECK_MODE_NORMAL, $this->uriRetriever, $this); + } + throw new InvalidArgumentException('Unknown constraint ' . $constraintName); + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php new file mode 100644 index 0000000..c789753 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php @@ -0,0 +1,181 @@ + + * @link http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.23 + */ +class FormatConstraint extends Constraint +{ + /** + * {@inheritDoc} + */ + public function check($element, $schema = null, $path = null, $i = null) + { + if (!isset($schema->format)) { + return; + } + + switch ($schema->format) { + case 'date': + if (!$date = $this->validateDateTime($element, 'Y-m-d')) { + $this->addError($path, sprintf('Invalid date %s, expected format YYYY-MM-DD', json_encode($element)), 'format', array('format' => $schema->format,)); + } + break; + + case 'time': + if (!$this->validateDateTime($element, 'H:i:s')) { + $this->addError($path, sprintf('Invalid time %s, expected format hh:mm:ss', json_encode($element)), 'format', array('format' => $schema->format,)); + } + break; + + case 'date-time': + if (!$this->validateDateTime($element, 'Y-m-d\TH:i:s\Z') && + !$this->validateDateTime($element, 'Y-m-d\TH:i:s.u\Z') && + !$this->validateDateTime($element, 'Y-m-d\TH:i:sP') && + !$this->validateDateTime($element, 'Y-m-d\TH:i:sO') + ) { + $this->addError($path, sprintf('Invalid date-time %s, expected format YYYY-MM-DDThh:mm:ssZ or YYYY-MM-DDThh:mm:ss+hh:mm', json_encode($element)), 'format', array('format' => $schema->format,)); + } + break; + + case 'utc-millisec': + if (!$this->validateDateTime($element, 'U')) { + $this->addError($path, sprintf('Invalid time %s, expected integer of milliseconds since Epoch', json_encode($element)), 'format', array('format' => $schema->format,)); + } + break; + + case 'regex': + if (!$this->validateRegex($element)) { + $this->addError($path, 'Invalid regex format ' . $element, 'format', array('format' => $schema->format,)); + } + break; + + case 'color': + if (!$this->validateColor($element)) { + $this->addError($path, "Invalid color", 'format', array('format' => $schema->format,)); + } + break; + + case 'style': + if (!$this->validateStyle($element)) { + $this->addError($path, "Invalid style", 'format', array('format' => $schema->format,)); + } + break; + + case 'phone': + if (!$this->validatePhone($element)) { + $this->addError($path, "Invalid phone number", 'format', array('format' => $schema->format,)); + } + break; + + case 'uri': + if (null === filter_var($element, FILTER_VALIDATE_URL, FILTER_NULL_ON_FAILURE)) { + $this->addError($path, "Invalid URL format", 'format', array('format' => $schema->format,)); + } + break; + + case 'email': + if (null === filter_var($element, FILTER_VALIDATE_EMAIL, FILTER_NULL_ON_FAILURE)) { + $this->addError($path, "Invalid email", 'format', array('format' => $schema->format,)); + } + break; + + case 'ip-address': + case 'ipv4': + if (null === filter_var($element, FILTER_VALIDATE_IP, FILTER_NULL_ON_FAILURE | FILTER_FLAG_IPV4)) { + $this->addError($path, "Invalid IP address", 'format', array('format' => $schema->format,)); + } + break; + + case 'ipv6': + if (null === filter_var($element, FILTER_VALIDATE_IP, FILTER_NULL_ON_FAILURE | FILTER_FLAG_IPV6)) { + $this->addError($path, "Invalid IP address", 'format', array('format' => $schema->format,)); + } + break; + + case 'host-name': + case 'hostname': + if (!$this->validateHostname($element)) { + $this->addError($path, "Invalid hostname", 'format', array('format' => $schema->format,)); + } + break; + + default: + // Empty as it should be: + // The value of this keyword is called a format attribute. It MUST be a string. + // A format attribute can generally only validate a given set of instance types. + // If the type of the instance to validate is not in this set, validation for + // this format attribute and instance SHOULD succeed. + // http://json-schema.org/latest/json-schema-validation.html#anchor105 + break; + } + } + + protected function validateDateTime($datetime, $format) + { + $dt = \DateTime::createFromFormat($format, $datetime); + + if (!$dt) { + return false; + } + + if ($datetime === $dt->format($format)) { + return true; + } + + // handles the case where a non-6 digit microsecond datetime is passed + // which will fail the above string comparison because the passed + // $datetime may be '2000-05-01T12:12:12.123Z' but format() will return + // '2000-05-01T12:12:12.123000Z' + if ((strpos('u', $format) !== -1) && (intval($dt->format('u')) > 0)) { + return true; + } + + return false; + } + + protected function validateRegex($regex) + { + return false !== @preg_match('/' . $regex . '/', ''); + } + + protected function validateColor($color) + { + if (in_array(strtolower($color), array('aqua', 'black', 'blue', 'fuchsia', + 'gray', 'green', 'lime', 'maroon', 'navy', 'olive', 'orange', 'purple', + 'red', 'silver', 'teal', 'white', 'yellow'))) { + return true; + } + + return preg_match('/^#([a-f0-9]{3}|[a-f0-9]{6})$/i', $color); + } + + protected function validateStyle($style) + { + $properties = explode(';', rtrim($style, ';')); + $invalidEntries = preg_grep('/^\s*[-a-z]+\s*:\s*.+$/i', $properties, PREG_GREP_INVERT); + + return empty($invalidEntries); + } + + protected function validatePhone($phone) + { + return preg_match('/^\+?(\(\d{3}\)|\d{3}) \d{3} \d{4}$/', $phone); + } + + protected function validateHostname($host) + { + return preg_match('/^[_a-z]+\.([_a-z]+\.?)+$/i', $host); + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php new file mode 100644 index 0000000..c5aaf6a --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php @@ -0,0 +1,83 @@ + + * @author Bruno Prieto Reis + */ +class NumberConstraint extends Constraint +{ + /** + * {@inheritDoc} + */ + public function check($element, $schema = null, $path = null, $i = null) + { + // Verify minimum + if (isset($schema->exclusiveMinimum)) { + if (isset($schema->minimum)) { + if ($schema->exclusiveMinimum && $element <= $schema->minimum) { + $this->addError($path, "Must have a minimum value of " . $schema->minimum, 'exclusiveMinimum', array('minimum' => $schema->minimum,)); + } else if ($element < $schema->minimum) { + $this->addError($path, "Must have a minimum value of " . $schema->minimum, 'minimum', array('minimum' => $schema->minimum,)); + } + } else { + $this->addError($path, "Use of exclusiveMinimum requires presence of minimum", 'missingMinimum'); + } + } else if (isset($schema->minimum) && $element < $schema->minimum) { + $this->addError($path, "Must have a minimum value of " . $schema->minimum, 'minimum', array('minimum' => $schema->minimum,)); + } + + // Verify maximum + if (isset($schema->exclusiveMaximum)) { + if (isset($schema->maximum)) { + if ($schema->exclusiveMaximum && $element >= $schema->maximum) { + $this->addError($path, "Must have a maximum value of " . $schema->maximum, 'exclusiveMaximum', array('maximum' => $schema->maximum,)); + } else if ($element > $schema->maximum) { + $this->addError($path, "Must have a maximum value of " . $schema->maximum, 'maximum', array('maximum' => $schema->maximum,)); + } + } else { + $this->addError($path, "Use of exclusiveMaximum requires presence of maximum", 'missingMinimum'); + } + } else if (isset($schema->maximum) && $element > $schema->maximum) { + $this->addError($path, "Must have a maximum value of " . $schema->maximum, 'maximum', array('maximum' => $schema->maximum,)); + } + + // Verify divisibleBy - Draft v3 + if (isset($schema->divisibleBy) && $this->fmod($element, $schema->divisibleBy) != 0) { + $this->addError($path, "Is not divisible by " . $schema->divisibleBy, 'divisibleBy', array('divisibleBy' => $schema->divisibleBy,)); + } + + // Verify multipleOf - Draft v4 + if (isset($schema->multipleOf) && $this->fmod($element, $schema->multipleOf) != 0) { + $this->addError($path, "Must be a multiple of " . $schema->multipleOf, 'multipleOf', array('multipleOf' => $schema->multipleOf,)); + } + + $this->checkFormat($element, $schema, $path, $i); + } + + private function fmod($number1, $number2) + { + $modulus = fmod($number1, $number2); + $precision = abs(0.0000000001); + $diff = (float)($modulus - $number2); + + if (-$precision < $diff && $diff < $precision) { + return 0.0; + } + + $decimals1 = mb_strpos($number1, ".") ? mb_strlen($number1) - mb_strpos($number1, ".") - 1 : 0; + $decimals2 = mb_strpos($number2, ".") ? mb_strlen($number2) - mb_strpos($number2, ".") - 1 : 0; + + return (float)round($modulus, max($decimals1, $decimals2)); + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php new file mode 100644 index 0000000..0e5cf1b --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php @@ -0,0 +1,149 @@ + + * @author Bruno Prieto Reis + */ +class ObjectConstraint extends Constraint +{ + /** + * {@inheritDoc} + */ + function check($element, $definition = null, $path = null, $additionalProp = null, $patternProperties = null) + { + if ($element instanceof UndefinedConstraint) { + return; + } + + $matches = array(); + if ($patternProperties) { + $matches = $this->validatePatternProperties($element, $path, $patternProperties); + } + + if ($definition) { + // validate the definition properties + $this->validateDefinition($element, $definition, $path); + } + + // additional the element properties + $this->validateElement($element, $matches, $definition, $path, $additionalProp); + } + + public function validatePatternProperties($element, $path, $patternProperties) + { + $try = array('/','#','+','~','%'); + $matches = array(); + foreach ($patternProperties as $pregex => $schema) { + $delimiter = '/'; + // Choose delimiter. Necessary for patterns like ^/ , otherwise you get error + foreach ($try as $delimiter) { + if (strpos($pregex, $delimiter) === false) { // safe to use + break; + } + } + + // Validate the pattern before using it to test for matches + if (@preg_match($delimiter. $pregex . $delimiter, '') === false) { + $this->addError($path, 'The pattern "' . $pregex . '" is invalid', 'pregex', array('pregex' => $pregex,)); + continue; + } + foreach ($element as $i => $value) { + if (preg_match($delimiter . $pregex . $delimiter, $i)) { + $matches[] = $i; + $this->checkUndefined($value, $schema ? : new \stdClass(), $path, $i); + } + } + } + return $matches; + } + + /** + * Validates the element properties + * + * @param \stdClass $element Element to validate + * @param array $matches Matches from patternProperties (if any) + * @param \stdClass $objectDefinition ObjectConstraint definition + * @param string $path Path to test? + * @param mixed $additionalProp Additional properties + */ + public function validateElement($element, $matches, $objectDefinition = null, $path = null, $additionalProp = null) + { + foreach ($element as $i => $value) { + + $property = $this->getProperty($element, $i, new UndefinedConstraint()); + $definition = $this->getProperty($objectDefinition, $i); + + // no additional properties allowed + if (!in_array($i, $matches) && $additionalProp === false && $this->inlineSchemaProperty !== $i && !$definition) { + $this->addError($path, "The property " . $i . " is not defined and the definition does not allow additional properties", 'additionalProp'); + } + + // additional properties defined + if (!in_array($i, $matches) && $additionalProp && !$definition) { + if ($additionalProp === true) { + $this->checkUndefined($value, null, $path, $i); + } else { + $this->checkUndefined($value, $additionalProp, $path, $i); + } + } + + // property requires presence of another + $require = $this->getProperty($definition, 'requires'); + if ($require && !$this->getProperty($element, $require)) { + $this->addError($path, "The presence of the property " . $i . " requires that " . $require . " also be present", 'requires'); + } + + if (!$definition) { + // normal property verification + $this->checkUndefined($value, new \stdClass(), $path, $i); + } + } + } + + /** + * Validates the definition properties + * + * @param \stdClass $element Element to validate + * @param \stdClass $objectDefinition ObjectConstraint definition + * @param string $path Path? + */ + public function validateDefinition($element, $objectDefinition = null, $path = null) + { + foreach ($objectDefinition as $i => $value) { + $property = $this->getProperty($element, $i, new UndefinedConstraint()); + $definition = $this->getProperty($objectDefinition, $i); + $this->checkUndefined($property, $definition, $path, $i); + } + } + + /** + * retrieves a property from an object or array + * + * @param mixed $element Element to validate + * @param string $property Property to retrieve + * @param mixed $fallback Default value if property is not found + * + * @return mixed + */ + protected function getProperty($element, $property, $fallback = null) + { + if (is_array($element) /*$this->checkMode == self::CHECK_MODE_TYPE_CAST*/) { + return array_key_exists($property, $element) ? $element[$property] : $fallback; + } elseif (is_object($element)) { + return property_exists($element, $property) ? $element->$property : $fallback; + } + + return $fallback; + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php new file mode 100644 index 0000000..b856a11 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php @@ -0,0 +1,37 @@ + + * @author Bruno Prieto Reis + */ +class SchemaConstraint extends Constraint +{ + /** + * {@inheritDoc} + */ + public function check($element, $schema = null, $path = null, $i = null) + { + if ($schema !== null) { + // passed schema + $this->checkUndefined($element, $schema, '', ''); + } elseif (property_exists($element, $this->inlineSchemaProperty)) { + // inline schema + $this->checkUndefined($element, $element->{$this->inlineSchemaProperty}, '', ''); + } else { + throw new InvalidArgumentException('no schema found to verify against'); + } + } +} \ No newline at end of file diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php new file mode 100644 index 0000000..f57f64c --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php @@ -0,0 +1,57 @@ + + * @author Bruno Prieto Reis + */ +class StringConstraint extends Constraint +{ + /** + * {@inheritDoc} + */ + public function check($element, $schema = null, $path = null, $i = null) + { + // Verify maxLength + if (isset($schema->maxLength) && $this->strlen($element) > $schema->maxLength) { + $this->addError($path, "Must be at most " . $schema->maxLength . " characters long", 'maxLength', array( + 'maxLength' => $schema->maxLength, + )); + } + + //verify minLength + if (isset($schema->minLength) && $this->strlen($element) < $schema->minLength) { + $this->addError($path, "Must be at least " . $schema->minLength . " characters long", 'minLength', array( + 'minLength' => $schema->minLength, + )); + } + + // Verify a regex pattern + if (isset($schema->pattern) && !preg_match('#' . str_replace('#', '\\#', $schema->pattern) . '#', $element)) { + $this->addError($path, "Does not match the regex pattern " . $schema->pattern, 'pattern', array( + 'pattern' => $schema->pattern, + )); + } + + $this->checkFormat($element, $schema, $path, $i); + } + + private function strlen($string) + { + if (extension_loaded('mbstring')) { + return mb_strlen($string, mb_detect_encoding($string)); + } else { + return strlen($string); + } + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php new file mode 100644 index 0000000..837cfd8 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php @@ -0,0 +1,145 @@ + + * @author Bruno Prieto Reis + */ +class TypeConstraint extends Constraint +{ + /** + * @var array|string[] type wordings for validation error messages + */ + static $wording = array( + 'integer' => 'an integer', + 'number' => 'a number', + 'boolean' => 'a boolean', + 'object' => 'an object', + 'array' => 'an array', + 'string' => 'a string', + 'null' => 'a null', + 'any' => NULL, // validation of 'any' is always true so is not needed in message wording + 0 => NULL, // validation of a false-y value is always true, so not needed as well + ); + + /** + * {@inheritDoc} + */ + public function check($value = null, $schema = null, $path = null, $i = null) + { + $type = isset($schema->type) ? $schema->type : null; + $isValid = true; + + if (is_array($type)) { + // @TODO refactor + $validatedOneType = false; + $errors = array(); + foreach ($type as $tp) { + $validator = new TypeConstraint($this->checkMode); + $subSchema = new \stdClass(); + $subSchema->type = $tp; + $validator->check($value, $subSchema, $path, null); + $error = $validator->getErrors(); + + if (!count($error)) { + $validatedOneType = true; + break; + } + + $errors = $error; + } + + if (!$validatedOneType) { + $this->addErrors($errors); + + return; + } + } elseif (is_object($type)) { + $this->checkUndefined($value, $type, $path); + } else { + $isValid = $this->validateType($value, $type); + } + + if ($isValid === false) { + if (!isset(self::$wording[$type])) { + throw new StandardUnexpectedValueException( + sprintf( + "No wording for %s available, expected wordings are: [%s]", + var_export($type, true), + implode(', ', array_filter(self::$wording))) + ); + } + $this->addError($path, ucwords(gettype($value)) . " value found, but " . self::$wording[$type] . " is required", 'type'); + } + } + + /** + * Verifies that a given value is of a certain type + * + * @param mixed $value Value to validate + * @param string $type TypeConstraint to check against + * + * @return boolean + * + * @throws InvalidArgumentException + */ + protected function validateType($value, $type) + { + //mostly the case for inline schema + if (!$type) { + return true; + } + + if ('integer' === $type) { + return is_int($value); + } + + if ('number' === $type) { + return is_numeric($value) && !is_string($value); + } + + if ('boolean' === $type) { + return is_bool($value); + } + + if ('object' === $type) { + return is_object($value); + //return ($this::CHECK_MODE_TYPE_CAST == $this->checkMode) ? is_array($value) : is_object($value); + } + + if ('array' === $type) { + return is_array($value); + } + + if ('string' === $type) { + return is_string($value); + } + + if ('email' === $type) { + return is_string($value); + } + + if ('null' === $type) { + return is_null($value); + } + + if ('any' === $type) { + return true; + } + + throw new InvalidArgumentException((is_object($value) ? 'object' : $value) . ' is an invalid type for ' . $type); + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php new file mode 100644 index 0000000..c033720 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php @@ -0,0 +1,307 @@ + + * @author Bruno Prieto Reis + */ +class UndefinedConstraint extends Constraint +{ + /** + * {@inheritDoc} + */ + public function check($value, $schema = null, $path = null, $i = null) + { + if (is_null($schema)) { + return; + } + + if (!is_object($schema)) { + throw new InvalidArgumentException( + 'Given schema must be an object in ' . $path + . ' but is a ' . gettype($schema) + ); + } + + $i = is_null($i) ? "" : $i; + $path = $this->incrementPath($path, $i); + + // check special properties + $this->validateCommonProperties($value, $schema, $path); + + // check allOf, anyOf, and oneOf properties + $this->validateOfProperties($value, $schema, $path); + + // check known types + $this->validateTypes($value, $schema, $path, $i); + } + + /** + * Validates the value against the types + * + * @param mixed $value + * @param mixed $schema + * @param string $path + * @param string $i + */ + public function validateTypes($value, $schema = null, $path = null, $i = null) + { + // check array + if (is_array($value)) { + $this->checkArray($value, $schema, $path, $i); + } + + // check object + if (is_object($value) && (isset($schema->properties) || isset($schema->patternProperties) || isset($schema->additionalProperties))) { + $this->checkObject( + $value, + isset($schema->properties) ? $schema->properties : null, + $path, + isset($schema->additionalProperties) ? $schema->additionalProperties : null, + isset($schema->patternProperties) ? $schema->patternProperties : null + ); + } + + // check string + if (is_string($value)) { + $this->checkString($value, $schema, $path, $i); + } + + // check numeric + if (is_numeric($value)) { + $this->checkNumber($value, $schema, $path, $i); + } + + // check enum + if (isset($schema->enum)) { + $this->checkEnum($value, $schema, $path, $i); + } + } + + /** + * Validates common properties + * + * @param mixed $value + * @param mixed $schema + * @param string $path + * @param string $i + */ + protected function validateCommonProperties($value, $schema = null, $path = null, $i = "") + { + // if it extends another schema, it must pass that schema as well + if (isset($schema->extends)) { + if (is_string($schema->extends)) { + $schema->extends = $this->validateUri($schema, $schema->extends); + } + if (is_array($schema->extends)) { + foreach ($schema->extends as $extends) { + $this->checkUndefined($value, $extends, $path, $i); + } + } else { + $this->checkUndefined($value, $schema->extends, $path, $i); + } + } + + // Verify required values + if (is_object($value)) { + if (!($value instanceof UndefinedConstraint) && isset($schema->required) && is_array($schema->required) ) { + // Draft 4 - Required is an array of strings - e.g. "required": ["foo", ...] + foreach ($schema->required as $required) { + if (!property_exists($value, $required)) { + $this->addError((!$path) ? $required : "$path.$required", "The property " . $required . " is required", 'required'); + } + } + } else if (isset($schema->required) && !is_array($schema->required)) { + // Draft 3 - Required attribute - e.g. "foo": {"type": "string", "required": true} + if ( $schema->required && $value instanceof UndefinedConstraint) { + $this->addError($path, "Is missing and it is required", 'required'); + } + } + } + + // Verify type + if (!($value instanceof UndefinedConstraint)) { + $this->checkType($value, $schema, $path); + } + + // Verify disallowed items + if (isset($schema->disallow)) { + $initErrors = $this->getErrors(); + + $typeSchema = new \stdClass(); + $typeSchema->type = $schema->disallow; + $this->checkType($value, $typeSchema, $path); + + // if no new errors were raised it must be a disallowed value + if (count($this->getErrors()) == count($initErrors)) { + $this->addError($path, "Disallowed value was matched", 'disallow'); + } else { + $this->errors = $initErrors; + } + } + + if (isset($schema->not)) { + $initErrors = $this->getErrors(); + $this->checkUndefined($value, $schema->not, $path, $i); + + // if no new errors were raised then the instance validated against the "not" schema + if (count($this->getErrors()) == count($initErrors)) { + $this->addError($path, "Matched a schema which it should not", 'not'); + } else { + $this->errors = $initErrors; + } + } + + // Verify minimum and maximum number of properties + if (is_object($value)) { + if (isset($schema->minProperties)) { + if (count(get_object_vars($value)) < $schema->minProperties) { + $this->addError($path, "Must contain a minimum of " . $schema->minProperties . " properties", 'minProperties', array('minProperties' => $schema->minProperties,)); + } + } + if (isset($schema->maxProperties)) { + if (count(get_object_vars($value)) > $schema->maxProperties) { + $this->addError($path, "Must contain no more than " . $schema->maxProperties . " properties", 'maxProperties', array('maxProperties' => $schema->maxProperties,)); + } + } + } + + // Verify that dependencies are met + if (is_object($value) && isset($schema->dependencies)) { + $this->validateDependencies($value, $schema->dependencies, $path); + } + } + + /** + * Validate allOf, anyOf, and oneOf properties + * + * @param mixed $value + * @param mixed $schema + * @param string $path + * @param string $i + */ + protected function validateOfProperties($value, $schema, $path, $i = "") + { + // Verify type + if ($value instanceof UndefinedConstraint) { + return; + } + + if (isset($schema->allOf)) { + $isValid = true; + foreach ($schema->allOf as $allOf) { + $initErrors = $this->getErrors(); + $this->checkUndefined($value, $allOf, $path, $i); + $isValid = $isValid && (count($this->getErrors()) == count($initErrors)); + } + if (!$isValid) { + $this->addError($path, "Failed to match all schemas", 'allOf'); + } + } + + if (isset($schema->anyOf)) { + $isValid = false; + $startErrors = $this->getErrors(); + foreach ($schema->anyOf as $anyOf) { + $initErrors = $this->getErrors(); + $this->checkUndefined($value, $anyOf, $path, $i); + if ($isValid = (count($this->getErrors()) == count($initErrors))) { + break; + } + } + if (!$isValid) { + $this->addError($path, "Failed to match at least one schema", 'anyOf'); + } else { + $this->errors = $startErrors; + } + } + + if (isset($schema->oneOf)) { + $allErrors = array(); + $matchedSchemas = 0; + $startErrors = $this->getErrors(); + foreach ($schema->oneOf as $oneOf) { + $this->errors = array(); + $this->checkUndefined($value, $oneOf, $path, $i); + if (count($this->getErrors()) == 0) { + $matchedSchemas++; + } + $allErrors = array_merge($allErrors, array_values($this->getErrors())); + } + if ($matchedSchemas !== 1) { + $this->addErrors( + array_merge( + $allErrors, + array(array( + 'property' => $path, + 'message' => "Failed to match exactly one schema", + 'constraint' => 'oneOf', + ),), + $startErrors + ) + ); + } else { + $this->errors = $startErrors; + } + } + } + + /** + * Validate dependencies + * + * @param mixed $value + * @param mixed $dependencies + * @param string $path + * @param string $i + */ + protected function validateDependencies($value, $dependencies, $path, $i = "") + { + foreach ($dependencies as $key => $dependency) { + if (property_exists($value, $key)) { + if (is_string($dependency)) { + // Draft 3 string is allowed - e.g. "dependencies": {"bar": "foo"} + if (!property_exists($value, $dependency)) { + $this->addError($path, "$key depends on $dependency and $dependency is missing", 'dependencies'); + } + } else if (is_array($dependency)) { + // Draft 4 must be an array - e.g. "dependencies": {"bar": ["foo"]} + foreach ($dependency as $d) { + if (!property_exists($value, $d)) { + $this->addError($path, "$key depends on $d and $d is missing", 'dependencies'); + } + } + } else if (is_object($dependency)) { + // Schema - e.g. "dependencies": {"bar": {"properties": {"foo": {...}}}} + $this->checkUndefined($value, $dependency, $path, $i); + } + } + } + } + + protected function validateUri($schema, $schemaUri = null) + { + $resolver = new UriResolver(); + $retriever = $this->getUriRetriever(); + + $jsonSchema = null; + if ($resolver->isValid($schemaUri)) { + $schemaId = property_exists($schema, 'id') ? $schema->id : null; + $jsonSchema = $retriever->retrieve($schemaId, $schemaUri); + } + + return $jsonSchema; + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..ec702a7 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php @@ -0,0 +1,17 @@ + + * @see README.md + */ +class RefResolver +{ + /** + * HACK to prevent too many recursive expansions. + * Happens e.g. when you want to validate a schema against the schema + * definition. + * + * @var integer + */ + protected static $depth = 0; + + /** + * maximum references depth + * @var integer + */ + public static $maxDepth = 7; + + /** + * @var UriRetrieverInterface + */ + protected $uriRetriever = null; + + /** + * @var object + */ + protected $rootSchema = null; + + /** + * @param UriRetriever $retriever + */ + public function __construct($retriever = null) + { + $this->uriRetriever = $retriever; + } + + /** + * Retrieves a given schema given a ref and a source URI + * + * @param string $ref Reference from schema + * @param string $sourceUri URI where original schema was located + * @return object Schema + */ + public function fetchRef($ref, $sourceUri) + { + $retriever = $this->getUriRetriever(); + $jsonSchema = $retriever->retrieve($ref, $sourceUri); + $this->resolve($jsonSchema); + + return $jsonSchema; + } + + /** + * Return the URI Retriever, defaulting to making a new one if one + * was not yet set. + * + * @return UriRetriever + */ + public function getUriRetriever() + { + if (is_null($this->uriRetriever)) { + $this->setUriRetriever(new UriRetriever); + } + + return $this->uriRetriever; + } + + /** + * Resolves all $ref references for a given schema. Recurses through + * the object to resolve references of any child schemas. + * + * The 'format' property is omitted because it isn't required for + * validation. Theoretically, this class could be extended to look + * for URIs in formats: "These custom formats MAY be expressed as + * an URI, and this URI MAY reference a schema of that format." + * + * The 'id' property is not filled in, but that could be made to happen. + * + * @param object $schema JSON Schema to flesh out + * @param string $sourceUri URI where this schema was located + */ + public function resolve($schema, $sourceUri = null) + { + if (self::$depth > self::$maxDepth) { + self::$depth = 0; + throw new JsonDecodingException(JSON_ERROR_DEPTH); + } + ++self::$depth; + + if (! is_object($schema)) { + --self::$depth; + return; + } + + if (null === $sourceUri && ! empty($schema->id)) { + $sourceUri = $schema->id; + } + + if (null === $this->rootSchema) { + $this->rootSchema = $schema; + } + + // Resolve $ref first + $this->resolveRef($schema, $sourceUri); + + // These properties are just schemas + // eg. items can be a schema or an array of schemas + foreach (array('additionalItems', 'additionalProperties', 'extends', 'items') as $propertyName) { + $this->resolveProperty($schema, $propertyName, $sourceUri); + } + + // These are all potentially arrays that contain schema objects + // eg. type can be a value or an array of values/schemas + // eg. items can be a schema or an array of schemas + foreach (array('disallow', 'extends', 'items', 'type', 'allOf', 'anyOf', 'oneOf') as $propertyName) { + $this->resolveArrayOfSchemas($schema, $propertyName, $sourceUri); + } + + // These are all objects containing properties whose values are schemas + foreach (array('dependencies', 'patternProperties', 'properties') as $propertyName) { + $this->resolveObjectOfSchemas($schema, $propertyName, $sourceUri); + } + + --self::$depth; + } + + /** + * Given an object and a property name, that property should be an + * array whose values can be schemas. + * + * @param object $schema JSON Schema to flesh out + * @param string $propertyName Property to work on + * @param string $sourceUri URI where this schema was located + */ + public function resolveArrayOfSchemas($schema, $propertyName, $sourceUri) + { + if (! isset($schema->$propertyName) || ! is_array($schema->$propertyName)) { + return; + } + + foreach ($schema->$propertyName as $possiblySchema) { + $this->resolve($possiblySchema, $sourceUri); + } + } + + /** + * Given an object and a property name, that property should be an + * object whose properties are schema objects. + * + * @param object $schema JSON Schema to flesh out + * @param string $propertyName Property to work on + * @param string $sourceUri URI where this schema was located + */ + public function resolveObjectOfSchemas($schema, $propertyName, $sourceUri) + { + if (! isset($schema->$propertyName) || ! is_object($schema->$propertyName)) { + return; + } + + foreach (get_object_vars($schema->$propertyName) as $possiblySchema) { + $this->resolve($possiblySchema, $sourceUri); + } + } + + /** + * Given an object and a property name, that property should be a + * schema object. + * + * @param object $schema JSON Schema to flesh out + * @param string $propertyName Property to work on + * @param string $sourceUri URI where this schema was located + */ + public function resolveProperty($schema, $propertyName, $sourceUri) + { + if (! isset($schema->$propertyName)) { + return; + } + + $this->resolve($schema->$propertyName, $sourceUri); + } + + /** + * Look for the $ref property in the object. If found, remove the + * reference and augment this object with the contents of another + * schema. + * + * @param object $schema JSON Schema to flesh out + * @param string $sourceUri URI where this schema was located + */ + public function resolveRef($schema, $sourceUri) + { + $ref = '$ref'; + + if (empty($schema->$ref)) { + return; + } + + $splitRef = explode('#', $schema->$ref, 2); + + $refDoc = $splitRef[0]; + $refPath = null; + if (count($splitRef) === 2) { + $refPath = explode('/', $splitRef[1]); + array_shift($refPath); + } + + if (empty($refDoc) && empty($refPath)) { + // TODO: Not yet implemented - root pointer ref, causes recursion issues + return; + } + + if (!empty($refDoc)) { + $refSchema = $this->fetchRef($refDoc, $sourceUri); + } else { + $refSchema = $this->rootSchema; + } + + if (null !== $refPath) { + $refSchema = $this->resolveRefSegment($refSchema, $refPath); + } + + unset($schema->$ref); + + // Augment the current $schema object with properties fetched + foreach (get_object_vars($refSchema) as $prop => $value) { + $schema->$prop = $value; + } + } + + /** + * Set URI Retriever for use with the Ref Resolver + * + * @param UriRetriever $retriever + * @return $this for chaining + */ + public function setUriRetriever(UriRetriever $retriever) + { + $this->uriRetriever = $retriever; + + return $this; + } + + protected function resolveRefSegment($data, $pathParts) + { + foreach ($pathParts as $path) { + $path = strtr($path, array('~1' => '/', '~0' => '~', '%25' => '%')); + + if (is_array($data)) { + $data = $data[$path]; + } else { + $data = $data->{$path}; + } + } + + return $data; + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php new file mode 100644 index 0000000..f924ad8 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php @@ -0,0 +1,29 @@ + + */ +abstract class AbstractRetriever implements UriRetrieverInterface +{ + /** + * Media content type + * @var string + */ + protected $contentType; + + /** + * {@inheritDoc} + * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::getContentType() + */ + public function getContentType() + { + return $this->contentType; + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php new file mode 100644 index 0000000..cd8414f --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php @@ -0,0 +1,79 @@ + + */ +class Curl extends AbstractRetriever +{ + protected $messageBody; + + public function __construct() + { + if (!function_exists('curl_init')) { + throw new \RuntimeException("cURL not installed"); + } + } + + /** + * {@inheritDoc} + * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::retrieve() + */ + public function retrieve($uri) + { + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $uri); + curl_setopt($ch, CURLOPT_HEADER, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: ' . Validator::SCHEMA_MEDIA_TYPE)); + + $response = curl_exec($ch); + if (false === $response) { + throw new \JsonSchema\Exception\ResourceNotFoundException('JSON schema not found'); + } + + $this->fetchMessageBody($response); + $this->fetchContentType($response); + + curl_close($ch); + + return $this->messageBody; + } + + /** + * @param string $response cURL HTTP response + */ + private function fetchMessageBody($response) + { + preg_match("/(?:\r\n){2}(.*)$/ms", $response, $match); + $this->messageBody = $match[1]; + } + + /** + * @param string $response cURL HTTP response + * @return boolean Whether the Content-Type header was found or not + */ + protected function fetchContentType($response) + { + if (0 < preg_match("/Content-Type:(\V*)/ims", $response, $match)) { + $this->contentType = trim($match[1]); + + return true; + } + + return false; + } +} \ No newline at end of file diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php new file mode 100644 index 0000000..bc43de6 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php @@ -0,0 +1,87 @@ + + */ +class FileGetContents extends AbstractRetriever +{ + protected $messageBody; + + /** + * {@inheritDoc} + * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::retrieve() + */ + public function retrieve($uri) + { + $context = stream_context_create(array( + 'http' => array( + 'method' => 'GET', + 'header' => "Accept: " . Validator::SCHEMA_MEDIA_TYPE + ))); + + set_error_handler(function() use ($uri) { + throw new ResourceNotFoundException('JSON schema not found at ' . $uri); + }); + $response = file_get_contents($uri); + restore_error_handler(); + + if (false === $response) { + throw new ResourceNotFoundException('JSON schema not found at ' . $uri); + } + if ($response == '' + && substr($uri, 0, 7) == 'file://' && substr($uri, -1) == '/' + ) { + throw new ResourceNotFoundException('JSON schema not found at ' . $uri); + } + + $this->messageBody = $response; + if (! empty($http_response_header)) { + $this->fetchContentType($http_response_header); + } else { + // Could be a "file://" url or something else - fake up the response + $this->contentType = null; + } + + return $this->messageBody; + } + + /** + * @param array $headers HTTP Response Headers + * @return boolean Whether the Content-Type header was found or not + */ + private function fetchContentType(array $headers) + { + foreach ($headers as $header) { + if ($this->contentType = self::getContentTypeMatchInHeader($header)) { + return true; + } + } + + return false; + } + + /** + * @param string $header + * @return string|null + */ + protected static function getContentTypeMatchInHeader($header) + { + if (0 < preg_match("/Content-Type:(\V*)/ims", $header, $match)) { + return trim($match[1]); + } + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php new file mode 100644 index 0000000..7652c42 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php @@ -0,0 +1,54 @@ + '{ ... }', + * 'http://acme.com/schemas/address#' => '{ ... }', + * )) + * + * $schema = $retriever->retrieve('http://acme.com/schemas/person#'); + */ +class PredefinedArray extends AbstractRetriever +{ + /** + * Contains schemas as URI => JSON + * @var array + */ + private $schemas; + + /** + * Constructor + * + * @param array $schemas + * @param string $contentType + */ + public function __construct(array $schemas, $contentType = Validator::SCHEMA_MEDIA_TYPE) + { + $this->schemas = $schemas; + $this->contentType = $contentType; + } + + /** + * {@inheritDoc} + * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::retrieve() + */ + public function retrieve($uri) + { + if (!array_key_exists($uri, $this->schemas)) { + throw new \JsonSchema\Exception\ResourceNotFoundException(sprintf( + 'The JSON schema "%s" was not found.', + $uri + )); + } + + return $this->schemas[$uri]; + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php new file mode 100644 index 0000000..c324998 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php @@ -0,0 +1,32 @@ + + */ +interface UriRetrieverInterface +{ + /** + * Retrieve a schema from the specified URI + * @param string $uri URI that resolves to a JSON schema + * @throws \JsonSchema\Exception\ResourceNotFoundException + * @return mixed string|null + */ + public function retrieve($uri); + + /** + * Get media content type + * @return string + */ + public function getContentType(); +} \ No newline at end of file diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php new file mode 100644 index 0000000..9784114 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php @@ -0,0 +1,157 @@ + + */ +class UriResolver +{ + /** + * Parses a URI into five main components + * + * @param string $uri + * @return array + */ + public function parse($uri) + { + preg_match('|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|', $uri, $match); + + $components = array(); + if (5 < count($match)) { + $components = array( + 'scheme' => $match[2], + 'authority' => $match[4], + 'path' => $match[5] + ); + } + if (7 < count($match)) { + $components['query'] = $match[7]; + } + if (9 < count($match)) { + $components['fragment'] = $match[9]; + } + + return $components; + } + + /** + * Builds a URI based on n array with the main components + * + * @param array $components + * @return string + */ + public function generate(array $components) + { + $uri = $components['scheme'] . '://' + . $components['authority'] + . $components['path']; + + if (array_key_exists('query', $components)) { + $uri .= $components['query']; + } + if (array_key_exists('fragment', $components)) { + $uri .= '#' . $components['fragment']; + } + + return $uri; + } + + /** + * Resolves a URI + * + * @param string $uri Absolute or relative + * @param string $baseUri Optional base URI + * @return string Absolute URI + */ + public function resolve($uri, $baseUri = null) + { + if ($uri == '') { + return $baseUri; + } + + $components = $this->parse($uri); + $path = $components['path']; + + if (! empty($components['scheme'])) { + return $uri; + } + $baseComponents = $this->parse($baseUri); + $basePath = $baseComponents['path']; + + $baseComponents['path'] = self::combineRelativePathWithBasePath($path, $basePath); + if (isset($components['fragment'])) { + $baseComponents['fragment'] = $components['fragment']; + } + + return $this->generate($baseComponents); + } + + /** + * Tries to glue a relative path onto an absolute one + * + * @param string $relativePath + * @param string $basePath + * @return string Merged path + * @throws UriResolverException + */ + public static function combineRelativePathWithBasePath($relativePath, $basePath) + { + $relativePath = self::normalizePath($relativePath); + if ($relativePath == '') { + return $basePath; + } + if ($relativePath{0} == '/') { + return $relativePath; + } + + $basePathSegments = explode('/', $basePath); + + preg_match('|^/?(\.\./(?:\./)*)*|', $relativePath, $match); + $numLevelUp = strlen($match[0]) /3 + 1; + if ($numLevelUp >= count($basePathSegments)) { + throw new UriResolverException(sprintf("Unable to resolve URI '%s' from base '%s'", $relativePath, $basePath)); + } + + $basePathSegments = array_slice($basePathSegments, 0, -$numLevelUp); + $path = preg_replace('|^/?(\.\./(\./)*)*|', '', $relativePath); + + return implode('/', $basePathSegments) . '/' . $path; + } + + /** + * Normalizes a URI path component by removing dot-slash and double slashes + * + * @param string $path + * @return string + */ + private static function normalizePath($path) + { + $path = preg_replace('|((?parse($uri); + + return !empty($components); + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php new file mode 100644 index 0000000..c723cd9 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php @@ -0,0 +1,289 @@ + + */ +class UriRetriever +{ + /** + * @var null|UriRetrieverInterface + */ + protected $uriRetriever = null; + + /** + * @var array|object[] + * @see loadSchema + */ + private $schemaCache = array(); + + /** + * Guarantee the correct media type was encountered + * + * @param UriRetrieverInterface $uriRetriever + * @param string $uri + * @return bool|void + */ + public function confirmMediaType($uriRetriever, $uri) + { + $contentType = $uriRetriever->getContentType(); + + if (is_null($contentType)) { + // Well, we didn't get an invalid one + return; + } + + if (Validator::SCHEMA_MEDIA_TYPE === $contentType) { + return; + } + + if (substr($uri, 0, 23) == 'http://json-schema.org/') { + //HACK; they deliver broken content types + return true; + } + + throw new InvalidSchemaMediaTypeException(sprintf('Media type %s expected', Validator::SCHEMA_MEDIA_TYPE)); + } + + /** + * Get a URI Retriever + * + * If none is specified, sets a default FileGetContents retriever and + * returns that object. + * + * @return UriRetrieverInterface + */ + public function getUriRetriever() + { + if (is_null($this->uriRetriever)) { + $this->setUriRetriever(new FileGetContents); + } + + return $this->uriRetriever; + } + + /** + * Resolve a schema based on pointer + * + * URIs can have a fragment at the end in the format of + * #/path/to/object and we are to look up the 'path' property of + * the first object then the 'to' and 'object' properties. + * + * @param object $jsonSchema JSON Schema contents + * @param string $uri JSON Schema URI + * @return object JSON Schema after walking down the fragment pieces + * + * @throws ResourceNotFoundException + */ + public function resolvePointer($jsonSchema, $uri) + { + $resolver = new UriResolver(); + $parsed = $resolver->parse($uri); + if (empty($parsed['fragment'])) { + return $jsonSchema; + } + + $path = explode('/', $parsed['fragment']); + while ($path) { + $pathElement = array_shift($path); + if (! empty($pathElement)) { + $pathElement = str_replace('~1', '/', $pathElement); + $pathElement = str_replace('~0', '~', $pathElement); + if (! empty($jsonSchema->$pathElement)) { + $jsonSchema = $jsonSchema->$pathElement; + } else { + throw new ResourceNotFoundException( + 'Fragment "' . $parsed['fragment'] . '" not found' + . ' in ' . $uri + ); + } + + if (! is_object($jsonSchema)) { + throw new ResourceNotFoundException( + 'Fragment part "' . $pathElement . '" is no object ' + . ' in ' . $uri + ); + } + } + } + + return $jsonSchema; + } + + /** + * Retrieve a URI + * + * @param string $uri JSON Schema URI + * @param string|null $baseUri + * @return object JSON Schema contents + */ + public function retrieve($uri, $baseUri = null) + { + $resolver = new UriResolver(); + $resolvedUri = $fetchUri = $resolver->resolve($uri, $baseUri); + + //fetch URL without #fragment + $arParts = $resolver->parse($resolvedUri); + if (isset($arParts['fragment'])) { + unset($arParts['fragment']); + $fetchUri = $resolver->generate($arParts); + } + + $jsonSchema = $this->loadSchema($fetchUri); + + // Use the JSON pointer if specified + $jsonSchema = $this->resolvePointer($jsonSchema, $resolvedUri); + + if ($jsonSchema instanceof \stdClass) { + $jsonSchema->id = $resolvedUri; + } + + return $jsonSchema; + } + + /** + * Fetch a schema from the given URI, json-decode it and return it. + * Caches schema objects. + * + * @param string $fetchUri Absolute URI + * + * @return object JSON schema object + */ + protected function loadSchema($fetchUri) + { + if (isset($this->schemaCache[$fetchUri])) { + return $this->schemaCache[$fetchUri]; + } + + $uriRetriever = $this->getUriRetriever(); + $contents = $this->uriRetriever->retrieve($fetchUri); + $this->confirmMediaType($uriRetriever, $fetchUri); + $jsonSchema = json_decode($contents); + + if (JSON_ERROR_NONE < $error = json_last_error()) { + throw new JsonDecodingException($error); + } + + $this->schemaCache[$fetchUri] = $jsonSchema; + + return $jsonSchema; + } + + /** + * Set the URI Retriever + * + * @param UriRetrieverInterface $uriRetriever + * @return $this for chaining + */ + public function setUriRetriever(UriRetrieverInterface $uriRetriever) + { + $this->uriRetriever = $uriRetriever; + + return $this; + } + + /** + * Parses a URI into five main components + * + * @param string $uri + * @return array + */ + public function parse($uri) + { + preg_match('|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|', $uri, $match); + + $components = array(); + if (5 < count($match)) { + $components = array( + 'scheme' => $match[2], + 'authority' => $match[4], + 'path' => $match[5] + ); + } + + if (7 < count($match)) { + $components['query'] = $match[7]; + } + + if (9 < count($match)) { + $components['fragment'] = $match[9]; + } + + return $components; + } + + /** + * Builds a URI based on n array with the main components + * + * @param array $components + * @return string + */ + public function generate(array $components) + { + $uri = $components['scheme'] . '://' + . $components['authority'] + . $components['path']; + + if (array_key_exists('query', $components)) { + $uri .= $components['query']; + } + + if (array_key_exists('fragment', $components)) { + $uri .= $components['fragment']; + } + + return $uri; + } + + /** + * Resolves a URI + * + * @param string $uri Absolute or relative + * @param string $baseUri Optional base URI + * @return string + */ + public function resolve($uri, $baseUri = null) + { + $components = $this->parse($uri); + $path = $components['path']; + + if ((array_key_exists('scheme', $components)) && ('http' === $components['scheme'])) { + return $uri; + } + + $baseComponents = $this->parse($baseUri); + $basePath = $baseComponents['path']; + + $baseComponents['path'] = UriResolver::combineRelativePathWithBasePath($path, $basePath); + + return $this->generate($baseComponents); + } + + /** + * @param string $uri + * @return boolean + */ + public function isValid($uri) + { + $components = $this->parse($uri); + + return !empty($components); + } +} diff --git a/vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php b/vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php new file mode 100644 index 0000000..14dbb60 --- /dev/null +++ b/vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php @@ -0,0 +1,40 @@ + + * @author Bruno Prieto Reis + * @see README.md + */ +class Validator extends Constraint +{ + const SCHEMA_MEDIA_TYPE = 'application/schema+json'; + + /** + * Validates the given data against the schema and returns an object containing the results + * Both the php object and the schema are supposed to be a result of a json_decode call. + * The validation works as defined by the schema proposal in http://json-schema.org + * + * {@inheritDoc} + */ + public function check($value, $schema = null, $path = null, $i = null) + { + $validator = $this->getFactory()->createInstanceFor('schema'); + $validator->check($value, $schema); + + $this->addErrors(array_unique($validator->getErrors(), SORT_REGULAR)); + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/.travis.yml b/vendor/magento-hackathon/magento-composer-installer/.travis.yml new file mode 100644 index 0000000..bdf266e --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/.travis.yml @@ -0,0 +1,66 @@ +language: php +php: + - 5.6 + - 5.5 + - 5.4 + #- hhvm + +env: + - TEST_SUITE=Unit + - TEST_SUITE=Fullstack + +matrix: + fast_finish: true + include: + - php: 5.6 + env: TEST_SUITE=Static + allow_failures: + - php: hhvm + - env: TEST_SUITE=Static + +sudo: false + +cache: + directories: + - $HOME/.composer/cache + +install: + - pecl install SPL_Types + - curl -sS https://getcomposer.org/installer | php + - chmod +x ./composer.phar + - ./composer.phar --version + - ./composer.phar install + +script: + - > + sh -c "if [ '$TEST_SUITE' = 'Unit' ] || [ '$TEST_SUITE' = 'Fullstack' ]; then + ./vendor/bin/phpunit --coverage-clover=coverage.clover --testsuite=$TEST_SUITE; + fi" + - > + sh -c "if [ '$TEST_SUITE' = 'Static' ]; then + ./vendor/bin/phpcs --standard=PSR2 ./src/; + ./vendor/bin/phpcs --standard=PSR2 ./tests/MagentoHackathon; + fi" +after_script: + - wget https://scrutinizer-ci.com/ocular.phar + - php ocular.phar code-coverage:upload --format=php-clover coverage.clover + +notifications: + email: + recipients: + - flyingmana@googlemail.com + on_success: never + on_failure: always + irc: + channels: + - "irc.freenode.org#magento-composer" + on_success: change # default: always + on_failure: always # default: always + webhooks: + urls: + - https://webhooks.gitter.im/e/c5ef1e9abfc452125de8 + - https://webhooks.gitter.im/e/c15428595390b938ee38 + - https://webhooks.gitter.im/e/5126f06d0f4f55230ee0 + on_success: change # options: [always|never|change] default: always + on_failure: always # options: [always|never|change] default: always + on_start: false # default: false diff --git a/vendor/magento-hackathon/magento-composer-installer/CHANGELOG.md b/vendor/magento-hackathon/magento-composer-installer/CHANGELOG.md new file mode 100644 index 0000000..35f0938 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/CHANGELOG.md @@ -0,0 +1,65 @@ +## Change Log +All notable changes to this project will be documented in this file. +This project adheres to [Semantic Versioning](http://semver.org/). + +## [Unreleased][unreleased] + +## [3.0.6] - 2015-10-21 +- Fix problems with magento connect packages referencing non existent files +- Fix PHP TestSetup for windows with PR [#69](https://github.com/Cotya/magento-composer-installer/pull/69) +- Added PR [#73](https://github.com/Cotya/magento-composer-installer/pull/73): add workaround for paths with containing whitespace + +## [3.0.5] - 2015-08-05 +- Fixed Issue [#20](https://github.com/Cotya/magento-composer-installer/issues/20): 'mklink""' is not recognized as an internal or external command, operable program or batch file. +- Fixed issue [#48](https://github.com/Cotya/magento-composer-installer/issues/48): Package XML mappings have './' prepended to them which breaks git-ignore functionality. Also explicitly adds a fw-slash to git-ignore paths, if one does not exist already. +- Added functionality to remove entries from the git-ignore file when a module is uninstalled +- Fixed an issue where empty directories were left behind after un-installing a module. If a structure like `/folder1/folder2/file1.txt` was created, and both folders were created by the module. Only `folder2` would be removed. It now traverses up-to the root-dir removing any empty directories. +- Added documentation for package.xml mapping (PR [#47](https://github.com/Cotya/magento-composer-installer/pull/47)) +- set 5.4 as minimum required Version + +## [3.0.4] - 2015-07-12 +- Added PR [#40](https://github.com/Cotya/magento-composer-installer/pull/40): extra config option to skip repository suggestions +- Reverted PR [#34](https://github.com/Cotya/magento-composer-installer/pull/34) in favor of a simpler solution without breaking BC +- Fixed issue [#7](https://github.com/Cotya/magento-composer-installer/issues/7) by filtering out Aliased Packages. This was with branch-aliasing where composer gave us two packages for the same module when it was setup to use branch aliasing +- Fixed issue [#33](https://github.com/Cotya/magento-composer-installer/issues/33) by using the source reference from the composer package as part of the internal version number for tracking packages +- Fixed issue [#39](https://github.com/Cotya/magento-composer-installer/issues/39) Symlinks were not removed correctly on module remove + +## [3.0.4-beta1] - 2015-06-10 +- Fixed error when redeploying with no modules, using PHP 5.3. [Issue #16](https://github.com/Cotya/magento-composer-installer/issues/16) [PR #29](https://github.com/Cotya/magento-composer-installer/pull/29) +- Fixed the Patcher throwing an exception if `app/Mage.php` was missing, + even when `with-bootstrap-patch` was set to `false`. [Issue #31](https://github.com/Cotya/magento-composer-installer/issues/31) [PR #32](https://github.com/Cotya/magento-composer-installer/pull/32) +- Changed Patcher throwing an exception to just output a *comment* Message +- Add sourceReference support for installed.json, fixes issues with updates for dev-master type repositories + where version is not a good indication of updates. +- Remove exception for `InstalledPackageFileSystemRepository::add()` method, + the function is used for both updates and new installs. +- Relaxed the Plugin API constraint to `~1.0` so that the next version + bump won't exclude this installer. +- Updated dependencies' versions. + +## [3.0.3] - 2015-06-02 +- Added a change log file + +## [3.0.3-rc.2] - 2015-05-20 +- The patching process was changed to _not_ create additional files (`bootstrap.php`, `Mage.class.php` etc.). + Now, only the native `app/Mage.php` is changed. +- [New documentation](https://github.com/Cotya/magento-composer-installer/blob/3.0/doc/Autoloading.md) about the autoloader patching was added. +- Composer dependencies were updated + +## [3.0.3-rc.1] - 2015-05-04 +- New boolean `extra` config: `with-bootstrap-patch`. It controls whether the `app/Mage.php` + file will be patched with the Composer autoloader ability. Defaults to `true`. +- Fixed unit tests calling Composer commands using a hardcoded `composer.phar`, breaking + for people which had their command renamed to `composer`. +- Added support for modman's style of declaring just the source file (see [example](https://github.com/colinmollenhour/modman/blob/d58b80f2f9e60d3287577480ad78066d44ed530c/modman#L109-L110)). + +## 3.0.2 - 2015-03-28 + +[unreleased]: https://github.com/Cotya/magento-composer-installer/compare/3.0.6...HEAD +[3.0.6]: https://github.com/Cotya/magento-composer-installer/compare/3.0.5...3.0.6 +[3.0.5]: https://github.com/Cotya/magento-composer-installer/compare/3.0.4...3.0.5 +[3.0.4]: https://github.com/Cotya/magento-composer-installer/compare/3.0.4-beta1...3.0.4 +[3.0.4-beta1]: https://github.com/Cotya/magento-composer-installer/compare/3.0.3...3.0.4-beta1 +[3.0.3]: https://github.com/Cotya/magento-composer-installer/compare/3.0.3-rc.2...3.0.3 +[3.0.3-rc.2]: https://github.com/Cotya/magento-composer-installer/compare/3.0.3-rc.1...3.0.3-rc.2 +[3.0.3-rc.1]: https://github.com/Cotya/magento-composer-installer/compare/3.0.2...3.0.3-rc.1 diff --git a/vendor/magento-hackathon/magento-composer-installer/CONTRIBUTING.md b/vendor/magento-hackathon/magento-composer-installer/CONTRIBUTING.md new file mode 100644 index 0000000..10453cd --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/CONTRIBUTING.md @@ -0,0 +1,44 @@ +## Which Branch to submit my PR to + +We use a little different branching strategy then other projects, so finding the right branch to contribute to is a bit confusing for some. +Instead of the usual dev and master branches, our focus is on version branches. The reason is, that people use different versions and usually +keep them to dont break their deployment workflow. We respect this, and so we still support older versions to some extent. + +Most PRs are to fix bugs, the best target to submit this fix is to the branch referencing the major.minor version you use. + +If you want to submit a new Feature, we prefer the default branch or the highest version branch for this. +But if you use an older version, you can target this. We will care about porting your patch upstream. + +This should not be necessary, but if you have a patch which is introducing a backwards compatible break, +then dont submit your Branch as PR, but open an issue with a link to the branch. +We may then say which branch would be best suited to target for a PR, +or even create a new major version Branch for this. +It would also be possible, that we merge it without the PR workflow. + +## Keeping the change log up to date +You **must** update the `CHANGELOG.md` file (in the `Unreleased` section) if your change is significant in this sense. +Keep in mind that people are reading the change log to check for new or removed features, backward incompatibilities ("BC breaks") +or security fixes. Do not change the change log for very minor changes. +If you're unsure, update the change log file. + +## Refactoring + +Refactoring as part of your PRs may slow down the merge process, as refactoring makes reviewing patches harder. + +Refactoring only PRs will usually be postponed to the the next Major release, as they make merging and porting +between branches a lot harder. +There may only be a few cases, where an exception will be made. + +## Submitting Bugs + +A lot of bugs are very hard to track down, as they often depend on specific combinations of packages and versions. +To make debugging issues easier, always also post the used Version of the Installer. +Even better, if you can show the used composer.json so we can reproduce the Issue based on it. + +# Afterword + +dont be afraind, we are open for every kind of contribution, regardless how little it is or how much work it will be for us. +A good prepared contributions will most times get faster into the project, but we will never decline a contribution because +it does not meet our standards, it will only take time till we are able to patch it enough. +Also you can get valuable feedback, how to improve contributions for the next time. :) + diff --git a/vendor/magento-hackathon/magento-composer-installer/README.md b/vendor/magento-hackathon/magento-composer-installer/README.md new file mode 100644 index 0000000..23a9cb7 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/README.md @@ -0,0 +1,211 @@ +[![Build Status](https://travis-ci.org/Cotya/magento-composer-installer.png)](https://travis-ci.org/Cotya/magento-composer-installer) +[![Windows Build status](https://ci.appveyor.com/api/projects/status/1bm54s9jv3603xl5?svg=true)](https://ci.appveyor.com/project/Flyingmana/magento-composer-installer-396) +[![Dependency Status](https://www.versioneye.com/php/magento-hackathon:magento-composer-installer/badge.svg)](https://www.versioneye.com/php/magento-hackathon:magento-composer-installer/) +[![Reference Status](https://www.versioneye.com/php/magento-hackathon:magento-composer-installer/reference_badge.svg)](https://www.versioneye.com/php/magento-hackathon:magento-composer-installer/references) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Cotya/magento-composer-installer/badges/quality-score.png)](https://scrutinizer-ci.com/g/Cotya/magento-composer-installer/) +[![Code Coverage](https://scrutinizer-ci.com/g/Cotya/magento-composer-installer/badges/coverage.png)](https://scrutinizer-ci.com/g/Cotya/magento-composer-installer/) +[![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=284872)](https://www.bountysource.com/trackers/284872-magento-hackathon-magento-composer-installer?utm_source=284872&utm_medium=shield&utm_campaign=TRACKER_BADGE) + +# Magento Composer Installer +[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/magento-hackathon/magento-composer-installer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + + +The purpose of this project is to +enable [composer](https://github.com/composer/composer) to install Magento modules, +and automatically integrate them into a Magento installation and add Composer's vendor autoloader +ability the Magento's so that Composer-compatible 3rd party tools can be used. + +If you want to install the Magento Core, you should try +[AydinHassan/magento-core-composer-installer](https://github.com/AydinHassan/magento-core-composer-installer) +as additional plugin. + +We strongly recommend you to also read the general composer documentations on [getcomposer.org](http://getcomposer.org) + +Also you should see: + + * [Using composer correctly (confoo) by Igor Wiedler](https://speakerdeck.com/igorw/using-composer-correctly-confoo) + +## Project Details + +This project only covers the custom installer for composer. If you have problems with outdated versions, +need to install magento connect modules or similar, you need to look for [packages.firegento.com](http://packages.firegento.com/) +which you probably should add as composer repository (globally) + +```composer config -g repositories.firegento composer http://packages.firegento.com``` + +### supported PHP Versions + +We dont officially support PHP versions which are [End of Life](https://secure.php.net/eol.php) means which dont get [security patches](https://secure.php.net/supported-versions.php) anymore. Even if the install requirement still allows them. +This will change, as soon someone is willing to pay for supporting them. + +### support contacts + +If you have problems please have patience, as normal support is done during free time. +If you are willing to pay to get your problem fixed, communicate this from the start to get faster responses. + +If you need consulting, support, training or help regarding Magento and Composer, +you have the chance to hire one of the following people/companies. + +* Daniel Fahlke aka Flyingmana (Maintainer): flyingmana@googlemail.com [@Flyingmana](https://twitter.com/Flyingmana) +* brandung - Magento Team: magento-team@brandung.de (http://brandung.de) + +other support contacts + +* irc: freenode the channels #magento-composer #magento-reddit and for german speaking people #magento-de +* twitter: [@firegento](https://twitter.com/firegento) + +### changelog + +See [CHANGELOG.md](CHANGELOG.md). + +======= +## Known issues + +### need to redeploy packages + +earlier we suggested the use of the command integrator package, that is not needed anymore. +```composer.phar run-script post-install-cmd -vvv -- --redeploy``` +This does remove all deployed files and redeploys every module + +### using non default autoloading + +we handle this topic in our [FAQ](doc/FAQ.md). + +### Timeouts and slow downloading. + +Mostly caused by outtages of Github, Repositories or the Internet. This is a common problem with having all +packages remote. + +For all of this issues you can make use of the commercial [Toran Proxy](https://toranproxy.com/). +It also allows hosting of private packages and speeds up the whole downloading process. + +Another alternative is to look into [Satis](https://github.com/composer/satis), bare git mirrors and repository aliasing. + +Another way to speedup downloads over ssh (also interesting for satis users) is to improve your ssh configs. +At least for newer versions of openSSH you can add the following to your ```.ssh/config``` to reuse previous connections. +``` +Host * + ControlPath ~/.ssh/controlmasters/%r@%h:%p + ControlMaster auto + ControlPersist 10m +``` + +also you need to create the ```controlmasters``` directory: +```sh +mkdir ~/.ssh/controlmasters +chmod go-xr ~/.ssh/controlmasters +``` + +further information can be found on [wikibooks](http://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing) + +## Usage + +### Update the Installer + +as this is a composer plugin, you should only use this both commands to update the installer + +``` +composer require --no-update magento-hackathon/magento-composer-installer=3.0.* +composer update --no-plugins --no-scripts magento-hackathon/magento-composer-installer +``` + +the second command needs maybe a `--with-dependencies` +Depending on your workflow with composer, you may want to use more explicite versions + +### Install a module in your project + +make sure to use [the public Magento module repository](http://packages.firegento.com) as composer repository: + +```composer config -g repositories.firegento composer http://packages.firegento.com``` + +configure your `magento root dir`, the directory where your magento resides: +```composer config extra.magento-root-dir composer "htdocs/"``` + +an example how your project ```composer.json``` could look like: + +```json +{ + "repositories": [ + { + "type": "composer", + "url": "http://packages.firegento.com" + } + ], + "extra":{ + "magento-root-dir": "htdocs/" + } +} +``` + +### Auto add files to .gitignore + +If you want to have the deployed files automatically added to your `.gitignore file`, then you can just set the `auto-append-gitignore` key to true: + +```json +{ + "extra":{ + "magento-root-dir": "htdocs/", + "auto-append-gitignore": true + } +} +``` + +The `.gitignore` file will be loaded from the current directory, and if it does not exist, it will be created. Every set of module files, will have a comment above them +describing the module name for clarity. + +Multiple deploys will not add additional lines to your `.gitignore`, they will only ever be added once. + + +### Adding Composer's autoloader to Magento + +Documentation available [here](doc/Autoloading.md). + +### Testing + +First clone the magento-composer-installer, then install the dev-stuff (installed by default): + +``` +./bin/composer.phar install +``` + +then run ```vendor/bin/phpunit``` in project-root directory. + +Note: Windows users please run ```phpunit``` with Administrator permissions. + + +## Further Information + +* [FAQ](doc/FAQ.md) +* [Make a Magento module installable with composer](doc/MakeAModuleInstallableWithComposer.md) +* [About File Mapping like for example modman](doc/Mapping.md) +* [About Deploying files into your Magento root and possible configs](doc/Deploy.md) + +### External Links + +* [Composer How to Screencast](http://www.youtube.com/watch?v=m_yprtQiFgk) +* [Introducing Composer Blog on Magebase.com](http://magebase.com/magento-tutorials/composer-with-magento/) +* [Magento, Composer and Symfonys Dependency Injection](http://www.piotrbelina.com/magento-composer-and-dependency-injection/) +* [Using Composer for Magento(at engineyard)](https://blog.engineyard.com/2014/composer-for-magento) + +### Core Contributors + +* Daniel Fahlke aka Flyingmana (Maintainer) +* Jörg Weller +* Karl Spies +* Tobias Vogt +* David Fuhr +* Amir Tchavoshinia +* Vinai Kopp (Maintainer) + +## Thank You + +There are a few companies we want to thank for supporting this project in one way or another. + +#####[digital.manufaktur GmbH](https://www.digitalmanufaktur.com/) + +Teached me (Flyingmana) most I know about Magento and +paid my participation for the hackathon were the installer got created. + +#####[melovely](http://www.melovely.de/) + +Support me (Flyingmana) as my current employer very much in my work on everything composer related. diff --git a/vendor/magento-hackathon/magento-composer-installer/appveyor.yml b/vendor/magento-hackathon/magento-composer-installer/appveyor.yml new file mode 100644 index 0000000..e7a0c9c --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/appveyor.yml @@ -0,0 +1,24 @@ + +platform: 'x86' +build: off +clone_folder: C:\projects\random\customer\magento +environment: + COMPOSER_NO_INTERACTION: 1 +cache: + - C:\Users\appveyor\AppData\Roaming\Composer +install: + - cinst OpenSSL.Light + - SET PATH=C:\Program Files\OpenSSL;%PATH% + - cinst php + - cd c:\tools\php + - copy php.ini-production php.ini + - echo date.timezone="UTC" >> php.ini + - echo extension_dir=ext >> php.ini + - echo extension=php_openssl.dll >> php.ini + - SET PATH=C:\tools\php;%PATH% + - cd C:\projects\random\customer\magento + - php -r "readfile('http://getcomposer.org/installer');" | php + - php composer.phar install --prefer-dist --no-interaction +test_script: + - cd C:\projects\random\customer\magento + - vendor\bin\phpunit.bat --testsuite Unit diff --git a/vendor/magento-hackathon/magento-composer-installer/bin/magento-composer-installer.php b/vendor/magento-hackathon/magento-composer-installer/bin/magento-composer-installer.php new file mode 100755 index 0000000..2aec0a1 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/bin/magento-composer-installer.php @@ -0,0 +1,26 @@ +#!/usr/bin/env php +add(new \MagentoHackathon\Composer\Magento\Command\DeployCommand()); +$application->add(new \MagentoHackathon\Composer\Magento\Command\DeployAllCommand()); +$application->run(); + + diff --git a/vendor/magento-hackathon/magento-composer-installer/composer.json b/vendor/magento-hackathon/magento-composer-installer/composer.json new file mode 100644 index 0000000..bf52d5b --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/composer.json @@ -0,0 +1,83 @@ +{ + "name":"magento-hackathon/magento-composer-installer", + "description":"Composer installer for Magento modules", + "keywords":[ "composer-installer", "magento"], + "minimum-stability":"stable", + "type":"composer-plugin", + "license":"OSL-3.0", + "homepage":"https://github.com/magento-hackathon/magento-composer-installer", + "repositories": [ + { + "type": "composer", + "url": "http://packages.firegento.com" + } + ], + "authors":[ + { + "name":"Daniel Fahlke aka Flyingmana", + "email":"flyingmana@googlemail.com" + }, + { + "name":"Jörg Weller", + "email":"weller@flagbit.de" + }, + { + "name":"Karl Spies", + "email":"karl.spies@gmx.net" + }, + { + "name":"Tobias Vogt", + "email":"tobi@webguys.de" + }, + { + "name":"David Fuhr", + "email":"fuhr@flagbit.de" + }, + { + "name":"Vinai Kopp", + "email":"vinai@netzarbeiter.com" + } + ], + "require":{ + "php": ">=5.4", + "eloquent/composer-config-reader": "2.*", + "symfony/console": "~2.5", + "composer-plugin-api": "~1.0" + }, + "require-dev":{ + "phpunit/phpunit":"~4.3", + "phpunit/phpunit-mock-objects": "~2.3", + "squizlabs/php_codesniffer": "~2.1", + "cotya/composer-test-framework": "dev-master", + "composer/composer":"1.0.*@dev", + "symfony/process":"~2.5", + "mikey179/vfsStream":"~1.4" + }, + "suggest":{ + "theseer/autoload": "~1.14", + "colinmollenhour/modman": "*" + }, + "autoload":{ + "psr-0":{ + "MagentoHackathon\\Composer":"src/" + } + }, + "autoload-dev":{ + "psr-0":{ + "MagentoHackathon\\Composer\\Magento":"tests/" + } + }, + "bin": [ + "bin/magento-composer-installer.php" + ], + "archive": { + "exclude": [ + "vendor", + "/tests/FullStackTest/" + ] + }, + "test_version":"999.0.0", + "extra":{ + "class":"MagentoHackathon\\Composer\\Magento\\Plugin" + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/res/target.xml b/vendor/magento-hackathon/magento-composer-installer/res/target.xml new file mode 100644 index 0000000..3e22070 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/res/target.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Helper.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Helper.php new file mode 100644 index 0000000..e1cc906 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Helper.php @@ -0,0 +1,151 @@ +getPathname().'/composer.json')) { + throw new \InvalidArgumentException('no composer.json found in project root'); + } + $this->projectRoot = $projectRoot; + + $reader = new \Eloquent\Composer\Configuration\ConfigurationReader; + $composerJsonObject = $reader->read($this->projectRoot.'/composer.json'); + $this->magentoProjectConfig = new ProjectConfig( + (array)$composerJsonObject->extra(), + (array)$composerJsonObject + ); + } + + public function getVendorDirectory() + { + /* + $reader = new \Eloquent\Composer\Configuration\ConfigurationReader; + $composerJsonObject = $reader->read($this->projectRoot.'/composer.json'); + return $composerJsonObject->vendorName(); + */ + return new \SplFileInfo($this->projectRoot.'/vendor'); + } + + public function getInstalledPackages() + { + + $installedJsonObject = json_decode(file_get_contents( + $this->getVendorDirectory()->getPathname().'/composer/installed.json' + ), true); + return $installedJsonObject; + } + + /** + * @return ProjectConfig + */ + public function getMagentoProjectConfig() + { + return $this->magentoProjectConfig; + } + + public function getPackageByName($name) + { + $result = null; + foreach ($this->getInstalledPackages() as $package) { + if ($package['name'] == $name) { + $result = $package; + break; + } + } + return $result; + } + + public static function initMagentoRootDir( + ProjectConfig $projectConfig, + \Composer\IO\IOInterface $io, + \Composer\Util\Filesystem $filesystem, + $vendorDir + ) { + if (false === $projectConfig->hasMagentoRootDir()) { + $projectConfig->setMagentoRootDir( + $io->ask( + sprintf('please define your magento root dir [%s]', ProjectConfig::DEFAULT_MAGENTO_ROOT_DIR), + ProjectConfig::DEFAULT_MAGENTO_ROOT_DIR + ) + ); + } + + $magentoRootDirPath = $projectConfig->getMagentoRootDir(); + $magentoRootDir = new \SplFileInfo($magentoRootDirPath); + + if (!is_dir($magentoRootDirPath) + && $io->askConfirmation( + 'magento root dir "' . $magentoRootDirPath . '" missing! create now? [Y,n] ' + ) + ) { + $filesystem->ensureDirectoryExists($magentoRootDir); + $io->write('magento root dir "' . $magentoRootDirPath . '" created'); + } + + if (!is_dir($magentoRootDirPath)) { + $dir = self::joinFilePath($vendorDir, $magentoRootDirPath); + } + } + + /** + * join 2 paths + * + * @param $path1 + * @param $path2 + * @param $delimiter + * @param bool $prependDelimiter + * @param string $additionalPrefix + * + * @internal param $url1 + * @internal param $url2 + * + * @return string + */ + public static function joinPath($path1, $path2, $delimiter, $prependDelimiter = false, $additionalPrefix = '') + { + $prefix = $additionalPrefix . $prependDelimiter ? $delimiter : ''; + + return $prefix . join( + $delimiter, + array( + explode($path1, $delimiter), + explode($path2, $delimiter) + ) + ); + } + + /** + * @param $path1 + * @param $path2 + * + * @return string + */ + public static function joinFilePath($path1, $path2) + { + return self::joinPath($path1, $path2, DIRECTORY_SEPARATOR, true); + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploy/Manager/Entry.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploy/Manager/Entry.php new file mode 100644 index 0000000..beb4ecc --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploy/Manager/Entry.php @@ -0,0 +1,52 @@ +packageName = $packageName; + } + + /** + * @return mixed + */ + public function getPackageName() + { + return $this->packageName; + } + + /** + * @param \MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract $deployStrategy + */ + public function setDeployStrategy($deployStrategy) + { + $this->deployStrategy = $deployStrategy; + } + + /** + * @return \MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract + */ + public function getDeployStrategy() + { + return $this->deployStrategy; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/DeployManager.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/DeployManager.php new file mode 100644 index 0000000..c2cab68 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/DeployManager.php @@ -0,0 +1,121 @@ +eventManager = $eventManager; + } + + /** + * @param Entry $package + */ + public function addPackage(Entry $package) + { + $this->packages[] = $package; + } + + /** + * @param $priorities + */ + public function setSortPriority($priorities) + { + $this->sortPriority = $priorities; + } + + /** + * uses the sortPriority Array to sort the packages. + * Highest priority first. + * Copy gets per default higher priority then others + */ + protected function sortPackages() + { + $sortPriority = $this->sortPriority; + $getPriorityValue = function (Entry $object) use ($sortPriority) { + $result = 100; + if (isset($sortPriority[$object->getPackageName()])) { + $result = $sortPriority[$object->getPackageName()]; + } elseif ($object->getDeployStrategy() instanceof Copy) { + $result = 101; + } + return $result; + }; + usort( + $this->packages, + function ($a, $b) use ($getPriorityValue) { + /** @var Entry $a */ + /** @var Entry $b */ + $aVal = $getPriorityValue($a); + $bVal = $getPriorityValue($b); + if ($aVal == $bVal) { + return 0; + } + return ($aVal > $bVal) ? -1 : 1; + } + ); + } + + /** + * Deploy all the queued packages + */ + public function doDeploy() + { + $this->sortPackages(); + /** @var Entry $package */ + foreach ($this->packages as $package) { + $this->eventManager->dispatch(new PackageDeployEvent('pre-package-deploy', $package)); + $package->getDeployStrategy()->deploy(); + $this->eventManager->dispatch(new PackageDeployEvent('post-package-deploy', $package)); + } + } + + /** + * @return Deploy\Manager\Entry[] + */ + public function getEntries() + { + return $this->packages; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/Copy.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/Copy.php new file mode 100644 index 0000000..135995f --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/Copy.php @@ -0,0 +1,122 @@ +getCurrentMapping(); + $mapSource = $this->removeTrailingSlash($mapSource); + $mapDest = $this->removeTrailingSlash($mapDest); + $cleanDest = $this->removeTrailingSlash($dest); + + $sourcePath = $this->getSourceDir() . '/' . $this->removeTrailingSlash($source); + $destPath = $this->getDestDir() . '/' . $this->removeTrailingSlash($dest); + + + // Create all directories up to one below the target if they don't exist + $destDir = dirname($destPath); + if (!file_exists($destDir)) { + mkdir($destDir, 0777, true); + } + + // Handle source to dir copy, + // e.g. Namespace_Module.csv => app/locale/de_DE/ + // Namespace/ModuleDir => Namespace/ + // Namespace/ModuleDir => Namespace/, but Namespace/ModuleDir may exist + // Namespace/ModuleDir => Namespace/ModuleDir, but ModuleDir may exist + + // first iteration through, we need to update the mappings to correctly handle mismatch globs + if ($mapSource == $this->removeTrailingSlash($source) && $mapDest == $this->removeTrailingSlash($dest)) { + if (basename($sourcePath) !== basename($destPath)) { + $this->setCurrentMapping(array($mapSource, $mapDest . '/' . basename($source))); + $cleanDest = $cleanDest . '/' . basename($source); + } + } + + if (file_exists($destPath) && is_dir($destPath)) { + $mapSource = rtrim($mapSource, '*'); + if (strcmp(substr($cleanDest, strlen($mapDest)+1), substr($source, strlen($mapSource)+1)) === 0) { + // copy each child of $sourcePath into $destPath + foreach (new \DirectoryIterator($sourcePath) as $item) { + $item = (string) $item; + if (!strcmp($item, '.') || !strcmp($item, '..')) { + continue; + } + $childSource = $this->removeTrailingSlash($source) . '/' . $item; + $this->create($childSource, substr($destPath, strlen($this->getDestDir())+1)); + } + return true; + } else { + $destPath = $this->removeTrailingSlash($destPath) . '/' . basename($source); + return $this->create($source, substr($destPath, strlen($this->getDestDir())+1)); + } + } + + // From now on $destPath can't be a directory, that case is already handled + + // If file exists and force is not specified, throw exception unless FORCE is set + if (file_exists($destPath)) { + if ($this->isForced()) { + unlink($destPath); + } else { + throw new \ErrorException("Target $dest already exists (set extra.magento-force to override)"); + } + } + + // File to file + if (!is_dir($sourcePath)) { + if (is_dir($destPath)) { + $destPath .= '/' . basename($sourcePath); + } + $destPath = str_replace('\\', '/', $destPath); + $this->addDeployedFile($destPath); + return copy($sourcePath, $destPath); + } + + // Copy dir to dir + // First create destination folder if it doesn't exist + if (file_exists($destPath)) { + $destPath .= '/' . basename($sourcePath); + } + mkdir($destPath, 0777, true); + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($sourcePath), + \RecursiveIteratorIterator::SELF_FIRST + ); + + foreach ($iterator as $item) { + $subDestPath = $destPath . '/' . $iterator->getSubPathName(); + if ($item->isDir()) { + if (! file_exists($subDestPath)) { + mkdir($subDestPath, 0777, true); + } + } else { + $subDestPath = str_replace('\\', '/', $subDestPath); + copy($item, $subDestPath); + $this->addDeployedFile($subDestPath); + } + if (!is_readable($subDestPath)) { + throw new \ErrorException("Could not create $subDestPath"); + } + } + + return true; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/DeploystrategyAbstract.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/DeploystrategyAbstract.php new file mode 100644 index 0000000..0228447 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/DeploystrategyAbstract.php @@ -0,0 +1,521 @@ +destDir = $destDir; + $this->sourceDir = $sourceDir; + $this->filesystem = new Filesystem; + } + + /** + * Executes the deployment strategy for each mapping + * + * @return \MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract + */ + public function deploy() + { + $this->beforeDeploy(); + foreach ($this->getMappings() as $data) { + list ($source, $dest) = $data; + $this->setCurrentMapping($data); + $this->create($source, $dest); + } + $this->afterDeploy(); + return $this; + } + + /** + * beforeDeploy + * + * @return void + */ + protected function beforeDeploy() + { + + } + + /** + * afterDeploy + * + * @return void + */ + protected function afterDeploy() + { + + } + + /** + * Removes the module's files in the given path from the target dir + * + * @return \MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract + */ + public function clean() + { + $this->beforeClean(); + foreach ($this->getMappings() as $data) { + list ($source, $dest) = $data; + $this->remove($source, $dest); + $this->rmEmptyDirsRecursive(dirname($dest), $this->getDestDir()); + } + $this->afterClean(); + return $this; + } + + /** + * beforeClean + * + * @return void + */ + protected function beforeClean() + { + + } + + /** + * afterClean + * + * @return void + */ + protected function afterClean() + { + + } + + /** + * Returns the destination dir of the magento module + * + * @return string + */ + protected function getDestDir() + { + return $this->destDir; + } + + /** + * Returns the current path of the extension + * + * @return mixed + */ + protected function getSourceDir() + { + return $this->sourceDir; + } + + /** + * If set overrides existing files + * + * @return bool + */ + public function isForced() + { + return $this->isForced; + } + + /** + * Setter for isForced property + * + * @param bool $forced + */ + public function setIsForced($forced = true) + { + $this->isForced = (bool)$forced; + } + + /** + * Returns the path mappings to map project's directories to magento's directory structure + * + * @return array + */ + public function getMappings() + { + return $this->mappings; + } + + /** + * Sets path mappings to map project's directories to magento's directory structure + * + * @param array $mappings + */ + public function setMappings(array $mappings) + { + $this->mappings = $mappings; + } + + /** + * Gets the current mapping used on the deployment iteration + * + * @return array + */ + public function getCurrentMapping() + { + return $this->currentMapping; + } + + /** + * Sets the current mapping used on the deployment iteration + * + * @param array $mapping + */ + public function setCurrentMapping($mapping) + { + $this->currentMapping = $mapping; + } + + + /** + * sets the current ignored mappings + * + * @param $ignoredMappings + */ + public function setIgnoredMappings($ignoredMappings) + { + $this->ignoredMappings = $ignoredMappings; + } + + /** + * gets the current ignored mappings + * + * @return array + */ + public function getIgnoredMappings() + { + return $this->ignoredMappings; + } + + + /** + * @param string $destination + * + * @return bool + */ + protected function isDestinationIgnored($destination) + { + $destination = '/' . $destination; + $destination = str_replace('/./', '/', $destination); + $destination = str_replace('//', '/', $destination); + foreach ($this->ignoredMappings as $ignored) { + if (0 === strpos($ignored, $destination)) { + return true; + } + } + return false; + } + + /** + * Add a key value pair to mapping + */ + public function addMapping($key, $value) + { + $this->mappings[] = array($key, $value); + } + + /** + * @param string $path + * @return string + */ + protected function removeLeadingSlash($path) + { + return ltrim($path, '\\/'); + } + + /** + * @param string $path + * @return string + */ + protected function removeTrailingSlash($path) + { + return rtrim($path, '\\/'); + } + + /** + * @param string $path + * @return string + */ + protected function removeLeadingAndTrailingSlash($path) + { + return trim($path, '\\/'); + } + + /** + * Normalize mapping parameters using a glob wildcard. + * + * Delegate the creation of the module's files in the given destination. + * + * @param string $source + * @param string $dest + * + * @throws \ErrorException + * @return bool + */ + public function create($source, $dest) + { + if ($this->isDestinationIgnored($dest)) { + return; + } + + $sourcePath = $this->getSourceDir() . '/' . $this->removeLeadingSlash($source); + $destPath = $this->getDestDir() . '/' . $this->removeLeadingSlash($dest); + + /* List of possible cases, keep around for now, might come in handy again + + Assume app/etc exists, app/etc/a does not exist unless specified differently + + dir app/etc/a/ --> link app/etc/a to dir + dir app/etc/a --> link app/etc/a to dir + dir app/etc/ --> link app/etc/dir to dir + dir app/etc --> link app/etc/dir to dir + + dir/* app/etc --> for each dir/$file create a target link in app/etc + dir/* app/etc/ --> for each dir/$file create a target link in app/etc + dir/* app/etc/a --> for each dir/$file create a target link in app/etc/a + dir/* app/etc/a/ --> for each dir/$file create a target link in app/etc/a + + file app/etc --> link app/etc/file to file + file app/etc/ --> link app/etc/file to file + file app/etc/a --> link app/etc/a to file + file app/etc/a --> if app/etc/a is a file throw exception unless force is set, in that case rm and see above + file app/etc/a/ --> link app/etc/a/file to file regardless if app/etc/a exists or not + + */ + + // Create target directory if it ends with a directory separator + if (!file_exists($destPath) && in_array(substr($destPath, -1), array('/', '\\')) && !is_dir($sourcePath)) { + mkdir($destPath, 0777, true); + $destPath = $this->removeTrailingSlash($destPath); + } + + // If source doesn't exist, check if it's a glob expression, otherwise we have nothing we can do + if (!file_exists($sourcePath)) { + // Handle globing + $matches = glob($sourcePath); + if (!empty($matches)) { + foreach ($matches as $match) { + $absolutePath = sprintf('%s/%s', $this->removeTrailingSlash($destPath), basename($match)); + $relativeDestination = substr($absolutePath, strlen($this->getDestDir())); //strip off dest dir + $relativeDestination = $this->removeLeadingSlash($relativeDestination); + $relativeSource = substr($match, strlen($this->getSourceDir()) + 1); + + $this->create($relativeSource, $relativeDestination); + } + return true; + } + + // Source file isn't a valid file or glob + throw new \ErrorException("Source $sourcePath does not exist"); + } + return $this->createDelegate($source, $dest); + } + + /** + * Remove (unlink) the destination file + * + * @param string $source + * @param string $dest + * + * @throws \ErrorException + */ + public function remove($source, $dest) + { + $sourcePath = $this->getSourceDir() . '/' . ltrim($this->removeTrailingSlash($source), '\\/'); + $destPath = $this->getDestDir() . '/' . ltrim($dest, '\\/'); + + // If source doesn't exist, check if it's a glob expression, otherwise we have nothing we can do + if (!file_exists($sourcePath)) { + // Handle globing + $matches = glob($sourcePath); + if (!empty($matches)) { + foreach ($matches as $match) { + $newDest = substr($destPath . '/' . basename($match), strlen($this->getDestDir())); + $newDest = ltrim($newDest, ' \\/'); + $this->remove(substr($match, strlen($this->getSourceDir()) + 1), $newDest); + } + } + return; + } + + // MP Avoid removing whole folders in case the modman file is not 100% well-written + // e.g. app/etc/modules/Testmodule.xml app/etc/modules/ installs correctly, + // but would otherwise delete the whole app/etc/modules folder! + if (basename($sourcePath) !== basename($destPath)) { + $destPath .= '/' . basename($source); + } + $this->filesystem->remove($destPath); + $this->addRemovedFile($destPath); + } + + /** + * Remove an empty directory branch up to $stopDir, or stop at the first non-empty parent. + * + * @param string $dir + * @param string $stopDir + */ + public function rmEmptyDirsRecursive($dir, $stopDir = null) + { + $absoluteDir = $this->getDestDir() . '/' . $dir; + if (is_dir($absoluteDir)) { + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($absoluteDir, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::CHILD_FIRST + ); + + if (iterator_count($iterator) > 0) { + // The directory contains something, do not remove + return; + } + + // RecursiveIteratorIterator have opened handle on $absoluteDir + // that cause Windows to block the directory and not remove it until + // the iterator will be destroyed. + unset($iterator); + + // The specified directory is empty + if (@rmdir($absoluteDir)) { + // If the parent directory doesn't match the $stopDir and it's empty, remove it, too + $parentDir = dirname($dir); + $absoluteParentDir = $this->getDestDir() . '/' . $parentDir; + if (!isset($stopDir) || (realpath($stopDir) !== realpath($absoluteParentDir))) { + // Remove the parent directory if it is empty + $this->rmEmptyDirsRecursive($parentDir); + } + } + } + } + + /** + * Create the module's files in the given destination. + * + * NOTE: source and dest have to be passed as relative directories, like they are listed in the mapping + * + * @param string $source + * @param string $dest + * + * @return bool + */ + abstract protected function createDelegate($source, $dest); + + /** + * Add a file/folder to the list of deployed files + * @param string $file + */ + public function addDeployedFile($file) + { + $destination = str_replace('\\', '/', $this->getDestDir()); + //strip of destination deploy + $quoted = preg_quote($destination, '/'); + $file = preg_replace(sprintf('/^%s/', $quoted), '', $file); + $this->deployedFiles[] = $file; + } + + /** + * Add a file/folder to the list of removed files + * @param string $file + */ + public function addRemovedFile($file) + { + //strip of destination deploy location + $file = preg_replace(sprintf('/^%s/', preg_quote($this->getDestDir(), '/')), '', $file); + $this->removedFiles[] = $file; + } + + /** + * Get all the deployed files + * + * @return array + */ + public function getDeployedFiles() + { + return array_unique($this->deployedFiles); + } + + /** + * Get all the removed files + * + * @return array + */ + public function getRemovedFiles() + { + return $this->removedFiles; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/Link.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/Link.php new file mode 100644 index 0000000..e32abe7 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/Link.php @@ -0,0 +1,101 @@ +getSourceDir() . '/' . $this->removeTrailingSlash($source); + $destPath = $this->getDestDir() . '/' . $this->removeTrailingSlash($dest); + + + // Create all directories up to one below the target if they don't exist + $destDir = dirname($destPath); + if (!file_exists($destDir)) { + mkdir($destDir, 0777, true); + } + + // Handle source to dir link, + // e.g. Namespace_Module.csv => app/locale/de_DE/ + if (file_exists($destPath) && is_dir($destPath)) { + if (basename($sourcePath) === basename($destPath)) { + // copy/link each child of $sourcePath into $destPath + foreach (new \DirectoryIterator($sourcePath) as $item) { + $item = (string) $item; + if (!strcmp($item, '.') || !strcmp($item, '..')) { + continue; + } + $childSource = $source . '/' . $item; + $this->create($childSource, substr($destPath, strlen($this->getDestDir())+1)); + } + return true; + } else { + $destPath .= '/' . basename($source); + return $this->create($source, substr($destPath, strlen($this->getDestDir())+1)); + } + } + + // From now on $destPath can't be a directory, that case is already handled + + // If file exists and force is not specified, throw exception unless FORCE is set + if (file_exists($destPath)) { + if ($this->isForced()) { + unlink($destPath); + } else { + throw new \ErrorException("Target $dest already exists (set extra.magento-force to override)"); + } + } + + // File to file + if (!is_dir($sourcePath)) { + if (is_dir($destPath)) { + $destPath .= '/' . basename($sourcePath); + } + return link($sourcePath, $destPath); + } + + // Copy dir to dir + // First create destination folder if it doesn't exist + if (file_exists($destPath)) { + $destPath .= '/' . basename($sourcePath); + } + mkdir($destPath, 0777, true); + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($sourcePath), + \RecursiveIteratorIterator::SELF_FIRST + ); + + foreach ($iterator as $item) { + $subDestPath = $destPath . '/' . $iterator->getSubPathName(); + if ($item->isDir()) { + if (! file_exists($subDestPath)) { + mkdir($subDestPath, 0777, true); + } + } else { + link($item, $subDestPath); + $this->addDeployedFile($subDestPath); + } + if (!is_readable($subDestPath)) { + throw new \ErrorException("Could not create $subDestPath"); + } + } + + return true; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/None.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/None.php new file mode 100644 index 0000000..80c96c2 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Deploystrategy/None.php @@ -0,0 +1,37 @@ +getSourceDir() . '/' . $this->removeTrailingSlash($source); + $destPath = $this->getDestDir() . '/' . $this->removeTrailingSlash($dest); + + if (!is_file($sourcePath) && !is_dir($sourcePath)) { + throw new \ErrorException("Could not find path '$sourcePath'"); + } + + /* + + Assume app/etc exists, app/etc/a does not exist unless specified differently + + OK dir app/etc/a --> link app/etc/a to dir + OK dir app/etc/ --> link app/etc/dir to dir + OK dir app/etc --> link app/etc/dir to dir + + OK dir/* app/etc --> for each dir/$file create a target link in app/etc + OK dir/* app/etc/ --> for each dir/$file create a target link in app/etc + OK dir/* app/etc/a --> for each dir/$file create a target link in app/etc/a + OK dir/* app/etc/a/ --> for each dir/$file create a target link in app/etc/a + + OK file app/etc --> link app/etc/file to file + OK file app/etc/ --> link app/etc/file to file + OK file app/etc/a --> link app/etc/a to file + OK file app/etc/a --> if app/etc/a is a file throw exception unless force is set, in that case rm and see above + OK file app/etc/a/ --> link app/etc/a/file to file regardless if app/etc/a existst or not + + */ + + // Symlink already exists + if (is_link($destPath)) { + if (realpath(readlink($destPath)) == realpath($sourcePath)) { + // .. and is equal to current source-link + return true; + } + unlink($destPath); + } + + // Create all directories up to one below the target if they don't exist + $destDir = dirname($destPath); + if (!file_exists($destDir)) { + mkdir($destDir, 0777, true); + } + + // Handle source to dir linking, + // e.g. Namespace_Module.csv => app/locale/de_DE/ + // Namespace/ModuleDir => Namespace/ + // Namespace/ModuleDir => Namespace/, but Namespace/ModuleDir may exist + // Namespace/ModuleDir => Namespace/ModuleDir, but ModuleDir may exist + + if (file_exists($destPath) && is_dir($destPath)) { + if (basename($sourcePath) === basename($destPath)) { + if ($this->isForced()) { + $this->filesystem->remove($destPath); + } else { + throw new \ErrorException("Target $dest already exists (set extra.magento-force to override)"); + } + } else { + $destPath .= '/' . basename($source); + } + return $this->create($source, substr($destPath, strlen($this->getDestDir()) + 1)); + } + + // From now on $destPath can't be a directory, that case is already handled + + // If file exists and force is not specified, throw exception unless FORCE is set + // existing symlinks are already handled + if (file_exists($destPath)) { + if ($this->isForced()) { + unlink($destPath); + } else { + throw new \ErrorException( + "Target $dest already exists and is not a symlink (set extra.magento-force to override)" + ); + } + } + + $relSourcePath = $this->getRelativePath($destPath, $sourcePath); + + // Create symlink + $destPath = str_replace('\\', '/', $destPath); + if (false === $this->symlink($relSourcePath, $destPath, $sourcePath)) { + $msg = "An error occured while creating symlink\n" . $relSourcePath . " -> " . $destPath; + if ('\\' === DIRECTORY_SEPARATOR) { + $msg .= "\nDo you have admin privileges?"; + } + throw new \ErrorException($msg); + } + + // Check we where able to create the symlink +// if (false === $destPath = @readlink($destPath)) { +// throw new \ErrorException("Symlink $destPath points to target $destPath"); +// } + $this->addDeployedFile($destPath); + + return true; + } + + /** + * @param $relSourcePath + * @param $destPath + * @param $absSourcePath + * + * @return bool + */ + protected function symlink($relSourcePath, $destPath, $absSourcePath) + { + $sourcePath = $relSourcePath; + // make symlinks always absolute on windows because of #142 + if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { + $sourcePath = str_replace('/', '\\', $absSourcePath); + } + return symlink($sourcePath, $destPath); + } + + /** + * Returns the relative path from $from to $to + * + * This is utility method for symlink creation. + * Orig Source: http://stackoverflow.com/a/2638272/485589 + */ + public function getRelativePath($from, $to) + { + $from = str_replace('\\', '/', $from); + $to = str_replace('\\', '/', $to); + + $from = str_replace(array('/./', '//'), '/', $from); + $to = str_replace(array('/./', '//'), '/', $to); + + $from = explode('/', $from); + $to = explode('/', $to); + + $relPath = $to; + + foreach ($from as $depth => $dir) { + // find first non-matching dir + if ($dir === $to[$depth]) { + // ignore this directory + array_shift($relPath); + } else { + // get number of remaining dirs to $from + $remaining = count($from) - $depth; + if ($remaining > 1) { + // add traversals up to first matching dir + $padLength = (count($relPath) + $remaining - 1) * -1; + $relPath = array_pad($relPath, $padLength, '..'); + break; + } else { + $relPath[0] = './' . $relPath[0]; + } + } + } + return implode('/', $relPath); + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/EventManager.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/EventManager.php new file mode 100644 index 0000000..28c8105 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/EventManager.php @@ -0,0 +1,52 @@ + + */ +class EventManager +{ + /** + * @var array + */ + private $listeners = array(); + + /** + * @param string $event + * @param callable $callback + */ + public function listen($event, $callback) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException(sprintf( + 'Second argument should be a callable. Got: "%s"', + is_object($callback) ? get_class($callback) : gettype($callback) + )); + } + + if (!isset($this->listeners[$event])) { + $this->listeners[$event] = array($callback); + } else { + $this->listeners[$event][] = $callback; + } + } + + /** + * @param Event $event + */ + public function dispatch(Event $event) + { + if (!isset($this->listeners[$event->getName()])) { + return; + } + + foreach ($this->listeners[$event->getName()] as $listener) { + call_user_func_array($listener, array($event)); + } + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackageDeployEvent.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackageDeployEvent.php new file mode 100644 index 0000000..21e1a2e --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackageDeployEvent.php @@ -0,0 +1,37 @@ + + */ +class PackageDeployEvent extends Event +{ + /** + * @var Entry + */ + protected $deployEntry; + + /** + * @param string $name + * @param Entry $deployEntry + */ + public function __construct($name, Entry $deployEntry) + { + parent::__construct($name); + $this->deployEntry = $deployEntry; + } + + /** + * @return Entry + */ + public function getDeployEntry() + { + return $this->deployEntry; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackagePreInstallEvent.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackagePreInstallEvent.php new file mode 100644 index 0000000..f1d74ab --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackagePreInstallEvent.php @@ -0,0 +1,38 @@ + + */ +class PackagePreInstallEvent extends Event +{ + /** + * @var PackageInterface + */ + protected $package; + + /** + * @param string $name + * @param PackageInterface $package + */ + public function __construct($name, PackageInterface $package) + { + parent::__construct($name); + $this->package = $package; + } + + /** + * @return PackageInterface + */ + public function getPackage() + { + return $this->package; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackageUnInstallEvent.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackageUnInstallEvent.php new file mode 100644 index 0000000..e9d1e92 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Event/PackageUnInstallEvent.php @@ -0,0 +1,46 @@ + + */ +class PackageUnInstallEvent extends Event +{ + /** + * @var InstalledPackage + */ + protected $package; + + /** + * @param string $name + * @param InstalledPackage $package + */ + public function __construct($name, InstalledPackage $package) + { + parent::__construct($name); + $this->package = $package; + } + + /** + * @return InstalledPackage + */ + public function getPackage() + { + return $this->package; + } + + /** + * @return array + */ + public function getInstalledFiles() + { + return $this->package->getInstalledFiles(); + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/DeploystrategyFactory.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/DeploystrategyFactory.php new file mode 100644 index 0000000..497243e --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/DeploystrategyFactory.php @@ -0,0 +1,66 @@ + '\MagentoHackathon\Composer\Magento\Deploystrategy\Copy', + 'symlink' => '\MagentoHackathon\Composer\Magento\Deploystrategy\Symlink', + 'link' => '\MagentoHackathon\Composer\Magento\Deploystrategy\Link', + 'none' => '\MagentoHackathon\Composer\Magento\Deploystrategy\None', + ); + + /** + * @param ProjectConfig $config + */ + public function __construct(ProjectConfig $config) + { + $this->config = $config; + } + + /** + * @param PackageInterface $package + * @param string $packageSourcePath + * @return DeploystrategyAbstract + */ + public function make(PackageInterface $package, $packageSourcePath) + { + $strategyName = $this->config->getDeployStrategy(); + if ($this->config->hasDeployStrategyOverwrite()) { + $moduleSpecificDeployStrategies = $this->config->getDeployStrategyOverwrite(); + + if (isset($moduleSpecificDeployStrategies[$package->getName()])) { + $strategyName = $moduleSpecificDeployStrategies[$package->getName()]; + } + } + + if (!isset(static::$strategies[$strategyName])) { + $className = static::$strategies['symlink']; + } else { + $className = static::$strategies[$strategyName]; + } + + $strategy = new $className($packageSourcePath, realpath($this->config->getMagentoRootDir())); + $strategy->setIgnoredMappings($this->config->getModuleSpecificDeployIgnores($package->getName())); + $strategy->setIsForced($this->config->getMagentoForceByPackageName($package->getName())); + return $strategy; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/EntryFactory.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/EntryFactory.php new file mode 100644 index 0000000..d6f3c14 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/EntryFactory.php @@ -0,0 +1,66 @@ + + */ +class EntryFactory +{ + + /** + * @var ProjectConfig + */ + protected $config; + + /** + * @var DeploystrategyFactory + */ + protected $deploystrategyFactory; + + /** + * @var ParserFactoryInterface + */ + protected $parserFactory; + + /** + * @param ProjectConfig $config + * @param DeploystrategyFactory $deploystrategyFactory + * @param ParserFactoryInterface $parserFactory + */ + public function __construct( + ProjectConfig $config, + DeploystrategyFactory $deploystrategyFactory, + ParserFactoryInterface $parserFactory + ) { + $this->config = $config; + $this->deploystrategyFactory = $deploystrategyFactory; + $this->parserFactory = $parserFactory; + } + + /** + * @param PackageInterface $package + * @param string $packageSourceDirectory + * @return Entry + */ + public function make(PackageInterface $package, $packageSourceDirectory) + { + $entry = new Entry(); + $entry->setPackageName($package->getName()); + + $strategy = $this->deploystrategyFactory->make($package, $packageSourceDirectory); + $mappingParser = $this->parserFactory->make($package, $packageSourceDirectory); + + $strategy->setMappings($mappingParser->getMappings()); + $entry->setDeployStrategy($strategy); + + return $entry; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/InstallStrategyFactory.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/InstallStrategyFactory.php new file mode 100644 index 0000000..c739319 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/InstallStrategyFactory.php @@ -0,0 +1,60 @@ +config = $config; + $this->parserFactory = $parserFactory; + } + + /** + * @param PackageInterface $package + * @param string $packageSourcePath + * @return DeploystrategyAbstract + */ + public function make(PackageInterface $package, $packageSourcePath) + { + $strategyName = $this->config->getModuleSpecificDeployStrategy($package->getName()); + + $ns = '\MagentoHackathon\Composer\Magento\Deploystrategy\\'; + $className = $ns . ucfirst($strategyName); + if (!class_exists($className)) { + $className = $ns . 'Symlink'; + } + + $strategy = new $className($packageSourcePath, realpath($this->config->getMagentoRootDir())); + $strategy->setIgnoredMappings($this->config->getModuleSpecificDeployIgnores($package->getName())); + $strategy->setIsForced($this->config->getMagentoForceByPackageName($package->getName())); + + $mappingParser = $this->parserFactory->make($package, $packageSourcePath); + $strategy->setMappings($mappingParser->getMappings()); + + return $strategy; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/ParserFactory.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/ParserFactory.php new file mode 100644 index 0000000..5540783 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/ParserFactory.php @@ -0,0 +1,69 @@ + + */ +class ParserFactory implements ParserFactoryInterface +{ + + /** + * @var ProjectConfig + */ + protected $config; + + /** + */ + public function __construct(ProjectConfig $config) + { + $this->config = $config; + } + + /** + * @param PackageInterface $package + * @param string $sourceDir + * @return Parser + * @throws \ErrorException + */ + public function make(PackageInterface $package, $sourceDir) + { + $moduleSpecificMap = $this->config->getMagentoMapOverwrite(); + if (isset($moduleSpecificMap[$package->getName()])) { + $map = $moduleSpecificMap[$package->getName()]; + return new MapParser($map); + } + + $extra = $package->getExtra(); + if (isset($extra['map'])) { + return new MapParser($extra['map']); + } + + if (isset($extra['package-xml'])) { + return new PackageXmlParser(sprintf('%s/%s', $sourceDir, $extra['package-xml'])); + } + + $modmanFile = sprintf('%s/modman', $sourceDir); + if (file_exists($modmanFile)) { + return new ModmanParser($modmanFile); + } + + throw new \ErrorException( + sprintf( + 'Unable to find deploy strategy for module: "%s" no known mapping'.PHP_EOL + .'sourceDir: "%s"', + $package->getName(), + $sourceDir + ) + ); + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/ParserFactoryInterface.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/ParserFactoryInterface.php new file mode 100644 index 0000000..8a06bc7 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/ParserFactoryInterface.php @@ -0,0 +1,22 @@ + + */ +interface ParserFactoryInterface +{ + + /** + * @param PackageInterface $package + * @param string $sourceDir + * @return Parser + */ + public function make(PackageInterface $package, $sourceDir); +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/PathTranslationParserFactory.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/PathTranslationParserFactory.php new file mode 100644 index 0000000..adcc14b --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Factory/PathTranslationParserFactory.php @@ -0,0 +1,53 @@ + + */ +class PathTranslationParserFactory implements ParserFactoryInterface +{ + /** + * @var ParserFactoryInterface + */ + protected $parserFactory; + + /** + * @var ProjectConfig + */ + protected $config; + + /** + * @param ParserFactoryInterface $parserFactory + */ + public function __construct(ParserFactoryInterface $parserFactory, ProjectConfig $config) + { + $this->parserFactory = $parserFactory; + $this->config = $config; + } + + /** + * @param PackageInterface $package + * @param string $sourceDir + * @return Parser + * @throws \ErrorException + */ + public function make(PackageInterface $package, $sourceDir) + { + $parser = $this->parserFactory->make($package, $sourceDir); + + if ($this->config->hasPathMappingTranslations()) { + $translations = $this->config->getPathMappingTranslations(); + return new PathTranslationParser($parser, $translations); + } + + return $parser; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/GitIgnore.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/GitIgnore.php new file mode 100644 index 0000000..4ac6f8d --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/GitIgnore.php @@ -0,0 +1,111 @@ + + */ +class GitIgnore +{ + /** + * @var array + */ + protected $lines = array(); + + /** + * @var string|null + */ + protected $gitIgnoreLocation; + + /** + * @var bool + */ + protected $hasChanges = false; + + /** + * @param string $fileLocation + */ + public function __construct($fileLocation) + { + $this->gitIgnoreLocation = $fileLocation; + if (file_exists($fileLocation)) { + $this->lines = array_flip(file($fileLocation, FILE_IGNORE_NEW_LINES)); + } + } + + /** + * @param string $file + */ + public function addEntry($file) + { + $file = $this->prependSlashIfNotExist($file); + if (!isset($this->lines[$file])) { + $this->lines[$file] = $file; + } + $this->hasChanges = true; + } + + /** + * @param array $files + */ + public function addMultipleEntries(array $files) + { + foreach ($files as $file) { + $this->addEntry($file); + } + } + + /** + * @param string $file + */ + public function removeEntry($file) + { + $file = $this->prependSlashIfNotExist($file); + if (isset($this->lines[$file])) { + unset($this->lines[$file]); + $this->hasChanges = true; + } + } + + /** + * @param array $files + */ + public function removeMultipleEntries(array $files) + { + foreach ($files as $file) { + $this->removeEntry($file); + } + } + + /** + * @return array + */ + public function getEntries() + { + return array_values(array_flip($this->lines)); + } + + /** + * Write the file + */ + public function write() + { + if ($this->hasChanges) { + file_put_contents($this->gitIgnoreLocation, implode("\n", array_flip($this->lines))); + } + } + + /** + * Prepend a forward slash to a path + * if it does not already start with one. + * + * @param string $file + * @return string + */ + private function prependSlashIfNotExist($file) + { + return sprintf('/%s', ltrim($file, '/')); + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/GitIgnoreListener.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/GitIgnoreListener.php new file mode 100644 index 0000000..45b8b9c --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/GitIgnoreListener.php @@ -0,0 +1,52 @@ + + */ +class GitIgnoreListener +{ + + /** + * @var GitIgnore + */ + protected $gitIgnore; + + /** + * @param GitIgnore $gitIgnore + */ + public function __construct(GitIgnore $gitIgnore) + { + $this->gitIgnore = $gitIgnore; + } + + /** + * Add any files which were installed to the .gitignore + * + * @param PackageDeployEvent $packageDeployEvent + */ + public function addNewInstalledFiles(PackageDeployEvent $packageDeployEvent) + { + $this->gitIgnore->addMultipleEntries( + $packageDeployEvent->getDeployEntry()->getDeployStrategy()->getDeployedFiles() + ); + $this->gitIgnore->write(); + } + + /** + * Remove any files which were removed to the .gitignore + * + * @param PackageUnInstallEvent $e + */ + public function removeUnInstalledFiles(PackageUnInstallEvent $e) + { + $this->gitIgnore->removeMultipleEntries($e->getInstalledFiles()); + $this->gitIgnore->write(); + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/InstalledPackage.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/InstalledPackage.php new file mode 100644 index 0000000..0451ed9 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/InstalledPackage.php @@ -0,0 +1,70 @@ + + */ +class InstalledPackage +{ + /** + * @var string + */ + protected $name; + + /** + * @var string + */ + protected $version; + + /** + * @var array + */ + protected $installedFiles; + + /** + * @param string $name + * @param string $version + * @param array $files + */ + public function __construct($name, $version, array $files) + { + $this->name = $name; + $this->installedFiles = $files; + $this->version = $version; + } + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * @return string + */ + public function getUniqueName() + { + return sprintf('%s-%s', $this->getName(), $this->getVersion()); + } + + /** + * @return array + */ + public function getInstalledFiles() + { + return $this->installedFiles; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/InstalledPackageDumper.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/InstalledPackageDumper.php new file mode 100644 index 0000000..cd96a5b --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/InstalledPackageDumper.php @@ -0,0 +1,32 @@ + $installedPackage->getName(), + 'version' => $installedPackage->getVersion(), + 'installedFiles' => $installedPackage->getInstalledFiles(), + ); + } + + /** + * @param array $data + * @return InstalledPackage + */ + public function restore(array $data) + { + return new InstalledPackage($data['packageName'], $data['version'], $data['installedFiles']); + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/ModuleManager.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/ModuleManager.php new file mode 100644 index 0000000..0879912 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/ModuleManager.php @@ -0,0 +1,229 @@ + + */ +class ModuleManager +{ + /** + * @var InstalledPackageRepositoryInterface + */ + protected $installedPackageRepository; + + /** + * @var EventManager + */ + protected $eventManager; + + /** + * @var ProjectConfig + */ + protected $config; + + /** + * @var UnInstallStrategyInterface + */ + protected $unInstallStrategy; + + /** + * @var InstallStrategyFactory + */ + protected $installStrategyFactory; + + /** + * @param InstalledPackageRepositoryInterface $installedRepository + * @param EventManager $eventManager + * @param ProjectConfig $config + * @param UnInstallStrategyInterface $unInstallStrategy + * @param InstallStrategyFactory $installStrategyFactory + */ + public function __construct( + InstalledPackageRepositoryInterface $installedRepository, + EventManager $eventManager, + ProjectConfig $config, + UnInstallStrategyInterface $unInstallStrategy, + InstallStrategyFactory $installStrategyFactory + ) { + $this->installedPackageRepository = $installedRepository; + $this->eventManager = $eventManager; + $this->config = $config; + $this->unInstallStrategy = $unInstallStrategy; + $this->installStrategyFactory = $installStrategyFactory; + } + + /** + * @param array $currentComposerInstalledPackages + * @return array + */ + public function updateInstalledPackages(array $currentComposerInstalledPackages) + { + $packagesToRemove = $this->getRemoves( + $currentComposerInstalledPackages, + $this->installedPackageRepository->findAll() + ); + + $packagesToInstall = $this->getInstalls($currentComposerInstalledPackages); + + $this->doRemoves($packagesToRemove); + $this->doInstalls($packagesToInstall); + + return array( + $packagesToRemove, + $packagesToInstall + ); + } + + /** + * @param PackageInterface[] $packagesToInstall + */ + public function doInstalls(array $packagesToInstall) + { + foreach ($packagesToInstall as $install) { + $installStrategy = $this->installStrategyFactory->make( + $install, + $this->getPackageSourceDirectory($install) + ); + + $deployEntry = new Entry(); + $deployEntry->setPackageName($install->getPrettyName()); + $deployEntry->setDeployStrategy($installStrategy); + $this->eventManager->dispatch( + new PackageDeployEvent('pre-package-deploy', $deployEntry) + ); + $files = $installStrategy->deploy()->getDeployedFiles(); + $this->eventManager->dispatch( + new PackageDeployEvent('post-package-deploy', $deployEntry) + ); + $this->installedPackageRepository->add(new InstalledPackage( + $install->getName(), + $this->createVersion($install), + $files + )); + } + } + + /** + * @param InstalledPackage[] $packagesToRemove + */ + public function doRemoves(array $packagesToRemove) + { + foreach ($packagesToRemove as $remove) { + $this->eventManager->dispatch(new PackageUnInstallEvent('pre-package-uninstall', $remove)); + $this->unInstallStrategy->unInstall($remove->getInstalledFiles()); + $this->eventManager->dispatch(new PackageUnInstallEvent('post-package-uninstall', $remove)); + $this->installedPackageRepository->remove($remove); + } + } + + /** + * @param PackageInterface[] $currentComposerInstalledPackages + * @param InstalledPackage[] $magentoInstalledPackages + * @return InstalledPackage[] + */ + public function getRemoves(array $currentComposerInstalledPackages, array $magentoInstalledPackages) + { + //make the package names as the array keys + if (count($currentComposerInstalledPackages)) { + $currentComposerInstalledPackages = array_combine( + array_map( + function (PackageInterface $package) { + return $package->getName(); + }, + $currentComposerInstalledPackages + ), + $currentComposerInstalledPackages + ); + } + return array_filter( + $magentoInstalledPackages, + function (InstalledPackage $package) use ($currentComposerInstalledPackages) { + if (!isset($currentComposerInstalledPackages[$package->getName()])) { + return true; + } + + $composerPackage = $currentComposerInstalledPackages[$package->getName()]; + return $package->getVersion() !== $this->createVersion($composerPackage); + } + ); + } + + /** + * @param PackageInterface[] $currentComposerInstalledPackages + * @return PackageInterface[] + */ + public function getInstalls(array $currentComposerInstalledPackages) + { + $repo = $this->installedPackageRepository; + $packages = array_filter($currentComposerInstalledPackages, function (PackageInterface $package) use ($repo) { + return !$repo->has($package->getName(), $this->createVersion($package)); + }); + + $config = $this->config; + usort($packages, function (PackageInterface $aObject, PackageInterface $bObject) use ($config) { + $a = $config->getModuleSpecificSortValue($aObject->getName()); + $b = $config->getModuleSpecificSortValue($bObject->getName()); + if ($a == $b) { + return strcmp($aObject->getName(), $bObject->getName()); + /** + * still changes sort order and breaks a test, so for now strcmp as workaround + * to keep the test working. + */ + // return 0; + } + return ($a < $b) ? -1 : 1; + }); + + return $packages; + } + + /** + * @param PackageInterface $package + * @return string + */ + private function getPackageSourceDirectory(PackageInterface $package) + { + $path = sprintf("%s/%s", $this->config->getVendorDir(), $package->getPrettyName()); + $targetDir = $package->getTargetDir(); + + if ($targetDir) { + $path = sprintf("%s/%s", $path, $targetDir); + } + + $path = realpath($path); + return $path; + } + + /** + * Create a version string which is unique. dev-master + * packages report a version of 9999999-dev. We need a unique version + * so we can detect changes. here we use the source reference which + * in the case of git is the commit hash + * + * @param PackageInterface $package + * + * @return string + */ + private function createVersion(PackageInterface $package) + { + $version = $package->getVersion(); + + if (null !== $package->getSourceReference()) { + $version = sprintf('%s-%s', $version, $package->getSourceReference()); + } + + return $version; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/MapParser.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/MapParser.php new file mode 100644 index 0000000..cfc1db5 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/MapParser.php @@ -0,0 +1,35 @@ +mappings = $mappings; + } + + /** + * @return array + */ + public function getMappings() + { + return $this->mappings; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/ModmanParser.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/ModmanParser.php new file mode 100644 index 0000000..87c8611 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/ModmanParser.php @@ -0,0 +1,72 @@ +file = new \SplFileObject($modManFile); + } + + /** + * @return array + * @throws \ErrorException + */ + public function getMappings() + { + if (!$this->file->isReadable()) { + throw new \ErrorException(sprintf('modman file "%s" not readable', $this->file->getPathname())); + } + + $map = $this->parseMappings(); + return $map; + } + + /** + * @throws \ErrorException + * @return array + */ + protected function parseMappings() + { + $map = array(); + foreach ($this->file as $line => $row) { + $row = trim($row); + if ('' === $row || in_array($row[0], array('#', '@'))) { + continue; + } + $parts = preg_split('/\s+/', $row, -1, PREG_SPLIT_NO_EMPTY); + if (count($parts) === 1) { + $part = reset($parts); + $map[] = array($part, $part); + } elseif (is_int(count($parts) / 2)) { + $partCountSplit = count($parts) / 2; + $map[] = array( + implode(' ', array_slice($parts, 0, $partCountSplit)), + implode(' ', array_slice($parts, $partCountSplit)), + ); + } else { + throw new \ErrorException( + sprintf('Invalid row on line %d has %d parts, expected 2', $line, count($parts)) + ); + } + } + return $map; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/PackageXmlParser.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/PackageXmlParser.php new file mode 100644 index 0000000..78193a3 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/PackageXmlParser.php @@ -0,0 +1,153 @@ +file = new \SplFileObject($packageXmlFile); + } + + /** + * @return array + * @throws \ErrorException + */ + public function getMappings() + { + if (!$this->file->isReadable()) { + throw new \ErrorException(sprintf('Package file "%s" not readable', $this->file->getPathname())); + } + + $map = $this->parseMappings(); + return $map; + } + + /** + * @throws \RuntimeException + * @return array + */ + protected function parseMappings() + { + $map = array(); + + /** @var $package \SimpleXMLElement */ + $package = simplexml_load_file($this->file->getPathname()); + if (isset($package)) { + foreach ($package->xpath('//contents/target') as $target) { + try { + $basePath = $this->getTargetPath($target); + + foreach ($target->children() as $child) { + foreach ($this->getElementPaths($child) as $elementPath) { + if ( pathinfo($elementPath, PATHINFO_EXTENSION) == 'txt') { + continue; + } + $relativePath = $basePath . '/' . $elementPath; + //remove the any trailing './' or '.' from the targets base-path. + if (strpos($relativePath, './') === 0) { + $relativePath = substr($relativePath, 2); + } + $map[] = array($relativePath, $relativePath); + } + } + + } catch (\RuntimeException $e) { + // Skip invalid targets + continue; + } + } + } + return $map; + } + + /** + * @param \SimpleXMLElement $target + * @return string + * @throws \RuntimeException + */ + protected function getTargetPath(\SimpleXMLElement $target) + { + $name = (string) $target->attributes()->name; + $targets = $this->getTargetsDefinitions(); + if (! isset($targets[$name])) { + throw new \RuntimeException('Invalid target type ' . $name); + } + return $targets[$name]; + } + + /** + * @return array + */ + protected function getTargetsDefinitions() + { + if (empty($this->targets)) { + /** @var $targets \SimpleXMLElement */ + $targets = simplexml_load_file(__DIR__ . '/../../../../../res/target.xml'); + foreach ($targets as $target) { + /** @var $target \SimpleXMLElement */ + $attributes = $target->attributes(); + $this->targets["{$attributes->name}"] = "{$attributes->uri}"; + } + } + return $this->targets; + } + + /** + * @param \SimpleXMLElement $element + * @return array + * @throws \RuntimeException + */ + protected function getElementPaths(\SimpleXMLElement $element) + { + $type = $element->getName(); + $name = $element->attributes()->name; + $elementPaths = array(); + + switch ($type) { + case 'dir': + if ($element->children()) { + foreach ($element->children() as $child) { + foreach ($this->getElementPaths($child) as $elementPath) { + $elementPaths[] = $name == '.' ? $elementPath : $name . '/' . $elementPath; + } + } + } else { + $elementPaths[] = $name; + } + break; + + case 'file': + $elementPaths[] = $name; + break; + + default: + throw new \RuntimeException('Unknown path type: ' . $type); + } + + return $elementPaths; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/Parser.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/Parser.php new file mode 100644 index 0000000..c7b76fb --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Parser/Parser.php @@ -0,0 +1,25 @@ +pathPrefixTranslations = $this->createPrefixVariants($translations); + $this->parser = $parser; + } + + /** + * Given an array of path mapping translations, combine them with a list + * of starting variations. This is so that a translation for 'js' will + * also match path mappings beginning with './js'. + * + * @param $translations + * @return array + */ + protected function createPrefixVariants($translations) + { + $newTranslations = array(); + foreach ($translations as $key => $value) { + foreach ($this->pathPrefixVariants as $variant) { + $newTranslations[$variant . $key] = $value; + } + } + + return $newTranslations; + } + + /** + * loop the mappings for the wrapped parser, check if any of the targets are for + * directories that have been moved under the public directory. If so, + * update the target paths to include 'public/'. As no standard Magento + * path mappings should ever start with 'public/', and path mappings + * that already include the public directory should always have + * js/skin/media paths starting with 'public/', it should be safe to call + * multiple times on either. + * + * @return array Updated path mappings + */ + public function getMappings() + { + $translatedMappings = array(); + foreach ($this->parser->getMappings() as $index => $mapping) { + $translatedMappings[$index] = $mapping; + foreach ($this->pathPrefixTranslations as $prefix => $translate) { + if (strpos($mapping[1], $prefix) === 0) { + // replace the old prefix with the translated version + $translatedMappings[$index][1] = $translate . substr($mapping[1], strlen($prefix)); + // should never need to translate a prefix more than once + // per path mapping + break; + } + } + } + + return $translatedMappings; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Patcher/Bootstrap.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Patcher/Bootstrap.php new file mode 100644 index 0000000..8626b40 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Patcher/Bootstrap.php @@ -0,0 +1,210 @@ +setMageClassFilePath($mageClassFilePath); + $this->config = $config; + } + + /** + * @param ProjectConfig $config + * @return $this + */ + public static function fromConfig(ProjectConfig $config) + { + return new self($config->getMagentoRootDir() . '/app/Mage.php', $config); + } + + /** + * @return ProjectConfig + */ + private function getConfig() + { + return $this->config; + } + + /** + * @return string + * @throws \DomainException + */ + private function getMageClassFilePath() + { + $mageFileCheck = true; + + if (!is_file($this->mageClassFilePath)) { + $message = "{$this->mageClassFilePath} is not a file."; + $mageFileCheck = false; + } elseif (!is_readable($this->mageClassFilePath)) { + $message = "{$this->mageClassFilePath} is not readable."; + $mageFileCheck = false; + } elseif (!is_writable($this->mageClassFilePath)) { + $message = "{$this->mageClassFilePath} is not writable."; + $mageFileCheck = false; + } + + if (!$mageFileCheck) { + throw new \DomainException($message); + } + + return $this->mageClassFilePath; + } + + /** + * Path to the Mage.php file which the patch will be applied on. + * + * @param string $mageClassFilePath + */ + private function setMageClassFilePath($mageClassFilePath) + { + $this->mageClassFilePath = $mageClassFilePath; + } + + /** + * @return bool + */ + private function isPatchAlreadyApplied() + { + return strpos(file_get_contents($this->getMageClassFilePath()), self::PATCH_MARK) !== false; + } + + /** + * @return bool + */ + public function canApplyPatch() + { + // check the config first + if (!$this->getConfig()->mustApplyBootstrapPatch()) { + $message = "Magento autoloader patching skipped because of configuration flag"; + $result = false; + } elseif ($this->isPatchAlreadyApplied()) { + $message = "{$this->getMageClassFilePath()} was already patched"; + $result = false; + } else { + $result = true; + $message = "Autoloader patch to {$this->getMageClassFilePath()} was applied successfully"; + } + + $this->getIo()->write($message); + + return $result; + } + + /** + * @return bool + */ + public function patch() + { + return $this->canApplyPatch() ? $this->writeComposerAutoloaderPatch() : false; + } + + /** + * @return string + */ + protected function getAppPath() + { + return $this->getConfig()->getMagentoRootDir() . '/app'; + } + + /** + * @return bool + */ + protected function writeComposerAutoloaderPatch() + { + $mageFileContent = file($this->getMageClassFilePath()); + + $mageFileBootstrapPart = ''; + $mageFileClassDeclarationPart = ''; + $isBootstrapPart = true; + + foreach ($mageFileContent as $row) { + if ($isBootstrapPart) { + $mageFileBootstrapPart .= $row; + } else { + $mageFileClassDeclarationPart .= $row; + } + if (strpos($row, 'Varien_Autoload') === 0) { + $isBootstrapPart = false; + } + } + + $mageFileReplacement = $mageFileBootstrapPart . PHP_EOL + . $this->getAutoloaderPatchString() . PHP_EOL + . $mageFileClassDeclarationPart; + + return file_put_contents($this->getMageClassFilePath(), $mageFileReplacement) !== false; + } + + /** + * @param IOInterface $io + */ + public function setIo(IOInterface $io) + { + $this->io = $io; + } + + /** + * @return IOInterface + */ + public function getIo() + { + if (!$this->io) { + $this->io = new NullIO; + } + return $this->io; + } + + /** + * @return string + */ + private function getAutoloaderPatchString() + { + $patchMark = self::PATCH_MARK; + + // get the vendor folder name from Config, in case it's changed + $vendorFolderName = basename($this->getConfig()->getVendorDir()); + + $autoloadPhp = $vendorFolderName . '/autoload.php'; + + return <<deployManager = new DeployManager($eventManager); + $this->deployManager->setSortPriority($this->getSortPriority($composer)); + + $this->applyEvents($eventManager); + } + + protected function applyEvents(EventManager $eventManager) + { + + if ($this->config->hasAutoAppendGitignore()) { + $gitIgnoreLocation = sprintf('%s/.gitignore', $this->config->getMagentoRootDir()); + $gitIgnore = new GitIgnoreListener(new GitIgnore($gitIgnoreLocation)); + + $eventManager->listen('post-package-deploy', [$gitIgnore, 'addNewInstalledFiles']); + $eventManager->listen('post-package-uninstall', [$gitIgnore, 'removeUnInstalledFiles']); + } + + $io = $this->io; + if ($this->io->isDebug()) { + $eventManager->listen('pre-package-deploy', function (PackageDeployEvent $event) use ($io) { + $io->write('Start magento deploy for ' . $event->getDeployEntry()->getPackageName()); + }); + } + } + + /** + * get Sort Priority from extra Config + * + * @param \Composer\Composer $composer + * + * @return array + */ + private function getSortPriority(Composer $composer) + { + $extra = $composer->getPackage()->getExtra(); + + return isset($extra[ProjectConfig::SORT_PRIORITY_KEY]) + ? $extra[ProjectConfig::SORT_PRIORITY_KEY] + : array(); + } + + /** + * Apply plugin modifications to composer + * + * @param Composer $composer + * @param IOInterface $io + */ + public function activate(Composer $composer, IOInterface $io) + { + $this->io = $io; + $this->composer = $composer; + + $this->filesystem = new Filesystem(); + $this->config = new ProjectConfig($composer->getPackage()->getExtra(), $composer->getConfig()->all()); + + if (!$this->config->skipSuggestComposerRepositories()) { + $this->suggestComposerRepositories(); + } + + $this->entryFactory = new EntryFactory( + $this->config, + new DeploystrategyFactory($this->config), + new PathTranslationParserFactory(new ParserFactory($this->config), $this->config) + ); + + $this->initDeployManager($composer, $io, $this->getEventManager()); + $this->writeDebug('activate magento plugin'); + } + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + */ + public static function getSubscribedEvents() + { + return array( + ScriptEvents::POST_INSTALL_CMD => array( + array('onNewCodeEvent', 0), + ), + ScriptEvents::POST_UPDATE_CMD => array( + array('onNewCodeEvent', 0), + ), + ); + } + + /** + * event listener is named this way, as it listens for events leading to changed code files + * + * @param Event $event + */ + public function onNewCodeEvent(Event $event) + { + + $packageTypeToMatch = static::PACKAGE_TYPE; + $magentoModules = array_filter( + $this->composer->getRepositoryManager()->getLocalRepository()->getPackages(), + function (PackageInterface $package) use ($packageTypeToMatch) { + if ($package instanceof AliasPackage) { + return false; + } + return $package->getType() === $packageTypeToMatch; + } + ); + + $vendorDir = rtrim($this->composer->getConfig()->get(self::VENDOR_DIR_KEY), '/'); + + Helper::initMagentoRootDir( + $this->config, + $this->io, + $this->filesystem, + $vendorDir + ); + + $this->applyEvents($this->getEventManager()); + + if (in_array('--redeploy', $event->getArguments())) { + $this->writeDebug('remove all deployed modules'); + $this->getModuleManager()->updateInstalledPackages(array()); + } + $this->writeDebug('start magento module deploy via moduleManager'); + $this->getModuleManager()->updateInstalledPackages($magentoModules); + $this->deployLibraries(); + + $patcher = Bootstrap::fromConfig($this->config); + $patcher->setIo($this->io); + try { + $patcher->patch(); + } catch (\DomainException $e) { + $this->io->write(''.$e->getMessage().''); + } + } + + /** + * test configured repositories and give message about adding recommended ones + */ + protected function suggestComposerRepositories() + { + $foundFiregento = false; + $foundMagento = false; + + foreach ($this->config->getComposerRepositories() as $repository) { + if (!isset($repository["type"]) || $repository["type"] !== "composer") { + continue; + } + if (strpos($repository["url"], "packages.firegento.com") !== false) { + $foundFiregento = true; + } + if (strpos($repository["url"], "packages.magento.com") !== false) { + $foundMagento = true; + } + }; + $message1 = "you may want to add the %s repository to composer."; + $message2 = "add it with: composer.phar config -g repositories.%s composer %s"; + if (!$foundFiregento) { + $this->io->write(sprintf($message1, 'packages.firegento.com')); + $this->io->write(sprintf($message2, 'firegento', 'http://packages.firegento.com')); + } + if (!$foundMagento) { + $this->io->write(sprintf($message1, 'packages.magento.com')); + $this->io->write(sprintf($message2, 'magento', 'https?://packages.magento.com')); + } + + } + + /** + * deploy Libraries + */ + protected function deployLibraries() + { + $packages = $this->composer->getRepositoryManager()->getLocalRepository()->getPackages(); + $autoloadDirectories = array(); + + $libraryPath = $this->config->getLibraryPath(); + + if ($libraryPath === null) { + $this->writeDebug('jump over deployLibraries as no Magento libraryPath is set'); + + return; + } + + $vendorDir = rtrim($this->composer->getConfig()->get(self::VENDOR_DIR_KEY), '/'); + + $this->filesystem->removeDirectory($libraryPath); + $this->filesystem->ensureDirectoryExists($libraryPath); + + foreach ($packages as $package) { + /** @var PackageInterface $package */ + $packageConfig = $this->config->getLibraryConfigByPackagename($package->getName()); + if ($packageConfig === null) { + continue; + } + if (!isset($packageConfig['autoload'])) { + $packageConfig['autoload'] = array('/'); + } + foreach ($packageConfig['autoload'] as $path) { + $autoloadDirectories[] = $libraryPath . '/' . $package->getName() . "/" . $path; + } + $this->writeDebug(sprintf('Magento deployLibraries executed for %s', $package->getName())); + + $libraryTargetPath = $libraryPath . '/' . $package->getName(); + $this->filesystem->removeDirectory($libraryTargetPath); + $this->filesystem->ensureDirectoryExists($libraryTargetPath); + $this->copyRecursive($vendorDir . '/' . $package->getPrettyName(), $libraryTargetPath); + } + + if (false !== ($executable = $this->getTheseerAutoloadExecutable())) { + $this->writeDebug('Magento deployLibraries executes autoload generator'); + + $params = $this->getTheseerAutoloadParams($libraryPath, $autoloadDirectories); + + $process = new Process($executable . $params); + $process->run(); + } + } + + /** + * return the autoload generator binary path or false if not found + * + * @return bool|string + */ + protected function getTheseerAutoloadExecutable() + { + $executable = $this->composer->getConfig()->get(self::BIN_DIR_KEY) + . self::THESEER_AUTOLOAD_EXEC_BIN_PATH; + + if (!file_exists($executable)) { + $executable = $this->composer->getConfig()->get(self::VENDOR_DIR_KEY) + . self::THESEER_AUTOLOAD_EXEC_REL_PATH; + } + + if (!file_exists($executable)) { + $this->writeDebug( + 'Magento deployLibraries autoload generator not available, you should require "theseer/autoload"', + $executable + ); + + return false; + } + + return $executable; + } + + /** + * get Theseer Autoload Generator Params + * + * @param string $libraryPath + * @param array $autoloadDirectories + * + * @return string + */ + protected function getTheseerAutoloadParams($libraryPath, $autoloadDirectories) + { + // @todo --blacklist 'test\\\\*' + return " -b {$libraryPath} -o {$libraryPath}/autoload.php " . implode(' ', $autoloadDirectories); + } + + /** + * Copy then delete is a non-atomic version of {@link rename}. + * + * Some systems can't rename and also don't have proc_open, + * which requires this solution. + * + * copied from \Composer\Util\Filesystem::copyThenRemove and removed the remove part + * + * @param string $source + * @param string $target + */ + protected function copyRecursive($source, $target) + { + $it = new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS); + $ri = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::SELF_FIRST); + $this->filesystem->ensureDirectoryExists($target); + + foreach ($ri as $file) { + $targetPath = $target . DIRECTORY_SEPARATOR . $ri->getSubPathName(); + if ($file->isDir()) { + $this->filesystem->ensureDirectoryExists($targetPath); + } else { + copy($file->getPathname(), $targetPath); + } + } + } + + /** + * print Debug Message + * + * @param $message + */ + private function writeDebug($message, $varDump = null) + { + if ($this->io->isDebug()) { + $this->io->write($message); + + if (!is_null($varDump)) { + var_dump($varDump); + } + } + } + + /** + * @param PackageInterface $package + * @return string + */ + public function getPackageInstallPath(PackageInterface $package) + { + $vendorDir = realpath(rtrim($this->composer->getConfig()->get('vendor-dir'), '/')); + return sprintf('%s/%s', $vendorDir, $package->getPrettyName()); + } + + /** + * @return EventManager + */ + protected function getEventManager() + { + if (null === $this->eventManager) { + $this->eventManager = new EventManager; + } + + return $this->eventManager; + } + + /** + * @return ModuleManager + */ + protected function getModuleManager() + { + if (null === $this->moduleManager) { + $this->moduleManager = new ModuleManager( + new InstalledPackageFileSystemRepository( + rtrim($this->composer->getConfig()->get(self::VENDOR_DIR_KEY), '/') . '/installed.json', + new InstalledPackageDumper() + ), + $this->getEventManager(), + $this->config, + new UnInstallStrategy($this->filesystem, $this->config->getMagentoRootDir()), + new InstallStrategyFactory($this->config, new ParserFactory($this->config)) + ); + } + + return $this->moduleManager; + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/ProjectConfig.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/ProjectConfig.php new file mode 100644 index 0000000..8aa74e9 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/ProjectConfig.php @@ -0,0 +1,464 @@ +extra = $extra; + $this->composerConfig = $composerConfig; + + if (!is_null($projectConfig = $this->fetchVarFromConfigArray($this->extra, self::MAGENTO_PROJECT_KEY))) { + $this->applyMagentoConfig($projectConfig); + } + } + + /** + * @param array $array + * @param string|integer $key + * @param mixed $default + * + * @return mixed + */ + protected function fetchVarFromConfigArray($array, $key, $default = null) + { + $array = (array)$array; + $result = $default; + if (isset($array[$key])) { + $result = $array[$key]; + } + + return $result; + } + + /** + * @param $key + * @param null $default + * + * @return null + */ + protected function fetchVarFromExtraConfig($key, $default = null) + { + return $this->fetchVarFromConfigArray($this->extra, $key, $default); + } + + /** + * @param $config + */ + protected function applyMagentoConfig($config) + { + $this->libraryPath = $this->fetchVarFromConfigArray($config, 'libraryPath'); + $this->libraryPackages = $this->fetchVarFromConfigArray($config, 'libraries'); + } + + /** + * @return mixed + */ + public function getLibraryPath() + { + return $this->libraryPath; + } + + /** + * @param $packagename + * + * @return null + */ + public function getLibraryConfigByPackagename($packagename) + { + return $this->fetchVarFromConfigArray($this->libraryPackages, $packagename); + } + + /** + * @return string + */ + public function getMagentoRootDir() + { + return rtrim( + trim( + $this->fetchVarFromExtraConfig( + self::MAGENTO_ROOT_DIR_KEY, + self::DEFAULT_MAGENTO_ROOT_DIR + ) + ), + DIRECTORY_SEPARATOR + ); + } + + /** + * @param $rootDir + */ + public function setMagentoRootDir($rootDir) + { + $this->updateExtraConfig(self::MAGENTO_ROOT_DIR_KEY, rtrim(trim($rootDir), DIRECTORY_SEPARATOR)); + } + + /** + * @return bool + */ + public function hasMagentoRootDir() + { + return $this->hasExtraField(self::MAGENTO_ROOT_DIR_KEY); + } + + public function getMagentoVarDir() + { + return $this->getMagentoRootDir().'var'.DIRECTORY_SEPARATOR; + } + + /** + * @param $deployStrategy + */ + public function setDeployStrategy($deployStrategy) + { + $this->updateExtraConfig(self::MAGENTO_DEPLOY_STRATEGY_KEY, trim($deployStrategy)); + } + + /** + * @return string + */ + public function getDeployStrategy() + { + return trim((string)$this->fetchVarFromExtraConfig(self::MAGENTO_DEPLOY_STRATEGY_KEY)); + } + + /** + * @return bool + */ + public function hasDeployStrategy() + { + return $this->hasExtraField(self::MAGENTO_DEPLOY_STRATEGY_KEY); + } + + /** + * @return array + */ + public function getDeployStrategyOverwrite() + { + return (array)$this->transformArrayKeysToLowerCase( + $this->fetchVarFromExtraConfig(self::MAGENTO_DEPLOY_STRATEGY_OVERWRITE_KEY, array()) + ); + } + + /** + * @return bool + */ + public function hasDeployStrategyOverwrite() + { + return $this->hasExtraField(self::MAGENTO_DEPLOY_STRATEGY_OVERWRITE_KEY); + } + + /** + * @param $packagename + * + * @return integer + */ + public function getModuleSpecificDeployStrategy($packagename) + { + $moduleSpecificDeployStrategies = $this->getDeployStrategyOverwrite(); + + $strategyName = $this->getDeployStrategy(); + if (isset($moduleSpecificDeployStrategies[$packagename])) { + $strategyName = $moduleSpecificDeployStrategies[$packagename]; + } + return $strategyName; + } + + /** + * @param $packagename + * + * @return integer + */ + public function getModuleSpecificSortValue($packagename) + { + $sortPriorityArray = $this->fetchVarFromExtraConfig(self::SORT_PRIORITY_KEY, array()); + if (isset($sortPriorityArray[$packagename])) { + $sortValue = $sortPriorityArray[$packagename]; + } else { + $sortValue = 100; + if ($this->getModuleSpecificDeployStrategy($packagename) === 'copy') { + $sortValue++; + } + } + return $sortValue; + } + + /** + * @return array + */ + public function getMagentoDeployIgnore() + { + return (array)$this->transformArrayKeysToLowerCase( + $this->fetchVarFromExtraConfig(self::MAGENTO_DEPLOY_IGNORE_KEY) + ); + } + + /** + * @param $packagename + * + * @return array + */ + public function getModuleSpecificDeployIgnores($packagename) + { + $moduleSpecificDeployIgnores = array(); + if ($this->hasMagentoDeployIgnore()) { + $magentoDeployIgnore = $this->getMagentoDeployIgnore(); + if (isset($magentoDeployIgnore['*'])) { + $moduleSpecificDeployIgnores = $magentoDeployIgnore['*']; + } + if (isset($magentoDeployIgnore[$packagename])) { + $moduleSpecificDeployIgnores = array_merge( + $moduleSpecificDeployIgnores, + $magentoDeployIgnore[$packagename] + ); + } + } + return $moduleSpecificDeployIgnores; + } + + /** + * @return bool + */ + public function hasMagentoDeployIgnore() + { + return $this->hasExtraField(self::MAGENTO_DEPLOY_IGNORE_KEY); + } + + /** + * @param $magentoForce + */ + public function setMagentoForce($magentoForce) + { + $this->updateExtraConfig(self::MAGENTO_FORCE_KEY, trim($magentoForce)); + } + + /** + * @return string + */ + public function getMagentoForce() + { + return (bool)$this->fetchVarFromExtraConfig(self::MAGENTO_FORCE_KEY); + } + + /** + * @return bool + */ + public function hasMagentoForce() + { + return $this->hasExtraField(self::MAGENTO_FORCE_KEY); + } + + public function getMagentoForceByPackageName($packagename) + { + return $this->getMagentoForce(); + } + + /** + * @return bool + */ + public function hasAutoAppendGitignore() + { + return $this->hasExtraField(self::AUTO_APPEND_GITIGNORE_KEY); + } + + /** + * @return array + */ + public function getPathMappingTranslations() + { + return (array)$this->fetchVarFromExtraConfig(self::PATH_MAPPINGS_TRANSLATIONS_KEY); + } + + /** + * @return bool + */ + public function hasPathMappingTranslations() + { + return $this->hasExtraField(self::PATH_MAPPINGS_TRANSLATIONS_KEY); + } + + /** + * @return array + */ + public function getMagentoDeployOverwrite() + { + return (array)$this->transformArrayKeysToLowerCase( + $this->fetchVarFromExtraConfig(self::MAGENTO_DEPLOY_STRATEGY_OVERWRITE_KEY) + ); + } + + public function getMagentoMapOverwrite() + { + return $this->transformArrayKeysToLowerCase( + (array)$this->fetchVarFromExtraConfig(self::MAGENTO_MAP_OVERWRITE_KEY) + ); + } + protected function hasExtraField($key) + { + return (bool)!is_null($this->fetchVarFromExtraConfig($key)); + } + + /** + * @param $key + * @param $value + */ + protected function updateExtraConfig($key, $value) + { + $this->extra[$key] = $value; + $this->updateExtraJson(); + } + + /** + * @throws \Exception + */ + protected function updateExtraJson() + { + $composerFile = Factory::getComposerFile(); + + if (!file_exists($composerFile) && !file_put_contents($composerFile, "{\n}\n")) { + throw new Exception(sprintf('%s could not be created', $composerFile)); + } + + if (!is_readable($composerFile)) { + throw new Exception(sprintf('%s is not readable', $composerFile)); + } + + if (!is_writable($composerFile)) { + throw new Exception(sprintf('%s is not writable', $composerFile)); + } + + $json = new JsonFile($composerFile); + $composer = $json->read(); + + $baseExtra = array_key_exists(self::EXTRA_KEY, $composer) + ? $composer[self::EXTRA_KEY] + : array(); + + if (!$this->updateFileCleanly($json, $baseExtra, $this->extra, self::EXTRA_KEY)) { + foreach ($this->extra as $key => $value) { + $baseExtra[$key] = $value; + } + + $composer[self::EXTRA_KEY] = $baseExtra; + $json->write($composer); + } + } + + /** + * @param JsonFile $json + * @param array $base + * @param array $new + * @param $rootKey + * + * @return bool + */ + private function updateFileCleanly(JsonFile $json, array $base, array $new, $rootKey) + { + $contents = file_get_contents($json->getPath()); + + $manipulator = new JsonManipulator($contents); + + foreach ($new as $childKey => $childValue) { + if (!$manipulator->addLink($rootKey, $childKey, $childValue)) { + return false; + } + } + + file_put_contents($json->getPath(), $manipulator->getContents()); + + return true; + } + + /** + * @param array $array + * + * @return array + */ + public function transformArrayKeysToLowerCase(array $array) + { + return array_change_key_case($array, CASE_LOWER); + } + + public function getComposerRepositories() + { + return $this->fetchVarFromConfigArray($this->composerConfig, 'repositories', array()); + } + + /** + * Get Composer vendor directory + * + * @return string + */ + public function getVendorDir() + { + return $this->fetchVarFromConfigArray( + isset($this->composerConfig['config']) ? $this->composerConfig['config'] : array(), + 'vendor-dir', + getcwd() . '/vendor' + ); + } + + /** + * @return boolean + */ + public function mustApplyBootstrapPatch() + { + return (bool) $this->fetchVarFromExtraConfig(self::EXTRA_WITH_BOOTSTRAP_PATCH_KEY, true); + } + + /** + * @return boolean + */ + public function skipSuggestComposerRepositories() + { + return (bool) $this->fetchVarFromExtraConfig(self::EXTRA_WITH_SKIP_SUGGEST_KEY, false); + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Repository/InstalledPackageFileSystemRepository.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Repository/InstalledPackageFileSystemRepository.php new file mode 100644 index 0000000..96ddb81 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Repository/InstalledPackageFileSystemRepository.php @@ -0,0 +1,190 @@ + + */ +class InstalledPackageFileSystemRepository implements InstalledPackageRepositoryInterface +{ + + /** + * @var string Path to state file + */ + protected $filePath; + + /** + * @var array + */ + protected $packages = array(); + + /** + * @var bool Flag to indicate if we have read the existing file + */ + protected $isLoaded = false; + + /** + * @var bool Flag to indicate if we need to write once we are finished + */ + protected $hasChanges = false; + + /** + * @var InstalledPackageDumper + */ + protected $dumper; + + /** + * If file exists, check its readable + * Check in any case that it's writeable + * + * @param string $filePath + * @param InstalledPackageDumper $dumper + */ + public function __construct($filePath, InstalledPackageDumper $dumper) + { + if (file_exists($filePath) && !is_writable($filePath)) { + throw new \InvalidArgumentException(sprintf('File "%s" is not writable', $filePath)); + } + + if (file_exists($filePath) && !is_readable($filePath)) { + throw new \InvalidArgumentException(sprintf('File "%s" is not readable', $filePath)); + } + + if (!file_exists($filePath) && !is_writable(dirname($filePath))) { + throw new \InvalidArgumentException(sprintf('Directory "%s" is not writable', dirname($filePath))); + } + + $this->filePath = $filePath; + $this->dumper = $dumper; + } + + /** + * @return array + */ + public function findAll() + { + $this->load(); + return $this->packages; + } + + /** + * @param string $packageName + * @return InstalledPackage + * @throws \Exception + */ + public function findByPackageName($packageName) + { + $this->load(); + foreach ($this->packages as $package) { + if ($package->getName() === $packageName) { + return $package; + } + } + + throw new \Exception(sprintf('Package Installed Files for: "%s" not found', $packageName)); + } + + /** + * If version specified, perform a strict check, + * which only returns true if repository has the package in the specified version + * + * @param string $packageName + * @param string $version + * @return bool + */ + public function has($packageName, $version = null) + { + $this->load(); + try { + $package = $this->findByPackageName($packageName); + + if (null === $version) { + return true; + } + + return $package->getVersion() === $version; + } catch (\Exception $e) { + return false; + } + } + + /** + * @param InstalledPackage $package + * @throws \Exception + */ + public function add(InstalledPackage $package) + { + $this->load(); + + try { + $this->findByPackageName($package->getName()); + } catch (\Exception $e) { + $this->packages[] = $package; + $this->hasChanges = true; + return; + } + + throw new \Exception(sprintf('Package: "%s" is already installed', $package->getName())); + } + + /** + * @param InstalledPackage $package + * @throws \Exception + */ + public function remove(InstalledPackage $package) + { + $this->load(); + + foreach ($this->packages as $key => $installedPackage) { + if ($installedPackage->getName() === $package->getName()) { + array_splice($this->packages, $key, 1); + $this->hasChanges = true; + return; + } + } + + throw new \Exception(sprintf('Package: "%s" not found', $package->getName())); + } + + /** + * Load the Mappings File + * + * @return array + */ + private function load() + { + if (!$this->isLoaded && file_exists($this->filePath)) { + $data = json_decode(file_get_contents($this->filePath), true); + + foreach ($data as $installedPackageData) { + $this->packages[] = $this->dumper->restore($installedPackageData); + } + } + + $this->isLoaded = true; + } + + /** + * Do the write on destruct, we shouldn't have to do this manually + * - you don't call save after adding an entry to the database + * and at the same time, do want to perform IO for each package addition/removal. + * + * Also I don't like enforcing the consumer to call save and load. + */ + public function __destruct() + { + if ($this->hasChanges) { + $data = array(); + foreach ($this->packages as $installedPackage) { + $data[] = $this->dumper->dump($installedPackage); + } + + file_put_contents($this->filePath, json_encode($data, JSON_PRETTY_PRINT)); + } + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Repository/InstalledPackageRepositoryInterface.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Repository/InstalledPackageRepositoryInterface.php new file mode 100644 index 0000000..d01421a --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Repository/InstalledPackageRepositoryInterface.php @@ -0,0 +1,43 @@ + + */ +interface InstalledPackageRepositoryInterface +{ + /** + * Get all installed packages + * + * @return InstalledPackage[] + */ + public function findAll(); + + /** + * @param string $packageName + * @return InstalledPackage|null + */ + public function findByPackageName($packageName); + + /** + * @param InstalledPackage $package + */ + public function remove(InstalledPackage $package); + + /** + * @param InstalledPackage $package + */ + public function add(InstalledPackage $package); + + /** + * @param string $packageName + * @param string $version + * @return bool + */ + public function has($packageName, $version = null); +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/UnInstallStrategy/UnInstallStrategy.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/UnInstallStrategy/UnInstallStrategy.php new file mode 100644 index 0000000..0f525c9 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/UnInstallStrategy/UnInstallStrategy.php @@ -0,0 +1,66 @@ + + */ +class UnInstallStrategy implements UnInstallStrategyInterface +{ + + /** + * @var Filesystem + */ + protected $fileSystem; + + /** + * The root dir for uninstalling from. Should be project root. + * + * @var string + */ + protected $rootDir; + + /** + * @param Filesystem $fileSystem + * @param string $rootDir + */ + public function __construct(Filesystem $fileSystem, $rootDir) + { + $this->fileSystem = $fileSystem; + $this->rootDir = $rootDir; + } + + /** + * UnInstall the extension given the list of install files + * + * @param array $files + */ + public function unInstall(array $files) + { + foreach ($files as $file) { + $file = $this->rootDir . $file; + + /* + because of different reasons the file can be already gone. + example: + - file got deployed by multiple modules(should only happen with copy force) + - user did things + + when the file is a symlink, but the target is already gone, file_exists returns false + */ + if (file_exists($file) xor is_link($file)) { + $this->fileSystem->unlink($file); + + $parentDir = dirname($file); + while ($this->fileSystem->isDirEmpty($parentDir) && $parentDir !== $this->rootDir) { + $this->fileSystem->removeDirectory($parentDir); + $parentDir = dirname($parentDir); + } + } + } + } +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/UnInstallStrategy/UnInstallStrategyInterface.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/UnInstallStrategy/UnInstallStrategyInterface.php new file mode 100644 index 0000000..79195c1 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/UnInstallStrategy/UnInstallStrategyInterface.php @@ -0,0 +1,18 @@ + + */ +interface UnInstallStrategyInterface +{ + /** + * UnInstall the extension given the list of install files + * + * @param array $files + */ + public function unInstall(array $files); +} diff --git a/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Util/FileSystem.php b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Util/FileSystem.php new file mode 100644 index 0000000..6bf87f3 --- /dev/null +++ b/vendor/magento-hackathon/magento-composer-installer/src/MagentoHackathon/Composer/Magento/Util/FileSystem.php @@ -0,0 +1,15 @@ + + */ +class FileSystem extends ComposerFs +{ + +} diff --git a/vendor/mothership/component_base/LICENSE b/vendor/mothership/component_base/LICENSE new file mode 100644 index 0000000..57a661e --- /dev/null +++ b/vendor/mothership/component_base/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Mothership GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/vendor/mothership/component_base/README.md b/vendor/mothership/component_base/README.md new file mode 100644 index 0000000..0650ee8 --- /dev/null +++ b/vendor/mothership/component_base/README.md @@ -0,0 +1,16 @@ +# component_base +The mothership base components + +##Installation +Via composer add: +``` +"require": { + "mothership/component_base" : "0.1.*" + } +``` +or +``` +"require": { + "mothership/component_base" : "dev-master" + } +``` diff --git a/vendor/mothership/component_base/composer.json b/vendor/mothership/component_base/composer.json new file mode 100644 index 0000000..58e3630 --- /dev/null +++ b/vendor/mothership/component_base/composer.json @@ -0,0 +1,33 @@ +{ + "name": "mothership/component_base", + "type": "library", + "description": "Mothership base library", + "keywords": [], + "homepage": "https://www.mothership.de", + "license": "MIT", + "authors": [ + { + "name": "Don Bosco van Hoi", + "email": "vanhoi@mothership.de" + }, + { + "name": "Maurizio Brioschi", + "email": "brioschi@mothership.de" + } + ], + "require": { + "php": ">=5.5", + "symfony/console": "2.7.0" + }, + "require-dev": { + "phpunit/phpunit": "4.8.*", + "phpunit/dbunit": "1.4.*" + }, + "minimum-stability" : "dev", + "autoload": { + "psr-4": { + "Mothership\\Exception\\": "src/Mothership/Exception/", + "Mothership\\Tests\\": "src/Mothership/Tests/" + } + } +} diff --git a/vendor/mothership/component_base/src-tests/Tests/BaseTestCase.php b/vendor/mothership/component_base/src-tests/Tests/BaseTestCase.php new file mode 100644 index 0000000..c935c84 --- /dev/null +++ b/vendor/mothership/component_base/src-tests/Tests/BaseTestCase.php @@ -0,0 +1,47 @@ + + * @author Don Bosco van Hoi + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +use Mothership\Tests\TraitBase; + +/** + * Class BaseTestCase + * + * @category Mothership + * @package Mothership_BaseTestCase + * @author Don Bosco van Hoi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +class BaseTestCase extends \PHPUnit_Framework_TestCase +{ + use TraitBase; +} \ No newline at end of file diff --git a/vendor/mothership/component_base/src-tests/Tests/DatabaseTestCase.php b/vendor/mothership/component_base/src-tests/Tests/DatabaseTestCase.php new file mode 100644 index 0000000..1daf52d --- /dev/null +++ b/vendor/mothership/component_base/src-tests/Tests/DatabaseTestCase.php @@ -0,0 +1,99 @@ + + * @author Don Bosco van Hoi + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +use Mothership\Tests\TraitBase; + +/** + * Class MothershipMysqlAbstractTestCase + * + * @category Mothership + * @package Mothership_MothershipMysqlAbstractTestCase + * @author Don Bosco van Hoi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + * + * @see https://phpunit.de/manual/current/en/database.html + */ +abstract class DatabaseTestCase extends \PHPUnit_Extensions_Database_TestCase +{ + use TraitBase; + + /** + * @var \PDO + */ + private $pdo = null; + + /** + * @var string + */ + protected $dataset; + + /** + * @return \PHPUnit_Extensions_Database_DB_IDatabaseConnection + * + * @link http://someguyjeremy.com/2013/01/database-testing-with-phpunit.html + */ + public function getConnection() + { + if (null === $this->pdo) { + $this->pdo = new \PDO('sqlite::memory:'); + + /** + * + */ + $fixtureDataSet = $this->getDataSet($this->dataset); + foreach ($fixtureDataSet->getTableNames() as $table) { + $this->pdo->exec("DROP TABLE IF EXISTS ".$table.";"); + + + $meta = $fixtureDataSet->getTableMetaData($table); + $create = "CREATE TABLE IF NOT EXISTS `".$table."`"; + $cols = array(); + foreach ($meta->getColumns() as $col) { + $cols[] = " `".$col."` VARCHAR(200)"; + } + $create .= '('.implode(',', $cols).');'; + $this->pdo->exec($create); + } + } + return $this->createDefaultDBConnection($this->pdo, ':memory:'); + } + + /** + * @return \PHPUnit_Extensions_Database_DataSet_IDataSet + */ + public function getDataSet() + { + return new \PHPUnit_Extensions_Database_DataSet_YamlDataSet($this->dataset); + } + + +} diff --git a/vendor/mothership/component_base/src-tests/Tests/README.md b/vendor/mothership/component_base/src-tests/Tests/README.md new file mode 100644 index 0000000..fb35a54 --- /dev/null +++ b/vendor/mothership/component_base/src-tests/Tests/README.md @@ -0,0 +1,9 @@ +PHPUnit tests class +---------------------------- +Base classes for unit tests: +- [MothershipBaseTestCase](https://github.com/mothership-gmbh/component_base/blob/develop/src/Mothership/Tests/MothershipBaseTestCase.php) is useful for tests private and protected methods plus some others features. +- [MothershipMysqlAbstractTestCase](https://github.com/mothership-gmbh/component_base/blob/develop/src/Mothership/Tests/MothershipMysqlAbstractTestCase.php) is useful to make unit test that interact with the database. +- Il file xml is just an example to how configure PHPUnit to have access to the db +- The yaml file represents a database structure and data example to interact with the database. The constructor in the class *MothershipMysqlAbstractTestCase*, starting from this file creates the tables in the database and populates them with the values of the file. After the tests execution all the databases class will be drop. + + diff --git a/vendor/mothership/component_base/src-tests/Tests/exemple.yaml b/vendor/mothership/component_base/src-tests/Tests/exemple.yaml new file mode 100644 index 0000000..f26545d --- /dev/null +++ b/vendor/mothership/component_base/src-tests/Tests/exemple.yaml @@ -0,0 +1,37 @@ +tests_db: + - + id: 1 + title: title1 + description: description1 + catalog_category: category1 + product_type: shoes + url_path: "http://www.google.com" + image: "ciao.jpg" + condition: "skate" + stock_status: 1 + price: 23.98 + manufacturer: mothership + - + id: 2 + title: title2 + description: description2 + catalog_category: category2 + product_type: shoes + url_path: "http://www.google.com" + image: "ciao.jpg" + condition: "skate" + stock_status: 0 + price: 23.98 + manufacturer: mothership + - + sku: 3 + title: title3 + description: description3 + catalog_category: category3 + product_type: shoes + url_path: "http://www.google.com" + image: "ciao.jpg" + condition: "skate" + stock_status: 3 + price: 23.98 + manufacturer: mothership diff --git a/vendor/mothership/component_base/src-tests/Tests/phpunit.xml b/vendor/mothership/component_base/src-tests/Tests/phpunit.xml new file mode 100644 index 0000000..c289dcd --- /dev/null +++ b/vendor/mothership/component_base/src-tests/Tests/phpunit.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/vendor/mothership/component_base/src/Mothership/Exception/ExceptionAbstract.php b/vendor/mothership/component_base/src/Mothership/Exception/ExceptionAbstract.php new file mode 100644 index 0000000..60fb176 --- /dev/null +++ b/vendor/mothership/component_base/src/Mothership/Exception/ExceptionAbstract.php @@ -0,0 +1,122 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\Exception; + +use Exception; +use Symfony\Component\Console\Output\ConsoleOutput; +use Symfony\Component\Console\Output\OutputInterface; + +abstract class ExceptionAbstract extends Exception +{ + protected $gravity; //score from 0 to 100 where 100 is the most dangerous + + /** + * @var ConsoleOutput + */ + protected $output; + + /** + * @param string $message + * @param int $code + * @param Exception|null $previous + * @param OutputInterface|null $output + * @param bool|true $send_alert if is true the exception will be write on the $output + */ + public function __construct($message = "", $code = 0, Exception $previous = null, OutputInterface $output = null, + $send_alert = true) + { + parent::__construct($message, $code, $previous); + if ($previous != null) { + $this->message .= "\n" . $previous->getMessage(); + } + + $this->output = $output; + if (is_null($output) || !isset($output)) { + $this->output = new ConsoleOutput(); + } + + $this->gravity = $this->code; + + if ($send_alert && $previous == null) { + $this->alert(); + } + } + + /** + * Get the gravity of the exception + * + * @return int + */ + public function getGravity() + { + return $this->gravity; + } + + /** + * Get the gravity level of the exception + * + * @return string + */ + protected function getGravityLevel() + { + switch ($this->gravity) { + case $this->gravity > 90: + return "danger"; + case $this->gravity >= 80 && $this->gravity < 90: + return "low-danger"; + case $this->gravity >= 50 && $this->gravity < 80: + return "warning"; + default: + return "info"; + } + } + + /** + * + */ + public function alert() + { + return; + $level = $this->getGravityLevel(); + switch ($level) { + case 'danger': + $this->output->writeln("DANGER: " . $this->message . "\n\n"); + break; + case 'low-danger': + $this->output->writeln("DANGER: " . $this->message . ""); + break; + case 'waring': + $this->output->writeln("WARNING: " . $this->message . ""); + break; + case 'info': + $this->output->writeln("INFO: " . $this->message . ""); + break; + } + } +} diff --git a/vendor/mothership/component_base/src/Mothership/Tests/TraitBase.php b/vendor/mothership/component_base/src/Mothership/Tests/TraitBase.php new file mode 100644 index 0000000..e6ed89e --- /dev/null +++ b/vendor/mothership/component_base/src/Mothership/Tests/TraitBase.php @@ -0,0 +1,62 @@ + + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +trait TraitBase { + + /** + * call private methods + * + * @param object &$object Object + * @param string $methodName methods + * @param array $parameters params + * @return mixed Method return. + */ + protected function invokeMethod(&$object, $methodName, array $parameters = array()) + { + $reflection = new \ReflectionClass(get_class($object)); + $method = $reflection->getMethod($methodName); + $method->setAccessible(true); + return $method->invokeArgs($object, $parameters); + } + + /** + * Get private property value + * + * @param string $object + * @param string $propertyName + * + * @return mixed + */ + protected function getPropertyValue(&$object, $propertyName) + { + $reflection = new \ReflectionClass(get_class($object)); + $property = $reflection->getProperty($propertyName); + $property->setAccessible(true); + return $property->getValue($object); + } + + /** + * @param $object + * @param $propertyName + * @return string + */ + protected function getPropertyClass(&$object, $propertyName) + { + $reflection = new \ReflectionClass(get_class($object)); + $property = $reflection->getProperty($propertyName); + $property->setAccessible(true); + return get_class($property->getValue($object)); + } +} \ No newline at end of file diff --git a/vendor/mothership/state_machine/.gitignore b/vendor/mothership/state_machine/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/vendor/mothership/state_machine/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/mothership/state_machine/.travis.yml b/vendor/mothership/state_machine/.travis.yml new file mode 100644 index 0000000..00a58c1 --- /dev/null +++ b/vendor/mothership/state_machine/.travis.yml @@ -0,0 +1,9 @@ +language: php +php: +- 5.5 +- 5.6 +- 7.0 +before_script: + - sudo apt-get install graphviz + - composer install +script: phpunit --coverage-text diff --git a/vendor/mothership/state_machine/LICENSE b/vendor/mothership/state_machine/LICENSE new file mode 100644 index 0000000..15d734e --- /dev/null +++ b/vendor/mothership/state_machine/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Mothership GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/mothership/state_machine/README.md b/vendor/mothership/state_machine/README.md new file mode 100755 index 0000000..31de36c --- /dev/null +++ b/vendor/mothership/state_machine/README.md @@ -0,0 +1,264 @@ +PHP State Machine / FSM / Acceptance Automata + +![](https://travis-ci.org/mothership-gmbh/state_machine.svg?branch=master) [![Summary](https://www.versioneye.com/user/projects/56b0dda83d82b90032bfff16/badge.svg?style=flat)](https://www.versioneye.com/user/projects/56b0dda83d82b90032bfff16?child=summary) [![Latest Stable Version](https://poser.pugx.org/mothership/state_machine/v/stable)](https://packagist.org/packages/mothership/state_machine) [![Total Downloads](https://poser.pugx.org/mothership/state_machine/downloads)](https://packagist.org/packages/mothership/state_machine) [![Latest Unstable Version](https://poser.pugx.org/mothership/state_machine/v/unstable)](https://packagist.org/packages/mothership/state_machine) [![License](https://poser.pugx.org/mothership/state_machine/license)](https://packagist.org/packages/mothership/state_machine) +----------------------------------------- +A PHP based state machine implementation. + +For more informations visit the [website](http://mothership-gmbh.github.io/state_machine) + +#Features +- Create a FSM-compatible state machine +- Define your states, transitions and conditions completely in a configuration file. Currently only supports YAML +- NO additional logic is needed to process the transitions. The state machine will automatically try to detect valid transitions +- Render a graphic image that shows the behaviour of the state machine. + +#Tests +You can run the unit tests with the following command: + + $ cd path/to/Mothership/Component/StateMachine/ #check your path + $ composer install + $ phpunit + +#Installation + +You can use composer to directly install in in your project. Do not use the master branch but only tagged versions. + +``` +"require": { + "mothership/state_machine": "v1.0.2" +} + +``` + +Then just run *composer install* + + $ composer install + +##Requirement for rendering the graph + +The StateMachine render graph functionality depends on the *graphviz* library. On os with apt just install it with the package managment + +``` +sudo apt-get install graphviz +``` + +#Usage + +The state machine needs three files to be able to run: + +1. A concrete state machine +2. The yaml configuration file +3. A workflow definition + +##Quickstart + +In case you have everything or just want to skip the more detailed parts, take a look at this directory within this repository: + +``` +/src/Examples/Simple/SimpleStateMachine.php +``` + +``` +$stateMachine = new \Mothership\StateMachine\Examples\Simple('workflow.yml'); +$stateMachine->run(); +``` + +##1. The concrecte state machine + +There is no concrete StateMachine implementation in this library, except the examples. However the implementation is very easy and in fact just an inheritance of the abstract class. + +``` +// set your own namespace +namespace Mothership\StateMachine\Examples\Simple; + +class SimpleStateMachine extends \Mothership\StateMachine\StateMachineAbstract +{ +// that's all! +} +``` + +##2. The yaml configuration file + +The yaml configuration file is the most important file as it describes various business cases. You will find more advanced use cases later. For the beginning take a look at the following workflow. + +![](./src/Examples/Simple/workflow.png) + +By the way: the graph has been rendered with graphviz. You can also easily render it by your own with this command: + +``` +$stateMachine->renderGraph('/your/path/file.png'); +``` + +If you are familiar with the concepts of a state machine, you will know that a state machine contains + +* a defined start +* a defined end +* a number of transitions +* a set of various states + +Let's see, how the *configuration file* could look like, by inspecting the ```workflow.yml```: + +``` +class: + name: Mothership\StateMachine\Examples\Simple\SimpleWorkflow + args: [] + +states: + start: + type: initial + second_state: + type: normal + transitions_from: [start] + transitions_to: [second_state] + third_state: + type: normal + transitions_from: [second_state] + transitions_to: [third_state] + finish: + type: final + transitions_from: [third_state] + transitions_to: [finish] + +``` +###Good to know + + +* Every state, except *start* needs to be implemented as a method. For example the state with the name *second_state* expects a method named ```second_state()``` in the *workflow class*. +* The name of the transitions is always equals to the name of the ```transitions_to``` field. If there is an condition, the transition name will also be changed. +* You do not need to implement any programming logic for state transitions. +* The possible types of the state can be *initial*, *normal* or *final*. + +##3. The workflow class + +While the *configuration file* defines the possible transitions of the automata, the workflow class contains the possible transitions. Let's check this code: + +``` +namespace Mothership\StateMachine\Examples\Simple; + +use Mothership\StateMachine\WorkflowAbstract; + +class SimpleWorkflow extends WorkflowAbstract +{ + + function second_state() + { + + } + + function third_state() + { + + } + + function finish() + { + } +} +``` + +* There is *no* method ```start()``` as this state will never be executed but is just a starting point +* The basic methods do not return any value. More advanced methods can for example return a boolean value or any string. This important for more advanced use cases. +* The name of the class *MUST* match the name of the class in the configuration file + +#Render the graph +It is recommended to render your workflow as a graph, so that you will get visual support. + +``` +$state_machine = new StateMachine(); +$state_machine = $state_machine->renderGraph($path, false); +``` + +**$paht**: path where the state machine will save the image + +**true/false**: if you want that after the render the state machine exits (default is true) + +#Advanced Use Cases + +Let's assume a more advanced workflow like that one: [Advanced Workflow](./src/Examples/Advanced/Workflow.yml). The rendered graph will look like the following: + +![](./src/Examples/Advanced/workflow.png) + +We will go through smaller examples to discuss the different transition types. + +##Conditionals + +Check the transition ```product_has_media_gallery``` and ```create_media_gallery```|```get_images``` + +| Start | Condition | Target | +|---|---|---| +| product_has_media_gallery | true | create_media_gallery | +| product_has_media_gallery | false | get_images | + +As you can see, you need to have a condition *AFTER* the *start* state. This means that the state ```product_has_media_gallery``` needs to return a boolean value *true* OR *false*. To be able to do this, you need to update your *yaml configuration* like this: + +``` + product_has_media_gallery: + type: normal + transitions_from: [download_directory_exist] + transitions_to: [product_has_media_gallery] + + create_media_gallery: + type: normal + transitions_from: [{status: product_has_media_gallery, result: false}] + transitions_to: [create_media_gallery] + + get_images: + type: normal + transitions_from: [{status: product_has_media_gallery, result: true}, create_media_gallery] + transitions_to: [get_images] + +``` + +* The conditions are AlWAYS set in the target transition +* Even if we use BOOLEAN values here, you can actually also return a STRING! This is valid as well: + + ``` + transitions_from: [{status: product_has_media_gallery, result: 'yes, okay'}] + ``` +* The state ```get_images``` can be processed with two different transitions. + +##Loops + +Loops are very useful if you need to process a large set of data. The pattern is pretty simple. Take a look at the states ```process_images```, ```has_more``` and ```finish```. + +If there is more to process, then continue to ```process_images```, otherwise ```finish```. As a matrix this would be: + +| Start | Condition | Target | +|---|---|---| +| has_more | true | process_images | +| has_more | false | finish | + +Just do it like that: + +``` + process_images: + type: normal + transitions_from: [get_images, {status: has_more, result: true}] + transitions_to: [process_images] + + has_more: + type: normal + transitions_from: [assign_image] + transitions_to: [has_more] + + finish: + type: final + transitions_from: [{status: has_more, result: false}] + transitions_to: [finish] + +``` + + +#More examples + +Check the directory ```./src/Examples``` to explore more advanced examples by your own. You can also add new state machines into this directory, to automatically run unit tests. + + +#Tests +- Run test from root directory: ```phpunit --coverage-text``` +- You can add your State machine in the ```./src/Examples``` folder and it will be automatically tested with the +command about. **Just use the same conventions name space** + +#Notes +- **Mothership StateMachine** is inspired by [Finite/StateMachine](https://github.com/yohang/Finite) presents in this extension +- [dev-master api](http://mothership-gmbh.github.io/state_machine/api/dev-master/) diff --git a/vendor/mothership/state_machine/composer.json b/vendor/mothership/state_machine/composer.json new file mode 100755 index 0000000..cc3f4c0 --- /dev/null +++ b/vendor/mothership/state_machine/composer.json @@ -0,0 +1,35 @@ +{ + "name": "mothership/state_machine", + "description": "php implementation of state machine, completely configured by an external .yml file with the render of a graph's description", + "homepage": "https://www.mothership.de", + "license": "MIT", + "authors": [ + { + "name": "Maurizio Brioschi", + "email": "brioschi@mothership.de" + }, + { + "name": "Don Bosco van Hoi", + "email": "vanhoi@mothership.de" + } + ], + "require": { + "php": ">=5.5", + "symfony/console": "2.7.*", + "symfony/yaml": "^2.7", + "mothership/component_base": "v0.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.8", + "escapestudios/symfony2-coding-standard": "~2.0" + }, + "autoload": { + "psr-4": { + "Mothership\\StateMachine\\": "src/" + }, + "exclude-from-classmap": [ + "src/Tests/", + "src/Examples/" + ] + } +} diff --git a/vendor/mothership/state_machine/phpunit.composer.xml b/vendor/mothership/state_machine/phpunit.composer.xml new file mode 100644 index 0000000..0bd180b --- /dev/null +++ b/vendor/mothership/state_machine/phpunit.composer.xml @@ -0,0 +1,40 @@ + + + + + ./src-tests/ + + + + + src/Mothership/StateMachine/Exception/StateMachineException.php + src/Mothership/StateMachine/Exception/StatusException.php + src/Mothership/StateMachine/Exception/TransitionException.php + src/Mothership/StateMachine/Exception/WorkflowException.php + src/Mothership/StateMachine/WorkflowInterface.php + src/Mothership/StateMachine/TransitionInterface.php + src/Mothership/StateMachine/StatusInterface.php + src/Mothership/StateMachine/StateMachineInterface.php + + + src/Mothership/StateMachine/StateMachineAbstract.php + src/Mothership/StateMachine/Status.php + src/Mothership/StateMachine/Transition.php + src/Mothership/StateMachine/WorkflowAbstract.php + + + + \ No newline at end of file diff --git a/vendor/mothership/state_machine/src/CollectionWorkflowAbstract.php b/vendor/mothership/state_machine/src/CollectionWorkflowAbstract.php new file mode 100755 index 0000000..c766a16 --- /dev/null +++ b/vendor/mothership/state_machine/src/CollectionWorkflowAbstract.php @@ -0,0 +1,117 @@ + + * @copyright Copyright (c) 2016 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +/** + * Class CollectionWorkflowAbstract + * + * @category Mothership + * @package Mothership_StateMachine + * @author Don Bosco van Hoi + * @copyright 2016 Mothership GmbH + * @link http://www.mothership.de/ + * + * Implements an interface for collections which supports the following transitions + * + * prepare_collection: + * type: normal + * transitions_from: [] + * transitions_to: [prepare_collection] + * + * process_items: + * type: normal + * transitions_from: [{status: has_more, result: true}, prepare_collection] + * transitions_to: [process_item] + * + * has_more: + * type: normal + * from: [process_item] + * + * finish: + * type: final + * transitions_from: [{status: has_more, result: false}] + * transitions_to: [finish] + * + */ +abstract class CollectionWorkflowAbstract extends WorkflowAbstract +{ + /** + * The collection MUST be an array with a numeric Index. + * + * eg. [0] => ... + * [1] => ... + * + * The numeric (i)ndex MUST be i(p=previous_intex) = p+1 for every new entry. + * + * @var mixed + */ + protected $_collection; + + /** + * The pointer MUST be a numeric value starting with 0. + * The pointer MUST be incremented in the method has_more if the collection has + * not been finished yet. + * + * @var int + */ + protected $_pointer = 0; + + /** + * Build the collection with a numeric index + * + * @return void + */ + abstract public function prepare_collection(); + + /** + * Process the current collection item + * + * @return void + */ + abstract public function process_items(); + + /** + * If the collection has not been finished yet, return false. + * + * false -> go to finish() + * true -> continue with process_items() + * + * @return bool + */ + public function has_more() + { + if ($this->_pointer + 1 == count($this->_collection)) { + return false; + } + $this->_pointer++; + + return true; + } + + abstract protected function finish(); +} \ No newline at end of file diff --git a/vendor/mothership/state_machine/src/Examples/Advanced/AdvancedStateMachine.php b/vendor/mothership/state_machine/src/Examples/Advanced/AdvancedStateMachine.php new file mode 100755 index 0000000..c6e77fd --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/Advanced/AdvancedStateMachine.php @@ -0,0 +1,36 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Examples\Advanced; + +use Mothership\StateMachine\StateMachineAbstract; + +class AdvancedStateMachine extends StateMachineAbstract +{ + +} diff --git a/vendor/mothership/state_machine/src/Examples/Advanced/AdvancedWorkflow.php b/vendor/mothership/state_machine/src/Examples/Advanced/AdvancedWorkflow.php new file mode 100755 index 0000000..4d856b7 --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/Advanced/AdvancedWorkflow.php @@ -0,0 +1,172 @@ + + * @copyright Copyright (c) 2016 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +namespace Mothership\StateMachine\Examples\Advanced; + +use Mothership\StateMachine\WorkflowAbstract; + +class AdvancedWorkflow extends WorkflowAbstract +{ + protected $_collection = []; + protected $_pointer = 0; + + function second_state() + { + + } + + function load_document() + { + + } + + /** + * If there is no image, throw an exception. + * + * @return void + * + * @throws \Exception + */ + public function has_images() + { + } + + /** + * If the download directory does not exist, then create it + * + * @return void + */ + public function download_directory_exist() + { + } + + /** + * Every product needs to have a media gallery + * + * @return bool + */ + public function product_has_media_gallery() + { + return (rand(0, 1) == 1) ? true: false; + } + + /** + * Create the media gallery + * + * @return void + */ + public function create_media_gallery() + { + } + + /** + * Get all images and set the pointer to the first item + * + * @return void + */ + public function get_images() + { + //$this->_collection = end($this->_images->parse($this->_document)); + for ($i = 0; $i <= 100; $i++) { + $this->_collection[] = ['test']; + } + $this->_pointer = 0; + } + + /** + * Set the pointer to the current image + * + * @return void + */ + public function process_images() + { + } + + /** + * Check that the current image exist as a copy + * + * @return bool + */ + public function original_image_exist_as_copy() + { + return (rand(0, 1) == 1) ? true: false; + } + + /** + * The image also needs to have the same checksum and the original one + * + * @return bool + * + * @throws \Exception + */ + public function hash_equals_original() + { + return (rand(0, 1) == 1) ? true: false; + } + + /** + * Remove existing images + * + * @return void + */ + public function remove_existing() + { + } + + /** + * Download from the Intex FTP + * + * @return void + * + * @throws \Exception + */ + public function download_original() + { + } + + public function assign_image_straight() + { + } + + public function assign_image() + { + } + + public function has_more() + { + if ($this->_pointer +1 == count($this->_collection)) { + return false; + } + $this->_pointer++; + return true; + } + + public function finish() + { + + } +} \ No newline at end of file diff --git a/vendor/mothership/state_machine/src/Examples/Advanced/Workflow.yml b/vendor/mothership/state_machine/src/Examples/Advanced/Workflow.yml new file mode 100755 index 0000000..39b0ee0 --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/Advanced/Workflow.yml @@ -0,0 +1,87 @@ +#class of the model +class: + name: Mothership\StateMachine\Examples\Advanced\AdvancedWorkflow + args: [] + +#definition of the states and transition...the order establishes the transition from one state to another +#the name of each state is NOT case sensitive +states: + + # initialize the logging and stuff + start: + type: initial + + second_state: + type: normal + transitions_from: [start] + transitions_to: [second_state] + + load_document: + type: normal + transitions_from: [second_state] + transitions_to: [load_document] + + has_images: + type: normal + transitions_from: [load_document] + transitions_to: [has_images] + + download_directory_exist: + type: normal + transitions_from: [has_images] + transitions_to: [download_directory_exist] + + product_has_media_gallery: + type: normal + transitions_from: [download_directory_exist] + transitions_to: [product_has_media_gallery] + + create_media_gallery: + type: normal + transitions_from: [{status: product_has_media_gallery, result: false}] + transitions_to: [create_media_gallery] + + get_images: + type: normal + transitions_from: [{status: product_has_media_gallery, result: true}, create_media_gallery] + transitions_to: [get_images] + + process_images: + type: normal + transitions_from: [get_images, {status: has_more, result: true}] + transitions_to: [process_images] + + original_image_exist_as_copy: + type: normal + transitions_from: [process_images] + transitions_to: [original_image_exist_as_copy] + + hash_equals_original: + type: normal + transitions_from: [{status: original_image_exist_as_copy, result: true}] + transitions_to: [copy_equals_original] + + remove_existing: + type: normal + transitions_from: [{status: hash_equals_original, result: false}] + transitions_to: [is_new] + + download_original: + type: normal + transitions_from: [{status: original_image_exist_as_copy, result: false}, remove_existing] + transitions_to: [download_original] + + assign_image: + type: normal + transitions_from: [{status: hash_equals_original, result: true}, download_original] + transitions_to: [assign_image] + + has_more: + type: normal + transitions_from: [assign_image] + transitions_to: [has_more] + + finish: + type: final + transitions_from: [{status: has_more, result: false}] + transitions_to: [finish] \ No newline at end of file diff --git a/vendor/mothership/state_machine/src/Examples/Advanced/workflow.png b/vendor/mothership/state_machine/src/Examples/Advanced/workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..88f8a00a7cb0a71acae7ca1f55fcd0a56b5bb769 GIT binary patch literal 101654 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 X>qN7IGNOqh(VvDh4X#XCvg7{%u9EPd literal 0 HcmV?d00001 diff --git a/vendor/mothership/state_machine/src/Examples/BooleanConditions/BooleanConditionsStateMachine.php b/vendor/mothership/state_machine/src/Examples/BooleanConditions/BooleanConditionsStateMachine.php new file mode 100755 index 0000000..4a72a5d --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/BooleanConditions/BooleanConditionsStateMachine.php @@ -0,0 +1,36 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Examples\BooleanConditions; + +use Mothership\StateMachine\StateMachineAbstract; + +class BooleanConditionsStateMachine extends StateMachineAbstract +{ + +} diff --git a/vendor/mothership/state_machine/src/Examples/BooleanConditions/BooleanConditionsWorkflow.php b/vendor/mothership/state_machine/src/Examples/BooleanConditions/BooleanConditionsWorkflow.php new file mode 100755 index 0000000..a23bd0f --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/BooleanConditions/BooleanConditionsWorkflow.php @@ -0,0 +1,83 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Examples\BooleanConditions; + +use Mothership\StateMachine\WorkflowAbstract; + +class BooleanConditionsWorkflow extends WorkflowAbstract +{ + protected $index; + protected $limit; + + public function __construct(array $array){ + parent::__construct($array); + $args = $this->vars['class']['args']; + $this->index = $args['startingIndex']; + $this->limit = $args['limit']; + } + + function start() + { + + } + + function second_state() + { + + } + + function third_state() + { + if ($this->index > $this->limit) { + return true; + } else { + $value = rand(1, 2); + if($value==1) { + return 1; + } + return false; + } + } + + function transition_state() + { + $this->index++; + } + + function second_transition_state() + { + $this->index++; + } + + function finish() + { + + } +} diff --git a/vendor/mothership/state_machine/src/Examples/BooleanConditions/Workflow.yml b/vendor/mothership/state_machine/src/Examples/BooleanConditions/Workflow.yml new file mode 100755 index 0000000..46a9482 --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/BooleanConditions/Workflow.yml @@ -0,0 +1,35 @@ +#class of the model +class: + name: Mothership\StateMachine\Examples\IfConditions\IfConditionsWorkflow + args: + startingIndex: 0 + limit: 20 + +#definition of the states and transition...the order establishes the transition from one state to another +#the name of each state is NOT case sensitive +states: + start: + type: initial + second_state: + type: normal + transitions_from: [start] + transitions_to: [second_state] + third_state: + type: normal + transitions_from: [second_state, transition_state, second_transition_state] + transitions_to: [third_state] + transition_state: + type: normal + transitions_from: + - {status: third_state, result: 1} + transitions_to: [transition_state] + second_transition_state: + type: normal + transitions_from: + - {status: third_state, result: false} + transitions_to: [second_transition_state] + finish: + type: final + transitions_from: + - {status: third_state, result: true} + transitions_to: [finish] diff --git a/vendor/mothership/state_machine/src/Examples/BooleanConditions/workflow.png b/vendor/mothership/state_machine/src/Examples/BooleanConditions/workflow.png new file mode 100755 index 0000000000000000000000000000000000000000..59bea7510f59090867c6ebb145cd6f70753b5140 GIT binary patch literal 67730 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 literal 0 HcmV?d00001 diff --git a/vendor/mothership/state_machine/src/Examples/Fail/FailStateMachine.php b/vendor/mothership/state_machine/src/Examples/Fail/FailStateMachine.php new file mode 100755 index 0000000..2df6619 --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/Fail/FailStateMachine.php @@ -0,0 +1,36 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Examples\Fail; + +use Mothership\StateMachine\StateMachineAbstract; + +class FailStateMachine extends StateMachineAbstract +{ + +} diff --git a/vendor/mothership/state_machine/src/Examples/Fail/FailWorkflow.php b/vendor/mothership/state_machine/src/Examples/Fail/FailWorkflow.php new file mode 100755 index 0000000..3602c6b --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/Fail/FailWorkflow.php @@ -0,0 +1,50 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Examples\Fail; + +use Mothership\StateMachine\WorkflowAbstract; + +class FailWorkflow extends WorkflowAbstract +{ + function start() + { + + } + + function second_state() + { + + } + + function finish() + { + + } +} diff --git a/vendor/mothership/state_machine/src/Examples/Fail/Workflow.yml b/vendor/mothership/state_machine/src/Examples/Fail/Workflow.yml new file mode 100755 index 0000000..0cb3823 --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/Fail/Workflow.yml @@ -0,0 +1,22 @@ +#class of the model +class: + name: Mothership\StateMachine\Examples\Fail\FailWorkflow + args: [] + +#definition of the states and transition...the order establishes the transition from one state to another +#the name of each state is NOT case sensitive +states: + start: + type: initial + second_state: + type: normal + transitions_from: [start] + transitions_to: [second_state] + third_state: + type: normal + transitions_from: [second_state] + transitions_to: [third_state] + finish: + type: final + transitions_from: [third_state] + transitions_to: [finish] diff --git a/vendor/mothership/state_machine/src/Examples/IfConditions/IfConditionsStateMachine.php b/vendor/mothership/state_machine/src/Examples/IfConditions/IfConditionsStateMachine.php new file mode 100755 index 0000000..03871c0 --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/IfConditions/IfConditionsStateMachine.php @@ -0,0 +1,36 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Examples\IfConditions; + +use Mothership\StateMachine\StateMachineAbstract; + +class IfConditionsStateMachine extends StateMachineAbstract +{ + +} diff --git a/vendor/mothership/state_machine/src/Examples/IfConditions/IfConditionsWorkflow.php b/vendor/mothership/state_machine/src/Examples/IfConditions/IfConditionsWorkflow.php new file mode 100755 index 0000000..5e3911c --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/IfConditions/IfConditionsWorkflow.php @@ -0,0 +1,72 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Examples\IfConditions; + +use Mothership\StateMachine\WorkflowAbstract; + +class IfConditionsWorkflow extends WorkflowAbstract +{ + protected $index = 0; + protected $limit = 10; + + function start() + { + + } + + function second_state() + { + + } + + function third_state() + { + if ($this->index > $this->limit) { + return 0; + } else { + return rand(1, 2); + } + } + + function transition_state() + { + $this->index++; + } + + function second_transition_state() + { + $this->index++; + } + + function finish() + { + + } +} diff --git a/vendor/mothership/state_machine/src/Examples/IfConditions/Workflow.yml b/vendor/mothership/state_machine/src/Examples/IfConditions/Workflow.yml new file mode 100755 index 0000000..78d5c81 --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/IfConditions/Workflow.yml @@ -0,0 +1,33 @@ +#class of the model +class: + name: Mothership\StateMachine\Examples\IfConditions\IfConditionsWorkflow + args: [] + +#definition of the states and transition...the order establishes the transition from one state to another +#the name of each state is NOT case sensitive +states: + start: + type: initial + second_state: + type: normal + transitions_from: [start] + transitions_to: [second_state] + third_state: + type: normal + transitions_from: [second_state, transition_state, second_transition_state] + transitions_to: [third_state] + transition_state: + type: normal + transitions_from: + - {status: third_state, result: 1} + transitions_to: [transition_state] + second_transition_state: + type: normal + transitions_from: + - {status: third_state, result: 2} + transitions_to: [second_transition_state] + finish: + type: final + transitions_from: + - {status: third_state, result: 0} + transitions_to: [finish] diff --git a/vendor/mothership/state_machine/src/Examples/IfConditions/workflow.png b/vendor/mothership/state_machine/src/Examples/IfConditions/workflow.png new file mode 100755 index 0000000000000000000000000000000000000000..b4aec201a3e2e1cbfefaf93718534a575ee64dd2 GIT binary patch literal 64904 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 literal 0 HcmV?d00001 diff --git a/vendor/mothership/state_machine/src/Examples/Simple/SimpleStateMachine.php b/vendor/mothership/state_machine/src/Examples/Simple/SimpleStateMachine.php new file mode 100755 index 0000000..fb455ed --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/Simple/SimpleStateMachine.php @@ -0,0 +1,36 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Examples\Simple; + +use Mothership\StateMachine\StateMachineAbstract; + +class SimpleStateMachine extends StateMachineAbstract +{ + +} diff --git a/vendor/mothership/state_machine/src/Examples/Simple/SimpleWorkflow.php b/vendor/mothership/state_machine/src/Examples/Simple/SimpleWorkflow.php new file mode 100755 index 0000000..7a62d7f --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/Simple/SimpleWorkflow.php @@ -0,0 +1,55 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Examples\Simple; + +use Mothership\StateMachine\WorkflowAbstract; + +class SimpleWorkflow extends WorkflowAbstract +{ + function start() + { + + } + + function second_state() + { + + } + + function third_state() + { + + } + + function finish() + { + + } +} diff --git a/vendor/mothership/state_machine/src/Examples/Simple/Workflow.yml b/vendor/mothership/state_machine/src/Examples/Simple/Workflow.yml new file mode 100755 index 0000000..2fd71be --- /dev/null +++ b/vendor/mothership/state_machine/src/Examples/Simple/Workflow.yml @@ -0,0 +1,22 @@ +#class of the model +class: + name: Mothership\StateMachine\Examples\Simple\SimpleWorkflow + args: [] + +#definition of the states and transition...the order establishes the transition from one state to another +#the name of each state is NOT case sensitive +states: + start: + type: initial + second_state: + type: normal + transitions_from: [start] + transitions_to: [second_state] + third_state: + type: normal + transitions_from: [second_state] + transitions_to: [third_state] + finish: + type: final + transitions_from: [third_state] + transitions_to: [finish] diff --git a/vendor/mothership/state_machine/src/Examples/Simple/workflow.png b/vendor/mothership/state_machine/src/Examples/Simple/workflow.png new file mode 100755 index 0000000000000000000000000000000000000000..a8d6c1c6d84bbb9f4a9ade750a565a47787b4e6c GIT binary patch literal 13210 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 literal 0 HcmV?d00001 diff --git a/vendor/mothership/state_machine/src/Exception/StateMachineException.php b/vendor/mothership/state_machine/src/Exception/StateMachineException.php new file mode 100755 index 0000000..6699d15 --- /dev/null +++ b/vendor/mothership/state_machine/src/Exception/StateMachineException.php @@ -0,0 +1,45 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +use Mothership\Exception\ExceptionAbstract; +/** + * Class StateMachineException + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +class StateMachineException extends ExceptionAbstract +{ + +} + diff --git a/vendor/mothership/state_machine/src/Exception/StatusException.php b/vendor/mothership/state_machine/src/Exception/StatusException.php new file mode 100755 index 0000000..005af0a --- /dev/null +++ b/vendor/mothership/state_machine/src/Exception/StatusException.php @@ -0,0 +1,44 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +use Mothership\Exception\ExceptionAbstract; +/** + * Class StatusException + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +class StatusException extends ExceptionAbstract +{ + +} + + diff --git a/vendor/mothership/state_machine/src/Exception/TransitionException.php b/vendor/mothership/state_machine/src/Exception/TransitionException.php new file mode 100755 index 0000000..82d05a8 --- /dev/null +++ b/vendor/mothership/state_machine/src/Exception/TransitionException.php @@ -0,0 +1,43 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +use Mothership\Exception\ExceptionAbstract; +/** + * Class TransitionException + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +class TransitionException extends ExceptionAbstract +{ + +} + diff --git a/vendor/mothership/state_machine/src/Exception/WorkflowException.php b/vendor/mothership/state_machine/src/Exception/WorkflowException.php new file mode 100755 index 0000000..4d06a87 --- /dev/null +++ b/vendor/mothership/state_machine/src/Exception/WorkflowException.php @@ -0,0 +1,43 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +use Mothership\Exception\ExceptionAbstract; +/** + * Class WorkflowException + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +class WorkflowException extends ExceptionAbstract +{ + +} + diff --git a/vendor/mothership/state_machine/src/StateMachine.php b/vendor/mothership/state_machine/src/StateMachine.php new file mode 100644 index 0000000..c299c4d --- /dev/null +++ b/vendor/mothership/state_machine/src/StateMachine.php @@ -0,0 +1,44 @@ + + * @copyright 2016 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +namespace Mothership\StateMachine; + +/** + * Class StateMachine + * + * @category Mothership + * @package Mothership_StateMachine + * @author Don Bosco van Hoi + * @copyright 2016 Mothership GmbH + * @link http://www.mothership.de/ + */ +class StateMachine extends \Mothership\StateMachine\StateMachineAbstract +{ + +} \ No newline at end of file diff --git a/vendor/mothership/state_machine/src/StateMachineAbstract.php b/vendor/mothership/state_machine/src/StateMachineAbstract.php new file mode 100755 index 0000000..6b77983 --- /dev/null +++ b/vendor/mothership/state_machine/src/StateMachineAbstract.php @@ -0,0 +1,218 @@ + + * @author Don Bosco van Hoi + * @copyright Copyright (c) 2016 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +use Mothership\StateMachine\Exception\StateMachineException; +use Mothership\StateMachine\Exception\WorkflowException; +use Symfony\Component\Yaml\Yaml; +/** + * Class StateMachineAbstract + * + * @category Mothership + * @package Mothership_StateMachine + * @author Maurizio Brioschi + * @author Don Bosco van Hoi + * @copyright 2016 Mothership GmbH + * @link http://www.mothership.de/ + */ +abstract class StateMachineAbstract implements StateMachineInterface +{ + /** + * @var null|string + */ + protected $workflow_file; + protected $workflow_array; + protected $workflow; + + /** + * @param string $file + * + * @throws StateMachineException + */ + public function __construct($file = null) + { + $this->workflow_file = $file; + if (!file_exists($this->workflow_file) || is_null($file)) { + throw new StateMachineException("File " . $this->workflow_file . " doesn't exist or null, you + must provide an existing workflow YAML file", + 100, null); + } + //read the file + try { + $this->workflow_array = $this->parseYAML(); + if ($this->workflow_array === false || $this->workflow_array === null) { + throw new StateMachineException("Error parsing " . $this->workflow_file . " file", 98, null); + } + } catch (Symfony\Component\Yaml\Exception\ParseException $ex) { + throw new StateMachineException("Error parsing " . $this->workflow_file . " file", 98, $ex); + } + + $this->initWorkflow(); + } + + /** + * Parse the yaml file + * + * @return array + * + * @throws \Symfony\Component\Yaml\Exception\ParseException + * @throws \Exception + */ + protected function parseYAML() + { + try { + $yaml = Yaml::parse(file_get_contents($this->workflow_file)); + $yaml_fixed = []; + $yaml_fixed['class'] = $yaml['class']; + foreach ($yaml['states'] as $key => $value) { + if ($value['type'] != 'initial') { + $state = ['name' => $key, + 'type' => $value['type'], + 'transitions_from' => $value['transitions_from'], + 'transitions_to' => $value['transitions_to']]; + $yaml_fixed['states'][] = $state; + } else { + $state = ['name' => $key, + 'type' => $value['type']]; + $yaml_fixed['states'][] = $state; + } + } + + return $yaml_fixed; + } catch (Symfony\Component\Yaml\Exception\ParseException $ex) { + throw $ex; + } + } + + /** + * Create the instance of the real workflow + * + * @return void + */ + protected function initWorkflow() + { + try { + $class_name = $this->workflow_array['class']['name']; + $this->workflow = new $class_name($this->workflow_array); + } catch (WorkflowException $ex) { + throw new StateMachineException("Workflow with some problems", 90, $ex); + } + } + + /** + * create a graph for the state machine + * + * @param string $outputPath relative path of the generated image + * @param bool|false $stopAfterExecution if we want to exit after graphic generation + * + * @return void + */ + public function renderGraph($outputPath = './workflow.png', $stopAfterExecution = true) + { + + /** + * This example is based on http://martin-thoma.com/how-to-draw-a-finite-state-machine/ + * Feel free to tweak the rendering output. I have decided do use the most simple + * implementation over the fancy stuff to avoid additional complexity. + */ + $template + = " + digraph finite_state_machine { + rankdir=LR; + size=\"%d\" + + node [shape = doublecircle]; start; + node [shape = circle]; + + %s + } + "; + + $pattern = " %s -> %s [ label = \"%s\" ];"; + + $_transitions = array(); + foreach ($this->workflow_array['states'] as $state) { + if (array_key_exists("transitions_from", $state)) { + $transitions_from = $state['transitions_from']; + foreach ($transitions_from as $from) { + if (is_array($from)) { + $_transitions[] = sprintf($pattern, $from['status'], $state['name'], "<< IF " + . $this->convertToStringCondition($from['result']) . " >>" . $state['name']); + } else { + $_transitions[] = sprintf($pattern, $from, $state['name'], $state['name']); + } + } + } + } + file_put_contents('/tmp/sm.gv', sprintf($template, count($_transitions) * 2, implode("\n", $_transitions))); + shell_exec('dot -Tpng /tmp/sm.gv -o ' . $outputPath); + + if ($stopAfterExecution) { + exit; + } + } + + /** + * Run the state machine with optional arguments + * + * @param array $args + * + * @return mixed + * + * @throws StateMachineException + */ + public function run(array $args = []) + { + try { + return $this->workflow->run($args); + } catch (WorkflowException $ex) { + throw new StateMachineException("Error running State Machine", 100, $ex); + } + } + + /** + * Convert the Condition to string + * + * @param $condition + * + * @return string + */ + private function convertToStringCondition($condition) + { + if (is_bool($condition)) { + if ($condition) { + return "TRUE"; + } else { + return "FALSE"; + } + } + + return (string) $condition; + } +} + diff --git a/vendor/mothership/state_machine/src/StateMachineInterface.php b/vendor/mothership/state_machine/src/StateMachineInterface.php new file mode 100755 index 0000000..6e9b6cc --- /dev/null +++ b/vendor/mothership/state_machine/src/StateMachineInterface.php @@ -0,0 +1,43 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +/** + * Interface StateMachineInterface + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +interface StateMachineInterface +{ + public function run(); +} + diff --git a/vendor/mothership/state_machine/src/Status.php b/vendor/mothership/state_machine/src/Status.php new file mode 100755 index 0000000..434627b --- /dev/null +++ b/vendor/mothership/state_machine/src/Status.php @@ -0,0 +1,260 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +use Mothership\StateMachine\StatusInterface; +use Mothership\StateMachine\Exception\StatusException; +use Mothership\StateMachine\TransitionInterface; +use Mothership\StateMachine\WorkflowInterface; +use Mothership\StateMachine\Transition; +/** + * Class Status + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +class Status implements StatusInterface +{ + + /** + * @var array + */ + protected $properties; + + /** + * @var array + */ + protected $types = [StatusInterface::TYPE_INITIAL, StatusInterface::TYPE_NORMAL, StatusInterface::TYPE_FINAL]; + + /** + * @var + */ + protected $internalState; + + /** + * @var array|mixed + */ + protected $transitions = array(); + + /** + * @var \Mothership\StateMachine\WorkflowInterface + */ + private $workflow; + + /** + * @param \Mothership\StateMachine\WorkflowInterface $workflow + * @param array $properties + * + * @throws StatusException + */ + public function __construct(WorkflowInterface $workflow, array $properties = []) + { + $this->workflow = $workflow; + $this->properties = $properties; + $this->transitions = $this->getTransitions(); + } + + /** + * @return mixed + * + * @throws StatusException + */ + public function getName() + { + if (!$this->has('name')) { + throw new StatusException("Status without a name", 100, null); + } + return $this->properties['name']; + } + + /** + * @return mixed + * + * @throws StatusException + */ + public function getType() + { + if (!$this->has('type')) { + throw new StatusException("Status without a type", 100, null); + } + if (!in_array($this->properties['type'], $this->types)) { + throw new StatusException("The type specified is invalid", 100, null); + } + return $this->properties['type']; + } + + /** + * Get if is an initial state + * + * @return bool + * + * @throws StatusException + */ + protected function isInitialType() + { + return $this->getType() == 'initial'; + } + + /** + * @return mixed + * + * @throws Exception + * @throws StatusException + */ + public function getTransitions() + { + if (count($this->transitions) == 0 && !$this->isInitialType()) { + if (!$this->has('transitions_to')) { + throw new StatusException("Status " . $this->getName() . " without transitions_to property", 80, null); + } + if (!$this->has('transitions_from')) { + throw new StatusException("Status " . $this->getName() . " without transitions_from property", 81, null); + } + + foreach ($this->properties['transitions_from'] as $transition) { + array_push($this->transitions, new Transition($this, $transition)); + } + + if (count($this->transitions) == 0) { + throw new StatusException("Status " . $this->getName() . " has transition_from property not maching the name", + 85, null); + } + } else if ($this->isInitialType()) { + + + $this->transitions = []; + } + return $this->transitions; + } + + /** + * @param $transition_name + * @param \Mothership\StateMachine\StatusInterface $current_status + * + * @return bool + * + * @throws StatusException + * @internal param \Mothership\StateMachine\TransictionInterface $transition + */ + public function execute($transition_name, StatusInterface $current_status) + { + foreach ($this->transitions as $_transition) { + /* @var $_transition Transition */ + + if ($_transition->hasCondition()) { + if ($_transition->getTransitionFrom() == $current_status->getName() && $_transition->getName() == $transition_name && + $this->workflow->getStatus($current_status->getName())->getInternalStatus() == $_transition->getCondition() + ) { + return $_transition->process(); + } + } else { + if ($_transition->getTransitionFrom() == $current_status->getName() && $_transition->getName() == $transition_name) { + return $_transition->process(); + } + } + } + throw new StatusException("STATUS: [" . $transition_name . "] can't run from [" . $current_status->getName() . "]", 30, null); + } + + /** + * @param string $property + * + * @return boolean + */ + public function has($property) + { + return array_key_exists($property, $this->properties); + } + + /** + * @param $property + * @return mixed + * @throws StatusException + */ + public function get($property) + { + if (!$this->has($property)) { + throw new StatusException("Status without a property: " . $property, 90, null); + } + return $this->properties[$property]; + } + + /** + * Returns optional state properties + * + * @return mixed + */ + public function getProperties() + { + return $this->getProperties(); + } + + /** + * @return WorkflowInterface + */ + public function getWorkflow() + { + return $this->workflow; + } + + /** + * Set the internal status, useful if the next step need a condition to be executed + * + * @param $state + * + * @return mixed + */ + public function setInternalStatus($state) + { + $this->internalState = $state; + } + + /** + * Get the internal status + * + * @return mixed + */ + public function getInternalStatus() + { + return $this->internalState; + } + + /** + * @return bool + */ + public function hasInternalState() + { + if (!isset($this->internalState) || !isnull($this->internalState)) { + return true; + } + return false; + } +} + diff --git a/vendor/mothership/state_machine/src/StatusInterface.php b/vendor/mothership/state_machine/src/StatusInterface.php new file mode 100755 index 0000000..949eb49 --- /dev/null +++ b/vendor/mothership/state_machine/src/StatusInterface.php @@ -0,0 +1,113 @@ + + * @author Don Bosco van Hoi + * @copyright Copyright (c) 2016 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +namespace Mothership\StateMachine; + +/** + * Interface StatusInterface + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +interface StatusInterface +{ + // There can only be on state 'initial' + CONST TYPE_INITIAL = 'initial'; + + // There also can only be one state final + CONST TYPE_FINAL = 'final'; + + // All other states must be normal + CONST TYPE_NORMAL = 'normal'; + + /** + * Returns the state name + * + * @return string + */ + public function getName(); + + /** + * Returns the state type + * + * @return string + */ + public function getType(); + + /** + * Returns the available transitions + * + * @return array + */ + public function getTransitions(); + + /** + * Check if a transition can be run from this status + * + * @param string $transition_name + * @param StatusInterface $status_from + * + * @return mixed + */ + public function execute($transition_name, StatusInterface $status_from); + + /** + * @param string $property + * + * @return boolean + */ + public function has($property); + + /** + * @param string $property + * + * @return mixed + */ + public function get($property); + + /** + * Returns optional state properties + * + * @return mixed + */ + public function getProperties(); + + /** + * @return WorkflowInterface + */ + public function getWorkflow(); + + /** + * This is an internal status for the State, valid if the next step need a condition to be executed + * @return mixed + */ + public function setInternalStatus($state); +} diff --git a/vendor/mothership/state_machine/src/Tests/StateMachineTest.php b/vendor/mothership/state_machine/src/Tests/StateMachineTest.php new file mode 100755 index 0000000..50b6fc6 --- /dev/null +++ b/vendor/mothership/state_machine/src/Tests/StateMachineTest.php @@ -0,0 +1,141 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +use \Mothership\Examples\Simple\SimpleStateMachine; +use \Mothership\Examples\IfConditions\IfConditionsStateMachine; +use \Mothership\Examples\BooleanConditions\BooleanConditionsStateMachine; +/** + * Class StateMachineTest + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +class StateMachineTest extends \Mothership\StateMachine\Tests\StateMachineTestCase +{ + protected $state_machine_dir; + + /** + * The yaml file + * + * @var array + */ + protected $yamlfile = []; + + protected $statemachine_test; + + /** + * @dataProvider stateMachineProvider + */ + public function testCreation($dir, $class, $yml) + { + $state_machine = new $class($yml); + $this->isInstanceOf($class, $state_machine); + $this->assertTrue($state_machine->run()); + } + + /** + * @dataProvider stateMachineProvider + */ + public function testRenderGraph($dir, $class, $yml) + { + $path = $dir . 'workflow.png'; + $state_machine = new $class($yml); + $state_machine->renderGraph($path, false); + $this->assertTrue(file_exists($path)); + } + + /** + * + * + * @return array + */ + public function stateMachineProvider() + { + $this->state_machine_dir = $this->getExamplesDir(); + $state_machines = []; + foreach ($this->state_machine_dir as $dir) { + array_push( + $state_machines, + [ + $dir['PATH'], + "Mothership\\StateMachine\\Examples\\" . $dir['NAME'] . "\\" . $dir['NAME'] . "StateMachine", + getcwd() . '/src/Examples/' . $dir['NAME'] . '/Workflow.yml', + ] + ); + array_push($this->yamlfile, getcwd() . '/src/Examples/' . $dir['NAME'] . '/Workflow.yml'); + } + + return $state_machines; + } + + /** + * @dataProvider stateMachineProvider + */ + public function testParseYAML($dir, $class, $yml) + { + $state_machine = new $class($yml); + $yaml_array = $this->invokeMethod($state_machine, 'parseYAML'); + $this->assertArrayHasKey('states', $yaml_array); + $this->assertArrayHasKey('class', $yaml_array); + $this->assertArrayHasKey('args', $yaml_array['class']); + foreach ($yaml_array['states'] as $state) { + $this->assertArrayHasKey('name', $state); + $this->assertArrayHasKey('type', $state); + if ($state['type'] != 'initial') { + $this->assertArrayHasKey('transitions_from', $state); + $this->assertArrayHasKey('transitions_to', $state); + } + } + } + + /** + * @expectedException Mothership\StateMachine\Exception\StateMachineException + */ + public function testMethodNotImplementedException() { + $state_machine_class = "Mothership\\StateMachine\\Examples\\Fail\\FailStateMachine"; + $state_machine = new $state_machine_class(getcwd() . '/tests/Mothership/Examples/Fail/Workflow.yml'); + } + + /** + * @dataProvider stateMachineProvider + */ + public function testInitWorkflow($dir, $class, $yml) + { + $state_machine = new $class($yml, new \Symfony\Component\Console\Output\ConsoleOutput()); + $yaml_array = $this->invokeMethod($state_machine, 'parseYAML'); + $this->invokeMethod($state_machine, "initWorkflow"); + $this->assertEquals($yaml_array['class']['name'], $this->getPropertyClass($state_machine, + "workflow")); + } + +} + diff --git a/vendor/mothership/state_machine/src/Tests/StateMachineTestCase.php b/vendor/mothership/state_machine/src/Tests/StateMachineTestCase.php new file mode 100755 index 0000000..c139383 --- /dev/null +++ b/vendor/mothership/state_machine/src/Tests/StateMachineTestCase.php @@ -0,0 +1,76 @@ + + * @author Don Bosco van Hoi + * @copyright Copyright (c) 2016 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Tests; + +/** + * StateMachineTestCase + * + * @category Mothership + * @package Mothership_StateMachine + * @author Maurizio Brioschi + * @author Don Bosco van Hoi + * @copyright 2016 Mothership GmbH + * @link http://www.mothership.de/ + */ +class StateMachineTestCase extends \PHPUnit_Framework_TestCase +{ + // should be \Mothership\Base\Tests\Trait + use \Mothership\Tests\TraitBase; + + /** + * The directory with all examples + * + * @var string + */ + protected $exampleDir = '/src/Examples'; + + protected $excludeDir = ['Fail']; + + /** + * Return all the directories containing examples + * + * @return array + */ + protected function getExamplesDir() + { + $objects = scandir(getcwd() . $this->exampleDir); + $dir = []; + foreach ($objects as $object) { + if ($object != '.' && $object != '..' && is_dir(getcwd() . '/' . $this->exampleDir . '/' . $object)) { + foreach($this->excludeDir as $exclude) { + if($exclude!=$object) { + array_push($dir, ['PATH' => getcwd() . '/' . $this->exampleDir . '/' . $object . '/', 'NAME' => $object]); + } + } + } + } + return $dir; + } +} \ No newline at end of file diff --git a/vendor/mothership/state_machine/src/Tests/WorkflowTest.php b/vendor/mothership/state_machine/src/Tests/WorkflowTest.php new file mode 100755 index 0000000..5496a19 --- /dev/null +++ b/vendor/mothership/state_machine/src/Tests/WorkflowTest.php @@ -0,0 +1,151 @@ + + * @author Don Bosco van Hoi + * @copyright Copyright (c) 2016 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +namespace Mothership\StateMachine\Tests; + +use Symfony\Component\Yaml\Yaml; + +use Mothership\StateMachine\Examples\Simple\SimpleWorkflow; +use Mothership\StateMachine\Examples\IfConditions\IfConditionsWorkflow; +use Mothership\StateMachine\Examples\Fail\FailStateMachine; +use Mothership\StateMachine\Examples\Fail\FailWorkflow; + +/** + * WorkflowTest + * + * @category Mothership + * @package Mothership_StateMachine + * @author Maurizio Brioschi + * @author Don Bosco van Hoi + * @copyright 2016 Mothership GmbH + * @link http://www.mothership.de/ + */ +class WorkflowTest extends \Mothership\StateMachine\Tests\StateMachineTestCase +{ + /** + * @dataProvider workflowGoodProvider + */ + public function testGoodWorkflow($worklowClass, $arguments) + { + $workflow = new $worklowClass($arguments); + $this->isInstanceOf($worklowClass, $workflow); + /** + * get CurrentStatus + */ + $status = $workflow->getCurrentStatus(); + $this->isInstanceOf('Mothership\StateMachine\StatusInterface', $status); + + /** + * getStatus + */ + $status = $workflow->getStatus('second_state'); + $this->isInstanceOf('Mothership\StateMachine\StatusInterface', $status); + + /** + * run + */ + $this->assertTrue($workflow->run()); + } + + /** + * @dataProvider workflowFailProvider + * @expectedException Mothership\StateMachine\Exception\WorkflowException + */ + public function testExceptionInConstructor($worklowClass, $arguments) + { + $workflow = new $worklowClass($arguments); + } + + /** + * Good provider for instantiate a workflow + * @return array + */ + public function workflowGoodProvider() + { + $this->state_machine_dir = $this->getExamplesDir(); + $workflow = []; + foreach ($this->state_machine_dir as $dir) { + $state_machine_class = "Mothership\\StateMachine\\Examples\\" . $dir['NAME'] . "\\" . $dir['NAME'] . "StateMachine"; + $state_machine = new $state_machine_class($dir['PATH'] . 'Workflow.yml'); + array_push($workflow, [ + "Mothership\\StateMachine\\Examples\\" . $dir['NAME'] . "\\" . $dir['NAME'] . "Workflow", + $this->invokeMethod($state_machine, "parseYAML"), + ]); + } + return $workflow; + } + + /** + * Bad provider for instantiate a workflow + * @return array + */ + public function workflowFailProvider() + { + $workflow = []; + array_push($workflow, [ + "Mothership\\StateMachine\\Examples\\Simple\\SimpleWorkflow", + [] + ]); + array_push($workflow, [ + "Mothership\\StateMachine\\Examples\\Simple\\SimpleWorkflow", + ['arg1' => 1, 'args2' => 2] + ]); + + + return $workflow; + } + + /** + * @expectedException Mothership\StateMachine\Exception\WorkflowException + */ + public function testMethodNotImplementedException() + { + $workflow_class = "Mothership\\StateMachine\\Examples\\Fail\\FailWorkflow"; + $workflow = new $workflow_class([ + 'states' => [ + 'start' => [], + 'second_state' => [], + 'third' => [], + 'final' => [] + ] + ]); + } + + /** + * @dataProvider workflowGoodProvider + */ + public function testVars($worklowClass, $arguments) + { + $workflow = new $worklowClass($arguments); + $vars = $this->getPropertyValue($workflow, "vars"); + $this->assertArrayHasKey('states', $vars); + $this->assertArrayHasKey('class', $vars); + $this->assertArrayHasKey('args', $vars['class']); + } +} \ No newline at end of file diff --git a/vendor/mothership/state_machine/src/Transition.php b/vendor/mothership/state_machine/src/Transition.php new file mode 100755 index 0000000..fc31719 --- /dev/null +++ b/vendor/mothership/state_machine/src/Transition.php @@ -0,0 +1,171 @@ + + * @author Don Bosco van Hoi + * @copyright Copyright (c) 2016 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +use Mothership\StateMachine\Exception\TransitionException; +use Mothership\StateMachine\Exception\WorkflowException; + +/** + * Class Transition + * + * @category Mothership + * @package Mothership_StateMachine + * @author Maurizio Brioschi + * @author Don Bosco van Hoi + * @copyright 2016 Mothership GmbH + * @link http://www.mothership.de/ + */ +class Transition implements TransitionInterface +{ + + protected $name; + protected $status; + protected $transition_from; + protected $hasCondition; + protected $condition; + + /** + * + * + * @param StatusInterface $status + * @param $transition_from + */ + public function __construct(StatusInterface $status, $transition_from) + { + $this->status = $status; + $this->name = $status->getName(); + if (!is_array($transition_from)) { + $this->transiction_from = $transition_from; + $this->hasCondition = false; + $this->condition = null; + } else { + $this->transiction_from = $transition_from['status']; + $this->hasCondition = true; + $this->condition = $transition_from['result']; + } + } + + /** + * Returns the state resulting of this transition + * + * @return StatusInterface + */ + public function getStatus() + { + return $this->status; + } + + /** + * @return mixed + * + * @throws TransitionException + */ + public function process() + { + try { + $method = $this->getMethodToRun(); + + if (method_exists($this->getStatus()->getWorkflow(), '_preDispatch')) { + $methodPre = '_preDispatch'; + $this->getStatus()->getWorkflow()->$methodPre($method); + } + + $result = $this->getStatus()->getWorkflow()->$method(); + + if (method_exists($this->getStatus()->getWorkflow(), '_postDispatch')) { + $methodPre = '_postDispatch'; + $this->getStatus()->getWorkflow()->$methodPre($method); + } + + $this->getStatus()->setInternalStatus($result); + return $this->getStatus(); + } catch (WorkflowException $ex) { + throw new TransitionException("error processing transiction " . $this->getName(), 100, $ex); + } + } + + /** + * Returns the name of the transition + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Get the starting point of the transiction + * + * @return mixed + */ + public function getTransitionFrom() + { + return $this->transiction_from; + } + + /** + * ending point of the transiction + * @return mixed + */ + public function getTransitionTo() + { + return $this->name; + } + + /** + * method that will be execute in the workflow + * @return mixed + */ + public function getMethodToRun() + { + /** + * @todo if we want to have different switch we must parametrize in this point + */ + return $this->name; + } + + /** + * If the transition has a condition to be executed + * @return bool + */ + public function hasCondition() + { + return $this->hasCondition; + } + + /** + * Get the condition to be executed + * @return mixed + */ + public function getCondition() + { + return $this->condition; + } +} + diff --git a/vendor/mothership/state_machine/src/TransitionInterface.php b/vendor/mothership/state_machine/src/TransitionInterface.php new file mode 100755 index 0000000..d8f65ae --- /dev/null +++ b/vendor/mothership/state_machine/src/TransitionInterface.php @@ -0,0 +1,86 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ + +/** + * Interface TransitionInterface + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +interface TransitionInterface +{ + public function __construct(StatusInterface $status, $transition_from); + + /** + * Execute the transiction + * @return mixed + */ + public function process(); + + /** + * Get the starting point of the transiction + * @return mixed + */ + public function getTransitionFrom(); + + /** + * Is the name of the transiction and the name of the new state a + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +use Mothership\StateMachine\Exception\StatusException; +use Mothership\StateMachine\Exception\TransitionException; +use Mothership\StateMachine\Exception\WorkflowException; +use \Symfony\Component\Console\Output\OutputInterface; + +/** + * Class WorkflowAbstract + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +abstract class WorkflowAbstract implements WorkflowInterface +{ + /** + * Usefull variables for the object passed throw workflow configuration file + * + * @var array + */ + protected $vars = []; + /** + * @var mixed[StatusInterface]; + */ + protected $states = []; + /** + * @var \Mothership\StateMachine\StatusInterface + */ + protected $current_status; + + /** + * @var \Symfony\Component\Console\Output\ConsoleOutput + */ + protected $output; + + /** + * Assign all arguments to keys + * + * @param array $args + * + * @throws WorkflowException + */ + public function __construct(array $args = []) + { + foreach ($args as $key => $value) { + $this->vars[$key] = $value; + } + + $this->_init(); + } + + /** + * Return the variables which are set via the $args parameter + * + * @param null|string $key + * + * @return array|null + */ + public function getArgs($key = null) + { + if (null === $key) { + return $this->args; + } + + if (!isset($this->args[$key])) { + return null; + } + + return $this->args[$key]; + } + + /** + * Get the output for the workflow + * + * @return \Symfony\Component\Console\Output\ConsoleOutput + */ + public function getOutput() + { + return $this->outpout; + } + + /** + * @throws WorkflowException + */ + protected function _init() + { + if (!array_key_exists("states", $this->vars)) { + throw new WorkflowException("You must define some states:\n", 99, null); + } + + //check if all the methods for each status is callable + $methods_not_implemented = ""; + try { + foreach ($this->vars['states'] as $status) { + array_push($this->states, new Status($this, $status)); + + /** + * The initial state will never be executed but only the transitions, therefore it will be excluded + * from the list of methods which must be implemented + */ + if (!method_exists($this, $status['name']) && $status['type'] != 'initial') { + $methods_not_implemented .= $status['name'] . "\n"; + } + } + } catch (StatusException $ex) { + throw new WorkflowException("Error in one state of the workflow:\n" . $ex->getMessage(), 79); + } + + + if (strlen($methods_not_implemented) > 0) { + throw new WorkflowException( + "This methods are not implemented in the workflow:\n" . + $methods_not_implemented, 79, null + ); + } + + $this->setInitialState(); + } + + /** + * The initial state must always be 'initial' + * + * @return StatusInterface + * + * @throws WorkflowException + */ + function setInitialState() + { + foreach ($this->states as $status) { + if ($status->getType() == 'initial') { + $this->current_status = $status; + + return $status; + } + } + throw new WorkflowException("No initial state found for the workflow", 90, null); + } + + /** + * @param $transition_name + * + * @return mixed|void + * + * @throws WorkflowException + */ + protected function executeTransition($transition_name) + { + try { + //echo "\ntransit to " . $transition_name; + $status = $this->getStatus($transition_name); + + return $status->execute($transition_name, $this->current_status); + } catch (StatusException $ex) { + if ($ex->getGravity() > 50) { + throw new WorkflowException("Error executing the transition", 100, $ex, null); + } + + return false; + } catch (TransitionException $ex) { + throw new WorkflowException("Error executing the transition", 100, $ex, null); + } + } + + /** + * Return the current status of the workflow + * + * @return \Mothership\StateMachine\StatusInterface $status + */ + function getCurrentStatus() + { + return $this->current_status; + } + + /** + * Set the status of the workflow + * + * @param \Mothership\StateMachine\StatusInterface $status + * + * @return mixed + */ + function setState(StatusInterface $status) + { + $this->current_status = $status; + } + + /** + * Get the status of the workflow by its name + * + * @param $name + * + * @return \Mothership\StateMachine\StatusInterface WorkflowException + * @throws WorkflowException + */ + function getStatus($name) + { + foreach ($this->states as $status) { + if ($status->getName() == $name) { + return $status; + } + } + throw new WorkflowException("No status found with the name " . $name, 70, null); + } + + /** + * execute the workflow + * + * @param mixed $args Optional arguments + * + * @return bool + */ + public function run(array $args = []) + { + $states_count = count($this->states); + for ($i = 1; $i < $states_count; $i++) { + $transitions = $this->states[$i]->getTransitions(); + + /* @var \Mothership\StateMachine\Transition $_transition */ + foreach ($transitions as $_transition) { + try { + $status = $this->executeTransition($_transition->getName()); + if ($status !== false) { + $this->current_status = $status; + $changeStatus = $this->checkIfPreviousTransition($status); + if ($changeStatus !== false) { + $i = $this->getStatusIndex($changeStatus); + break; + } + } + } catch (TransitionException $ex) { + new WorkflowException("Error during workflow->run()", 100, $ex, $this->output); + } catch (WorkflowException $ex) { + new WorkflowException("Error during workflow->run()", 100, $ex, $this->output); + } catch (StateException $ex) { + if ($this->current_status->hasInternalState()) { + $i = 1; + break; + } + } + } + } + + return true; + } + + /** + * Get the position of a state + * + * @param $statusname + * + * @return int + */ + private function getStatusIndex($statusname) + { + $status_count = count($this->states); + for ($i = 0; $i < $status_count; $i++) { + if ($this->states[$i]->getName() == $statusname) { + return $i - 1; + } + } + } + + /** + * Check if there is a previous transition that could be executed from $status + * + * @param \Mothership\StateMachine\StatusInterface $status + * + * @return bool|string false or the name of the status to execute + */ + private function checkIfPreviousTransition(StatusInterface $status) + { + $lastIndex = $this->getStatusIndex($status->getName()); + for ($i = 0; $i < $lastIndex; $i++) { + $transictions = $this->states[$i]->getTransitions(); + foreach ($transictions as $t) { + if ($t->getTransitionFrom() == $status->getName()) { + return $this->states[$i]->getName(); + } + } + } + + return false; + } +} \ No newline at end of file diff --git a/vendor/mothership/state_machine/src/WorkflowInterface.php b/vendor/mothership/state_machine/src/WorkflowInterface.php new file mode 100755 index 0000000..7ba5ac7 --- /dev/null +++ b/vendor/mothership/state_machine/src/WorkflowInterface.php @@ -0,0 +1,73 @@ + + * @copyright Copyright (c) 2015 Mothership GmbH + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * @link http://www.mothership.de/ + */ +use Mothership\StateMachine\TransictionInterface; +/** + * Class WorkflowInterface provide an interface for WorkflowObjects + * + * @category Mothership + * @package Mothership_State_machine + * @author Maurizio Brioschi + * @copyright 2015 Mothership GmbH + * @link http://www.mothership.de/ + */ +interface WorkflowInterface +{ + /** + * Set the inizial state of the workflow + * @return mixed + */ + function setInitialState(); + + /** + * execute the workflow + * @return mixed + */ + function run(); + + /** + * Return the current status of the workflow + * @return \Mothership\StateMachine\StatusInterface $status + */ + function getCurrentStatus(); + + /** + * Set the status of the workflow + * @param \Mothership\StateMachine\StatusInterface $status + * @return mixed + */ + function setState(StatusInterface $status); + + /** + * Get the status of the workflow by its name + * @param $name + * @return mixed + */ + function getStatus($name); +} + diff --git a/vendor/phpdocumentor/reflection-docblock/.gitignore b/vendor/phpdocumentor/reflection-docblock/.gitignore new file mode 100644 index 0000000..3ce5adb --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/.gitignore @@ -0,0 +1,2 @@ +.idea +vendor diff --git a/vendor/phpdocumentor/reflection-docblock/.travis.yml b/vendor/phpdocumentor/reflection-docblock/.travis.yml new file mode 100644 index 0000000..eef782c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/.travis.yml @@ -0,0 +1,32 @@ +language: php +php: + - 5.3.3 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - hhvm + - hhvm-nightly + +matrix: + allow_failures: + - php: hhvm + - php: hhvm-nightly + +script: + - vendor/bin/phpunit + +before_script: + - sudo apt-get -qq update > /dev/null + - phpenv rehash > /dev/null + - composer selfupdate --quiet + - composer install --no-interaction --prefer-source --dev + - vendor/bin/phpunit + - composer update --no-interaction --prefer-source --dev + +notifications: + irc: "irc.freenode.org#phpdocumentor" + email: + - mike.vanriel@naenius.com + - ashnazg@php.net + - boen.robot@gmail.com diff --git a/vendor/phpdocumentor/reflection-docblock/LICENSE b/vendor/phpdocumentor/reflection-docblock/LICENSE new file mode 100644 index 0000000..792e404 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2010 Mike van Riel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/phpdocumentor/reflection-docblock/README.md b/vendor/phpdocumentor/reflection-docblock/README.md new file mode 100644 index 0000000..6405d1a --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/README.md @@ -0,0 +1,57 @@ +The ReflectionDocBlock Component [![Build Status](https://secure.travis-ci.org/phpDocumentor/ReflectionDocBlock.png)](https://travis-ci.org/phpDocumentor/ReflectionDocBlock) +================================ + +Introduction +------------ + +The ReflectionDocBlock component of phpDocumentor provides a DocBlock parser +that is 100% compatible with the [PHPDoc standard](http://phpdoc.org/docs/latest). + +With this component, a library can provide support for annotations via DocBlocks +or otherwise retrieve information that is embedded in a DocBlock. + +> **Note**: *this is a core component of phpDocumentor and is constantly being +> optimized for performance.* + +Installation +------------ + +You can install the component in the following ways: + +* Use the official Github repository (https://github.com/phpDocumentor/ReflectionDocBlock) +* Via Composer (http://packagist.org/packages/phpdocumentor/reflection-docblock) + +Usage +----- + +The ReflectionDocBlock component is designed to work in an identical fashion to +PHP's own Reflection extension (http://php.net/manual/en/book.reflection.php). + +Parsing can be initiated by instantiating the +`\phpDocumentor\Reflection\DocBlock()` class and passing it a string containing +a DocBlock (including asterisks) or by passing an object supporting the +`getDocComment()` method. + +> *Examples of objects having the `getDocComment()` method are the +> `ReflectionClass` and the `ReflectionMethod` classes of the PHP +> Reflection extension* + +Example: + + $class = new ReflectionClass('MyClass'); + $phpdoc = new \phpDocumentor\Reflection\DocBlock($class); + +or + + $docblock = <<=5.3.3" + }, + "autoload": { + "psr-0": {"phpDocumentor": ["src/"]} + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/composer.lock b/vendor/phpdocumentor/reflection-docblock/composer.lock new file mode 100644 index 0000000..4c6a8bb --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/composer.lock @@ -0,0 +1,827 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "ea1734d11b8c878445c2c6e58de8b85f", + "packages": [], + "packages-dev": [ + { + "name": "ocramius/instantiator", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/Instantiator.git", + "reference": "a7abbb5fc9df6e7126af741dd6c140d1a7369435" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/Instantiator/zipball/a7abbb5fc9df6e7126af741dd6c140d1a7369435", + "reference": "a7abbb5fc9df6e7126af741dd6c140d1a7369435", + "shasum": "" + }, + "require": { + "ocramius/lazy-map": "1.0.*", + "php": "~5.3" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "2.0.*@ALPHA" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Instantiator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/Ocramius/Instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2014-08-14 15:10:55" + }, + { + "name": "ocramius/lazy-map", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/LazyMap.git", + "reference": "7fe3d347f5e618bcea7d39345ff83f3651d8b752" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/LazyMap/zipball/7fe3d347f5e618bcea7d39345ff83f3651d8b752", + "reference": "7fe3d347f5e618bcea7d39345ff83f3651d8b752", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "athletic/athletic": "~0.1.6", + "phpmd/phpmd": "1.5.*", + "phpunit/phpunit": ">=3.7", + "satooshi/php-coveralls": "~0.6", + "squizlabs/php_codesniffer": "1.4.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "LazyMap\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/", + "role": "Developer" + } + ], + "description": "A library that provides lazy instantiation logic for a map of objects", + "homepage": "https://github.com/Ocramius/LazyMap", + "keywords": [ + "lazy", + "lazy instantiation", + "lazy loading", + "map", + "service location" + ], + "time": "2013-11-09 22:30:54" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "6d196af48e8c100a3ae881940123e693da5a9217" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6d196af48e8c100a3ae881940123e693da5a9217", + "reference": "6d196af48e8c100a3ae881940123e693da5a9217", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3.1", + "phpunit/php-text-template": "~1.2.0", + "phpunit/php-token-stream": "~1.2.2", + "sebastian/environment": "~1.0.0", + "sebastian/version": "~1.0.3" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4.0.14" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2014-08-06 06:39:42" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.3.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "File/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2013-10-10 15:34:57" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Text/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2014-01-30 17:20:04" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2013-08-02 07:42:54" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ad4e1e23ae01b483c16f600ff1bebec184588e32", + "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2014-03-03 05:10:30" + }, + { + "name": "phpunit/phpunit", + "version": "4.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "a33fa68ece9f8c68589bfc2da8d2794e27b820bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a33fa68ece9f8c68589bfc2da8d2794e27b820bc", + "reference": "a33fa68ece9f8c68589bfc2da8d2794e27b820bc", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpunit/php-code-coverage": "~2.0", + "phpunit/php-file-iterator": "~1.3.1", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "~1.0.2", + "phpunit/phpunit-mock-objects": "~2.2", + "sebastian/comparator": "~1.0", + "sebastian/diff": "~1.1", + "sebastian/environment": "~1.0", + "sebastian/exporter": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "", + "../../symfony/yaml/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2014-08-18 05:12:30" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "42e589e08bc86e3e9bdf20d385e948347788505b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/42e589e08bc86e3e9bdf20d385e948347788505b", + "reference": "42e589e08bc86e3e9bdf20d385e948347788505b", + "shasum": "" + }, + "require": { + "ocramius/instantiator": "~1.0", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "4.2.*@dev" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2014-08-02 13:50:58" + }, + { + "name": "sebastian/comparator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2", + "reference": "f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.1", + "sebastian/exporter": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2014-05-02 07:05:58" + }, + { + "name": "sebastian/diff", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d", + "reference": "1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "http://www.github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2013-08-03 16:46:33" + }, + { + "name": "sebastian/environment", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "79517609ec01139cd7e9fded0dd7ce08c952ef6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/79517609ec01139cd7e9fded0dd7ce08c952ef6a", + "reference": "79517609ec01139cd7e9fded0dd7ce08c952ef6a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "4.0.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2014-02-18 16:17:19" + }, + { + "name": "sebastian/exporter", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529", + "reference": "1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "4.0.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net", + "role": "Lead" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2014-02-16 08:26:31" + }, + { + "name": "sebastian/version", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", + "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2014-03-07 15:35:33" + }, + { + "name": "symfony/yaml", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", + "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2014-08-05 09:00:40" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "platform": { + "php": ">=5.3.3" + }, + "platform-dev": [] +} diff --git a/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist b/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist new file mode 100644 index 0000000..f67ad2a --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist @@ -0,0 +1,14 @@ + + + + + + ./tests/ + + + + + ./src/ + + + diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php new file mode 100644 index 0000000..02968b1 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php @@ -0,0 +1,468 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock\Tag; +use phpDocumentor\Reflection\DocBlock\Context; +use phpDocumentor\Reflection\DocBlock\Location; + +/** + * Parses the DocBlock for any structure. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class DocBlock implements \Reflector +{ + /** @var string The opening line for this docblock. */ + protected $short_description = ''; + + /** + * @var DocBlock\Description The actual + * description for this docblock. + */ + protected $long_description = null; + + /** + * @var Tag[] An array containing all + * the tags in this docblock; except inline. + */ + protected $tags = array(); + + /** @var Context Information about the context of this DocBlock. */ + protected $context = null; + + /** @var Location Information about the location of this DocBlock. */ + protected $location = null; + + /** @var bool Is this DocBlock (the start of) a template? */ + protected $isTemplateStart = false; + + /** @var bool Does this DocBlock signify the end of a DocBlock template? */ + protected $isTemplateEnd = false; + + /** + * Parses the given docblock and populates the member fields. + * + * The constructor may also receive namespace information such as the + * current namespace and aliases. This information is used by some tags + * (e.g. @return, @param, etc.) to turn a relative Type into a FQCN. + * + * @param \Reflector|string $docblock A docblock comment (including + * asterisks) or reflector supporting the getDocComment method. + * @param Context $context The context in which the DocBlock + * occurs. + * @param Location $location The location within the file that this + * DocBlock occurs in. + * + * @throws \InvalidArgumentException if the given argument does not have the + * getDocComment method. + */ + public function __construct( + $docblock, + Context $context = null, + Location $location = null + ) { + if (is_object($docblock)) { + if (!method_exists($docblock, 'getDocComment')) { + throw new \InvalidArgumentException( + 'Invalid object passed; the given reflector must support ' + . 'the getDocComment method' + ); + } + + $docblock = $docblock->getDocComment(); + } + + $docblock = $this->cleanInput($docblock); + + list($templateMarker, $short, $long, $tags) = $this->splitDocBlock($docblock); + $this->isTemplateStart = $templateMarker === '#@+'; + $this->isTemplateEnd = $templateMarker === '#@-'; + $this->short_description = $short; + $this->long_description = new DocBlock\Description($long, $this); + $this->parseTags($tags); + + $this->context = $context; + $this->location = $location; + } + + /** + * Strips the asterisks from the DocBlock comment. + * + * @param string $comment String containing the comment text. + * + * @return string + */ + protected function cleanInput($comment) + { + $comment = trim( + preg_replace( + '#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u', + '$1', + $comment + ) + ); + + // reg ex above is not able to remove */ from a single line docblock + if (substr($comment, -2) == '*/') { + $comment = trim(substr($comment, 0, -2)); + } + + // normalize strings + $comment = str_replace(array("\r\n", "\r"), "\n", $comment); + + return $comment; + } + + /** + * Splits the DocBlock into a template marker, summary, description and block of tags. + * + * @param string $comment Comment to split into the sub-parts. + * + * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. + * @author Mike van Riel for extending the regex with template marker support. + * + * @return string[] containing the template marker (if any), summary, description and a string containing the tags. + */ + protected function splitDocBlock($comment) + { + // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This + // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the + // performance impact of running a regular expression + if (strpos($comment, '@') === 0) { + return array('', '', '', $comment); + } + + // clears all extra horizontal whitespace from the line endings to prevent parsing issues + $comment = preg_replace('/\h*$/Sum', '', $comment); + + /* + * Splits the docblock into a template marker, short description, long description and tags section + * + * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may + * occur after it and will be stripped). + * - The short description is started from the first character until a dot is encountered followed by a + * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing + * errors). This is optional. + * - The long description, any character until a new line is encountered followed by an @ and word + * characters (a tag). This is optional. + * - Tags; the remaining characters + * + * Big thanks to RichardJ for contributing this Regular Expression + */ + preg_match( + '/ + \A + # 1. Extract the template marker + (?:(\#\@\+|\#\@\-)\n?)? + + # 2. Extract the summary + (?: + (?! @\pL ) # The summary may not start with an @ + ( + [^\n.]+ + (?: + (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines + [\n.] (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line + [^\n.]+ # Include anything else + )* + \.? + )? + ) + + # 3. Extract the description + (?: + \s* # Some form of whitespace _must_ precede a description because a summary must be there + (?! @\pL ) # The description may not start with an @ + ( + [^\n]+ + (?: \n+ + (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line + [^\n]+ # Include anything else + )* + ) + )? + + # 4. Extract the tags (anything that follows) + (\s+ [\s\S]*)? # everything that follows + /ux', + $comment, + $matches + ); + array_shift($matches); + + while (count($matches) < 4) { + $matches[] = ''; + } + + return $matches; + } + + /** + * Creates the tag objects. + * + * @param string $tags Tag block to parse. + * + * @return void + */ + protected function parseTags($tags) + { + $result = array(); + $tags = trim($tags); + if ('' !== $tags) { + if ('@' !== $tags[0]) { + throw new \LogicException( + 'A tag block started with text instead of an actual tag,' + . ' this makes the tag block invalid: ' . $tags + ); + } + foreach (explode("\n", $tags) as $tag_line) { + if (isset($tag_line[0]) && ($tag_line[0] === '@')) { + $result[] = $tag_line; + } else { + $result[count($result) - 1] .= "\n" . $tag_line; + } + } + + // create proper Tag objects + foreach ($result as $key => $tag_line) { + $result[$key] = Tag::createInstance(trim($tag_line), $this); + } + } + + $this->tags = $result; + } + + /** + * Gets the text portion of the doc block. + * + * Gets the text portion (short and long description combined) of the doc + * block. + * + * @return string The text portion of the doc block. + */ + public function getText() + { + $short = $this->getShortDescription(); + $long = $this->getLongDescription()->getContents(); + + if ($long) { + return "{$short}\n\n{$long}"; + } else { + return $short; + } + } + + /** + * Set the text portion of the doc block. + * + * Sets the text portion (short and long description combined) of the doc + * block. + * + * @param string $docblock The new text portion of the doc block. + * + * @return $this This doc block. + */ + public function setText($comment) + { + list(,$short, $long) = $this->splitDocBlock($comment); + $this->short_description = $short; + $this->long_description = new DocBlock\Description($long, $this); + return $this; + } + /** + * Returns the opening line or also known as short description. + * + * @return string + */ + public function getShortDescription() + { + return $this->short_description; + } + + /** + * Returns the full description or also known as long description. + * + * @return DocBlock\Description + */ + public function getLongDescription() + { + return $this->long_description; + } + + /** + * Returns whether this DocBlock is the start of a Template section. + * + * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker + * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. + * + * An example of such an opening is: + * + * ``` + * /**#@+ + * * My DocBlock + * * / + * ``` + * + * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all + * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). + * + * @see self::isTemplateEnd() for the check whether a closing marker was provided. + * + * @return boolean + */ + public function isTemplateStart() + { + return $this->isTemplateStart; + } + + /** + * Returns whether this DocBlock is the end of a Template section. + * + * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. + * + * @return boolean + */ + public function isTemplateEnd() + { + return $this->isTemplateEnd; + } + + /** + * Returns the current context. + * + * @return Context + */ + public function getContext() + { + return $this->context; + } + + /** + * Returns the current location. + * + * @return Location + */ + public function getLocation() + { + return $this->location; + } + + /** + * Returns the tags for this DocBlock. + * + * @return Tag[] + */ + public function getTags() + { + return $this->tags; + } + + /** + * Returns an array of tags matching the given name. If no tags are found + * an empty array is returned. + * + * @param string $name String to search by. + * + * @return Tag[] + */ + public function getTagsByName($name) + { + $result = array(); + + /** @var Tag $tag */ + foreach ($this->getTags() as $tag) { + if ($tag->getName() != $name) { + continue; + } + + $result[] = $tag; + } + + return $result; + } + + /** + * Checks if a tag of a certain type is present in this DocBlock. + * + * @param string $name Tag name to check for. + * + * @return bool + */ + public function hasTag($name) + { + /** @var Tag $tag */ + foreach ($this->getTags() as $tag) { + if ($tag->getName() == $name) { + return true; + } + } + + return false; + } + + /** + * Appends a tag at the end of the list of tags. + * + * @param Tag $tag The tag to add. + * + * @return Tag The newly added tag. + * + * @throws \LogicException When the tag belongs to a different DocBlock. + */ + public function appendTag(Tag $tag) + { + if (null === $tag->getDocBlock()) { + $tag->setDocBlock($this); + } + + if ($tag->getDocBlock() === $this) { + $this->tags[] = $tag; + } else { + throw new \LogicException( + 'This tag belongs to a different DocBlock object.' + ); + } + + return $tag; + } + + + /** + * Builds a string representation of this object. + * + * @todo determine the exact format as used by PHP Reflection and + * implement it. + * + * @return string + * @codeCoverageIgnore Not yet implemented + */ + public static function export() + { + throw new \Exception('Not yet implemented'); + } + + /** + * Returns the exported information (we should use the export static method + * BUT this throws an exception at this point). + * + * @return string + * @codeCoverageIgnore Not yet implemented + */ + public function __toString() + { + return 'Not yet implemented'; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php new file mode 100644 index 0000000..81aa83c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php @@ -0,0 +1,154 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +/** + * The context in which a DocBlock occurs. + * + * @author Vasil Rangelov + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Context +{ + /** @var string The current namespace. */ + protected $namespace = ''; + + /** @var array List of namespace aliases => Fully Qualified Namespace. */ + protected $namespace_aliases = array(); + + /** @var string Name of the structural element, within the namespace. */ + protected $lsen = ''; + + /** + * Cteates a new context. + * @param string $namespace The namespace where this DocBlock + * resides in. + * @param array $namespace_aliases List of namespace aliases => Fully + * Qualified Namespace. + * @param string $lsen Name of the structural element, within + * the namespace. + */ + public function __construct( + $namespace = '', + array $namespace_aliases = array(), + $lsen = '' + ) { + if (!empty($namespace)) { + $this->setNamespace($namespace); + } + $this->setNamespaceAliases($namespace_aliases); + $this->setLSEN($lsen); + } + + /** + * @return string The namespace where this DocBlock resides in. + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * @return array List of namespace aliases => Fully Qualified Namespace. + */ + public function getNamespaceAliases() + { + return $this->namespace_aliases; + } + + /** + * Returns the Local Structural Element Name. + * + * @return string Name of the structural element, within the namespace. + */ + public function getLSEN() + { + return $this->lsen; + } + + /** + * Sets a new namespace. + * + * Sets a new namespace for the context. Leading and trailing slashes are + * trimmed, and the keywords "global" and "default" are treated as aliases + * to no namespace. + * + * @param string $namespace The new namespace to set. + * + * @return $this + */ + public function setNamespace($namespace) + { + if ('global' !== $namespace + && 'default' !== $namespace + ) { + // Srip leading and trailing slash + $this->namespace = trim((string)$namespace, '\\'); + } else { + $this->namespace = ''; + } + return $this; + } + + /** + * Sets the namespace aliases, replacing all previous ones. + * + * @param array $namespace_aliases List of namespace aliases => Fully + * Qualified Namespace. + * + * @return $this + */ + public function setNamespaceAliases(array $namespace_aliases) + { + $this->namespace_aliases = array(); + foreach ($namespace_aliases as $alias => $fqnn) { + $this->setNamespaceAlias($alias, $fqnn); + } + return $this; + } + + /** + * Adds a namespace alias to the context. + * + * @param string $alias The alias name (the part after "as", or the last + * part of the Fully Qualified Namespace Name) to add. + * @param string $fqnn The Fully Qualified Namespace Name for this alias. + * Any form of leading/trailing slashes are accepted, but what will be + * stored is a name, prefixed with a slash, and no trailing slash. + * + * @return $this + */ + public function setNamespaceAlias($alias, $fqnn) + { + $this->namespace_aliases[$alias] = '\\' . trim((string)$fqnn, '\\'); + return $this; + } + + /** + * Sets a new Local Structural Element Name. + * + * Sets a new Local Structural Element Name. A local name also contains + * punctuation determining the kind of structural element (e.g. trailing "(" + * and ")" for functions and methods). + * + * @param string $lsen The new local name of a structural element. + * + * @return $this + */ + public function setLSEN($lsen) + { + $this->lsen = (string)$lsen; + return $this; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php new file mode 100644 index 0000000..d41142e --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php @@ -0,0 +1,223 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use phpDocumentor\Reflection\DocBlock; + +/** + * Parses a Description of a DocBlock or tag. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Description implements \Reflector +{ + /** @var string */ + protected $contents = ''; + + /** @var array The contents, as an array of strings and Tag objects. */ + protected $parsedContents = null; + + /** @var DocBlock The DocBlock which this description belongs to. */ + protected $docblock = null; + + /** + * Populates the fields of a description. + * + * @param string $content The description's conetnts. + * @param DocBlock $docblock The DocBlock which this description belongs to. + */ + public function __construct($content, DocBlock $docblock = null) + { + $this->setContent($content)->setDocBlock($docblock); + } + + /** + * Gets the text of this description. + * + * @return string + */ + public function getContents() + { + return $this->contents; + } + + /** + * Sets the text of this description. + * + * @param string $content The new text of this description. + * + * @return $this + */ + public function setContent($content) + { + $this->contents = trim($content); + + $this->parsedContents = null; + return $this; + } + + /** + * Returns the parsed text of this description. + * + * @return array An array of strings and tag objects, in the order they + * occur within the description. + */ + public function getParsedContents() + { + if (null === $this->parsedContents) { + $this->parsedContents = preg_split( + '/\{ + # "{@}" is not a valid inline tag. This ensures that + # we do not treat it as one, but treat it literally. + (?!@\}) + # We want to capture the whole tag line, but without the + # inline tag delimiters. + (\@ + # Match everything up to the next delimiter. + [^{}]* + # Nested inline tag content should not be captured, or + # it will appear in the result separately. + (?: + # Match nested inline tags. + (?: + # Because we did not catch the tag delimiters + # earlier, we must be explicit with them here. + # Notice that this also matches "{}", as a way + # to later introduce it as an escape sequence. + \{(?1)?\} + | + # Make sure we match hanging "{". + \{ + ) + # Match content after the nested inline tag. + [^{}]* + )* # If there are more inline tags, match them as well. + # We use "*" since there may not be any nested inline + # tags. + ) + \}/Sux', + $this->contents, + null, + PREG_SPLIT_DELIM_CAPTURE + ); + + $count = count($this->parsedContents); + for ($i=1; $i<$count; $i += 2) { + $this->parsedContents[$i] = Tag::createInstance( + $this->parsedContents[$i], + $this->docblock + ); + } + + //In order to allow "literal" inline tags, the otherwise invalid + //sequence "{@}" is changed to "@", and "{}" is changed to "}". + //See unit tests for examples. + for ($i=0; $i<$count; $i += 2) { + $this->parsedContents[$i] = str_replace( + array('{@}', '{}'), + array('@', '}'), + $this->parsedContents[$i] + ); + } + } + return $this->parsedContents; + } + + /** + * Return a formatted variant of the Long Description using MarkDown. + * + * @todo this should become a more intelligent piece of code where the + * configuration contains a setting what format long descriptions are. + * + * @codeCoverageIgnore Will be removed soon, in favor of adapters at + * PhpDocumentor itself that will process text in various formats. + * + * @return string + */ + public function getFormattedContents() + { + $result = $this->contents; + + // if the long description contains a plain HTML element, surround + // it with a pre element. Please note that we explicitly used str_replace + // and not preg_replace to gain performance + if (strpos($result, '') !== false) { + $result = str_replace( + array('', "\r\n", "\n", "\r", ''), + array('

', '', '', '', '
'), + $result + ); + } + + if (class_exists('Parsedown')) { + $markdown = \Parsedown::instance(); + $result = $markdown->parse($result); + } elseif (class_exists('dflydev\markdown\MarkdownExtraParser')) { + $markdown = new \dflydev\markdown\MarkdownExtraParser(); + $result = $markdown->transformMarkdown($result); + } + + return trim($result); + } + + /** + * Gets the docblock this tag belongs to. + * + * @return DocBlock The docblock this description belongs to. + */ + public function getDocBlock() + { + return $this->docblock; + } + + /** + * Sets the docblock this tag belongs to. + * + * @param DocBlock $docblock The new docblock this description belongs to. + * Setting NULL removes any association. + * + * @return $this + */ + public function setDocBlock(DocBlock $docblock = null) + { + $this->docblock = $docblock; + + return $this; + } + + /** + * Builds a string representation of this object. + * + * @todo determine the exact format as used by PHP Reflection + * and implement it. + * + * @return void + * @codeCoverageIgnore Not yet implemented + */ + public static function export() + { + throw new \Exception('Not yet implemented'); + } + + /** + * Returns the long description as a string. + * + * @return string + */ + public function __toString() + { + return $this->getContents(); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php new file mode 100644 index 0000000..966ed44 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php @@ -0,0 +1,76 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +/** + * The location a DocBlock occurs within a file. + * + * @author Vasil Rangelov + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Location +{ + /** @var int Line where the DocBlock text starts. */ + protected $lineNumber = 0; + + /** @var int Column where the DocBlock text starts. */ + protected $columnNumber = 0; + + public function __construct( + $lineNumber = 0, + $columnNumber = 0 + ) { + $this->setLineNumber($lineNumber)->setColumnNumber($columnNumber); + } + + /** + * @return int Line where the DocBlock text starts. + */ + public function getLineNumber() + { + return $this->lineNumber; + } + + /** + * + * @param type $lineNumber + * @return $this + */ + public function setLineNumber($lineNumber) + { + $this->lineNumber = (int)$lineNumber; + + return $this; + } + + /** + * @return int Column where the DocBlock text starts. + */ + public function getColumnNumber() + { + return $this->columnNumber; + } + + /** + * + * @param int $columnNumber + * @return $this + */ + public function setColumnNumber($columnNumber) + { + $this->columnNumber = (int)$columnNumber; + + return $this; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php new file mode 100644 index 0000000..c161785 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php @@ -0,0 +1,198 @@ + + * @copyright 2013 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use phpDocumentor\Reflection\DocBlock; + +/** + * Serializes a DocBlock instance. + * + * @author Barry vd. Heuvel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Serializer +{ + + /** @var string The string to indent the comment with. */ + protected $indentString = ' '; + + /** @var int The number of times the indent string is repeated. */ + protected $indent = 0; + + /** @var bool Whether to indent the first line. */ + protected $isFirstLineIndented = true; + + /** @var int|null The max length of a line. */ + protected $lineLength = null; + + /** + * Create a Serializer instance. + * + * @param int $indent The number of times the indent string is + * repeated. + * @param string $indentString The string to indent the comment with. + * @param bool $indentFirstLine Whether to indent the first line. + * @param int|null $lineLength The max length of a line or NULL to + * disable line wrapping. + */ + public function __construct( + $indent = 0, + $indentString = ' ', + $indentFirstLine = true, + $lineLength = null + ) { + $this->setIndentationString($indentString); + $this->setIndent($indent); + $this->setIsFirstLineIndented($indentFirstLine); + $this->setLineLength($lineLength); + } + + /** + * Sets the string to indent comments with. + * + * @param string $indentationString The string to indent comments with. + * + * @return $this This serializer object. + */ + public function setIndentationString($indentString) + { + $this->indentString = (string)$indentString; + return $this; + } + + /** + * Gets the string to indent comments with. + * + * @return string The indent string. + */ + public function getIndentationString() + { + return $this->indentString; + } + + /** + * Sets the number of indents. + * + * @param int $indent The number of times the indent string is repeated. + * + * @return $this This serializer object. + */ + public function setIndent($indent) + { + $this->indent = (int)$indent; + return $this; + } + + /** + * Gets the number of indents. + * + * @return int The number of times the indent string is repeated. + */ + public function getIndent() + { + return $this->indent; + } + + /** + * Sets whether or not the first line should be indented. + * + * Sets whether or not the first line (the one with the "/**") should be + * indented. + * + * @param bool $indentFirstLine The new value for this setting. + * + * @return $this This serializer object. + */ + public function setIsFirstLineIndented($indentFirstLine) + { + $this->isFirstLineIndented = (bool)$indentFirstLine; + return $this; + } + + /** + * Gets whether or not the first line should be indented. + * + * @return bool Whether or not the first line should be indented. + */ + public function isFirstLineIndented() + { + return $this->isFirstLineIndented; + } + + /** + * Sets the line length. + * + * Sets the length of each line in the serialization. Content will be + * wrapped within this limit. + * + * @param int|null $lineLength The length of each line. NULL to disable line + * wrapping altogether. + * + * @return $this This serializer object. + */ + public function setLineLength($lineLength) + { + $this->lineLength = null === $lineLength ? null : (int)$lineLength; + return $this; + } + + /** + * Gets the line length. + * + * @return int|null The length of each line or NULL if line wrapping is + * disabled. + */ + public function getLineLength() + { + return $this->lineLength; + } + + /** + * Generate a DocBlock comment. + * + * @param DocBlock The DocBlock to serialize. + * + * @return string The serialized doc block. + */ + public function getDocComment(DocBlock $docblock) + { + $indent = str_repeat($this->indentString, $this->indent); + $firstIndent = $this->isFirstLineIndented ? $indent : ''; + + $text = $docblock->getText(); + if ($this->lineLength) { + //3 === strlen(' * ') + $wrapLength = $this->lineLength - strlen($indent) - 3; + $text = wordwrap($text, $wrapLength); + } + $text = str_replace("\n", "\n{$indent} * ", $text); + + $comment = "{$firstIndent}/**\n{$indent} * {$text}\n{$indent} *\n"; + + /** @var Tag $tag */ + foreach ($docblock->getTags() as $tag) { + $tagText = (string) $tag; + if ($this->lineLength) { + $tagText = wordwrap($tagText, $wrapLength); + } + $tagText = str_replace("\n", "\n{$indent} * ", $tagText); + + $comment .= "{$indent} * {$tagText}\n"; + } + + $comment .= $indent . ' */'; + + return $comment; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php new file mode 100644 index 0000000..a96db09 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php @@ -0,0 +1,377 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use phpDocumentor\Reflection\DocBlock; + +/** + * Parses a tag definition for a DocBlock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Tag implements \Reflector +{ + /** + * PCRE regular expression matching a tag name. + */ + const REGEX_TAGNAME = '[\w\-\_\\\\]+'; + + /** @var string Name of the tag */ + protected $tag = ''; + + /** + * @var string|null Content of the tag. + * When set to NULL, it means it needs to be regenerated. + */ + protected $content = ''; + + /** @var string Description of the content of this tag */ + protected $description = ''; + + /** + * @var array|null The description, as an array of strings and Tag objects. + * When set to NULL, it means it needs to be regenerated. + */ + protected $parsedDescription = null; + + /** @var Location Location of the tag. */ + protected $location = null; + + /** @var DocBlock The DocBlock which this tag belongs to. */ + protected $docblock = null; + + /** + * @var array An array with a tag as a key, and an FQCN to a class that + * handles it as an array value. The class is expected to inherit this + * class. + */ + private static $tagHandlerMappings = array( + 'author' + => '\phpDocumentor\Reflection\DocBlock\Tag\AuthorTag', + 'covers' + => '\phpDocumentor\Reflection\DocBlock\Tag\CoversTag', + 'deprecated' + => '\phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag', + 'example' + => '\phpDocumentor\Reflection\DocBlock\Tag\ExampleTag', + 'link' + => '\phpDocumentor\Reflection\DocBlock\Tag\LinkTag', + 'method' + => '\phpDocumentor\Reflection\DocBlock\Tag\MethodTag', + 'param' + => '\phpDocumentor\Reflection\DocBlock\Tag\ParamTag', + 'property-read' + => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyReadTag', + 'property' + => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyTag', + 'property-write' + => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyWriteTag', + 'return' + => '\phpDocumentor\Reflection\DocBlock\Tag\ReturnTag', + 'see' + => '\phpDocumentor\Reflection\DocBlock\Tag\SeeTag', + 'since' + => '\phpDocumentor\Reflection\DocBlock\Tag\SinceTag', + 'source' + => '\phpDocumentor\Reflection\DocBlock\Tag\SourceTag', + 'throw' + => '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag', + 'throws' + => '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag', + 'uses' + => '\phpDocumentor\Reflection\DocBlock\Tag\UsesTag', + 'var' + => '\phpDocumentor\Reflection\DocBlock\Tag\VarTag', + 'version' + => '\phpDocumentor\Reflection\DocBlock\Tag\VersionTag' + ); + + /** + * Factory method responsible for instantiating the correct sub type. + * + * @param string $tag_line The text for this tag, including description. + * @param DocBlock $docblock The DocBlock which this tag belongs to. + * @param Location $location Location of the tag. + * + * @throws \InvalidArgumentException if an invalid tag line was presented. + * + * @return static A new tag object. + */ + final public static function createInstance( + $tag_line, + DocBlock $docblock = null, + Location $location = null + ) { + if (!preg_match( + '/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)?/us', + $tag_line, + $matches + )) { + throw new \InvalidArgumentException( + 'Invalid tag_line detected: ' . $tag_line + ); + } + + $handler = __CLASS__; + if (isset(self::$tagHandlerMappings[$matches[1]])) { + $handler = self::$tagHandlerMappings[$matches[1]]; + } elseif (isset($docblock)) { + $tagName = (string)new Type\Collection( + array($matches[1]), + $docblock->getContext() + ); + + if (isset(self::$tagHandlerMappings[$tagName])) { + $handler = self::$tagHandlerMappings[$tagName]; + } + } + + return new $handler( + $matches[1], + isset($matches[2]) ? $matches[2] : '', + $docblock, + $location + ); + } + + /** + * Registers a handler for tags. + * + * Registers a handler for tags. The class specified is autoloaded if it's + * not available. It must inherit from this class. + * + * @param string $tag Name of tag to regiser a handler for. When + * registering a namespaced tag, the full name, along with a prefixing + * slash MUST be provided. + * @param string|null $handler FQCN of handler. Specifing NULL removes the + * handler for the specified tag, if any. + * + * @return bool TRUE on success, FALSE on failure. + */ + final public static function registerTagHandler($tag, $handler) + { + $tag = trim((string)$tag); + + if (null === $handler) { + unset(self::$tagHandlerMappings[$tag]); + return true; + } + + if ('' !== $tag + && class_exists($handler, true) + && is_subclass_of($handler, __CLASS__) + && !strpos($tag, '\\') //Accept no slash, and 1st slash at offset 0. + ) { + self::$tagHandlerMappings[$tag] = $handler; + return true; + } + + return false; + } + + /** + * Parses a tag and populates the member variables. + * + * @param string $name Name of the tag. + * @param string $content The contents of the given tag. + * @param DocBlock $docblock The DocBlock which this tag belongs to. + * @param Location $location Location of the tag. + */ + public function __construct( + $name, + $content, + DocBlock $docblock = null, + Location $location = null + ) { + $this + ->setName($name) + ->setContent($content) + ->setDocBlock($docblock) + ->setLocation($location); + } + + /** + * Gets the name of this tag. + * + * @return string The name of this tag. + */ + public function getName() + { + return $this->tag; + } + + /** + * Sets the name of this tag. + * + * @param string $name The new name of this tag. + * + * @return $this + * @throws \InvalidArgumentException When an invalid tag name is provided. + */ + public function setName($name) + { + if (!preg_match('/^' . self::REGEX_TAGNAME . '$/u', $name)) { + throw new \InvalidArgumentException( + 'Invalid tag name supplied: ' . $name + ); + } + + $this->tag = $name; + + return $this; + } + + /** + * Gets the content of this tag. + * + * @return string + */ + public function getContent() + { + if (null === $this->content) { + $this->content = $this->description; + } + + return $this->content; + } + + /** + * Sets the content of this tag. + * + * @param string $content The new content of this tag. + * + * @return $this + */ + public function setContent($content) + { + $this->setDescription($content); + $this->content = $content; + + return $this; + } + + /** + * Gets the description component of this tag. + * + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Sets the description component of this tag. + * + * @param string $description The new description component of this tag. + * + * @return $this + */ + public function setDescription($description) + { + $this->content = null; + $this->parsedDescription = null; + $this->description = trim($description); + + return $this; + } + + /** + * Gets the parsed text of this description. + * + * @return array An array of strings and tag objects, in the order they + * occur within the description. + */ + public function getParsedDescription() + { + if (null === $this->parsedDescription) { + $description = new Description($this->description, $this->docblock); + $this->parsedDescription = $description->getParsedContents(); + } + return $this->parsedDescription; + } + + /** + * Gets the docblock this tag belongs to. + * + * @return DocBlock The docblock this tag belongs to. + */ + public function getDocBlock() + { + return $this->docblock; + } + + /** + * Sets the docblock this tag belongs to. + * + * @param DocBlock $docblock The new docblock this tag belongs to. Setting + * NULL removes any association. + * + * @return $this + */ + public function setDocBlock(DocBlock $docblock = null) + { + $this->docblock = $docblock; + + return $this; + } + + /** + * Gets the location of the tag. + * + * @return Location The tag's location. + */ + public function getLocation() + { + return $this->location; + } + + /** + * Sets the location of the tag. + * + * @param Location $location The new location of the tag. + * + * @return $this + */ + public function setLocation(Location $location = null) + { + $this->location = $location; + + return $this; + } + + /** + * Builds a string representation of this object. + * + * @todo determine the exact format as used by PHP Reflection and implement it. + * + * @return void + * @codeCoverageIgnore Not yet implemented + */ + public static function export() + { + throw new \Exception('Not yet implemented'); + } + + /** + * Returns the tag as a serialized string + * + * @return string + */ + public function __toString() + { + return "@{$this->getName()} {$this->getContent()}"; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php new file mode 100644 index 0000000..bacf52e --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php @@ -0,0 +1,131 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for an @author tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class AuthorTag extends Tag +{ + /** + * PCRE regular expression matching any valid value for the name component. + */ + const REGEX_AUTHOR_NAME = '[^\<]*'; + + /** + * PCRE regular expression matching any valid value for the email component. + */ + const REGEX_AUTHOR_EMAIL = '[^\>]*'; + + /** @var string The name of the author */ + protected $authorName = ''; + + /** @var string The email of the author */ + protected $authorEmail = ''; + + public function getContent() + { + if (null === $this->content) { + $this->content = $this->authorName; + if ('' != $this->authorEmail) { + $this->content .= "<{$this->authorEmail}>"; + } + } + + return $this->content; + } + + /** + * {@inheritdoc} + */ + public function setContent($content) + { + parent::setContent($content); + if (preg_match( + '/^(' . self::REGEX_AUTHOR_NAME . + ')(\<(' . self::REGEX_AUTHOR_EMAIL . + ')\>)?$/u', + $this->description, + $matches + )) { + $this->authorName = trim($matches[1]); + if (isset($matches[3])) { + $this->authorEmail = trim($matches[3]); + } + } + + return $this; + } + + /** + * Gets the author's name. + * + * @return string The author's name. + */ + public function getAuthorName() + { + return $this->authorName; + } + + /** + * Sets the author's name. + * + * @param string $authorName The new author name. + * An invalid value will set an empty string. + * + * @return $this + */ + public function setAuthorName($authorName) + { + $this->content = null; + $this->authorName + = preg_match('/^' . self::REGEX_AUTHOR_NAME . '$/u', $authorName) + ? $authorName : ''; + + return $this; + } + + /** + * Gets the author's email. + * + * @return string The author's email. + */ + public function getAuthorEmail() + { + return $this->authorEmail; + } + + /** + * Sets the author's email. + * + * @param string $authorEmail The new author email. + * An invalid value will set an empty string. + * + * @return $this + */ + public function setAuthorEmail($authorEmail) + { + $this->authorEmail + = preg_match('/^' . self::REGEX_AUTHOR_EMAIL . '$/u', $authorEmail) + ? $authorEmail : ''; + + $this->content = null; + return $this; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php new file mode 100644 index 0000000..bd31b56 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php @@ -0,0 +1,24 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @covers tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class CoversTag extends SeeTag +{ +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php new file mode 100644 index 0000000..7226316 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php @@ -0,0 +1,26 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag\VersionTag; + +/** + * Reflection class for a @deprecated tag in a Docblock. + * + * @author Vasil Rangelov + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class DeprecatedTag extends VersionTag +{ +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php new file mode 100644 index 0000000..0e163ea --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php @@ -0,0 +1,156 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @example tag in a Docblock. + * + * @author Vasil Rangelov + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ExampleTag extends SourceTag +{ + /** + * @var string Path to a file to use as an example. + * May also be an absolute URI. + */ + protected $filePath = ''; + + /** + * @var bool Whether the file path component represents an URI. + * This determines how the file portion appears at {@link getContent()}. + */ + protected $isURI = false; + + /** + * {@inheritdoc} + */ + public function getContent() + { + if (null === $this->content) { + $filePath = ''; + if ($this->isURI) { + if (false === strpos($this->filePath, ':')) { + $filePath = str_replace( + '%2F', + '/', + rawurlencode($this->filePath) + ); + } else { + $filePath = $this->filePath; + } + } else { + $filePath = '"' . $this->filePath . '"'; + } + + $this->content = $filePath . ' ' . parent::getContent(); + } + + return $this->content; + } + /** + * {@inheritdoc} + */ + public function setContent($content) + { + Tag::setContent($content); + if (preg_match( + '/^ + # File component + (?: + # File path in quotes + \"([^\"]+)\" + | + # File URI + (\S+) + ) + # Remaining content (parsed by SourceTag) + (?:\s+(.*))? + $/sux', + $this->description, + $matches + )) { + if ('' !== $matches[1]) { + $this->setFilePath($matches[1]); + } else { + $this->setFileURI($matches[2]); + } + + if (isset($matches[3])) { + parent::setContent($matches[3]); + } else { + $this->setDescription(''); + } + $this->content = $content; + } + + return $this; + } + + /** + * Returns the file path. + * + * @return string Path to a file to use as an example. + * May also be an absolute URI. + */ + public function getFilePath() + { + return $this->filePath; + } + + /** + * Sets the file path. + * + * @param string $filePath The new file path to use for the example. + * + * @return $this + */ + public function setFilePath($filePath) + { + $this->isURI = false; + $this->filePath = trim($filePath); + + $this->content = null; + return $this; + } + + /** + * Sets the file path as an URI. + * + * This function is equivalent to {@link setFilePath()}, except that it + * convers an URI to a file path before that. + * + * There is no getFileURI(), as {@link getFilePath()} is compatible. + * + * @param type $uri The new file URI to use as an example. + */ + public function setFileURI($uri) + { + $this->isURI = true; + if (false === strpos($uri, ':')) { + //Relative URL + $this->filePath = rawurldecode( + str_replace(array('/', '\\'), '%2F', $uri) + ); + } else { + //Absolute URL or URI. + $this->filePath = $uri; + } + + $this->content = null; + return $this; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php new file mode 100644 index 0000000..f79f25d --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php @@ -0,0 +1,81 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @link tag in a Docblock. + * + * @author Ben Selby + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class LinkTag extends Tag +{ + /** @var string */ + protected $link = ''; + + /** + * {@inheritdoc} + */ + public function getContent() + { + if (null === $this->content) { + $this->content = "{$this->link} {$this->description}"; + } + + return $this->content; + } + + /** + * {@inheritdoc} + */ + public function setContent($content) + { + parent::setContent($content); + $parts = preg_split('/\s+/Su', $this->description, 2); + + $this->link = $parts[0]; + + $this->setDescription(isset($parts[1]) ? $parts[1] : $parts[0]); + + $this->content = $content; + return $this; + } + + /** + * Gets the link + * + * @return string + */ + public function getLink() + { + return $this->link; + } + + /** + * Sets the link + * + * @param string $link The link + * + * @return $this + */ + public function setLink($link) + { + $this->link = $link; + + $this->content = null; + return $this; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php new file mode 100644 index 0000000..7a5ce79 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php @@ -0,0 +1,209 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @method in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class MethodTag extends ReturnTag +{ + + /** @var string */ + protected $method_name = ''; + + /** @var string */ + protected $arguments = ''; + + /** @var bool */ + protected $isStatic = false; + + /** + * {@inheritdoc} + */ + public function getContent() + { + if (null === $this->content) { + $this->content = ''; + if ($this->isStatic) { + $this->content .= 'static '; + } + $this->content .= $this->type . + " {$this->method_name}({$this->arguments}) " . + $this->description; + } + + return $this->content; + } + + /** + * {@inheritdoc} + */ + public function setContent($content) + { + Tag::setContent($content); + // 1. none or more whitespace + // 2. optionally the keyword "static" followed by whitespace + // 3. optionally a word with underscores followed by whitespace : as + // type for the return value + // 4. then optionally a word with underscores followed by () and + // whitespace : as method name as used by phpDocumentor + // 5. then a word with underscores, followed by ( and any character + // until a ) and whitespace : as method name with signature + // 6. any remaining text : as description + if (preg_match( + '/^ + # Static keyword + # Declates a static method ONLY if type is also present + (?: + (static) + \s+ + )? + # Return type + (?: + ([\w\|_\\\\]+) + \s+ + )? + # Legacy method name (not captured) + (?: + [\w_]+\(\)\s+ + )? + # Method name + ([\w\|_\\\\]+) + # Arguments + \(([^\)]*)\) + \s* + # Description + (.*) + $/sux', + $this->description, + $matches + )) { + list( + , + $static, + $this->type, + $this->method_name, + $this->arguments, + $this->description + ) = $matches; + if ($static) { + if (!$this->type) { + $this->type = 'static'; + } else { + $this->isStatic = true; + } + } else { + if (!$this->type) { + $this->type = 'void'; + } + } + $this->parsedDescription = null; + } + + return $this; + } + + /** + * Sets the name of this method. + * + * @param string $method_name The name of the method. + * + * @return $this + */ + public function setMethodName($method_name) + { + $this->method_name = $method_name; + + $this->content = null; + return $this; + } + + /** + * Retrieves the method name. + * + * @return string + */ + public function getMethodName() + { + return $this->method_name; + } + + /** + * Sets the arguments for this method. + * + * @param string $arguments A comma-separated arguments line. + * + * @return void + */ + public function setArguments($arguments) + { + $this->arguments = $arguments; + + $this->content = null; + return $this; + } + + /** + * Returns an array containing each argument as array of type and name. + * + * Please note that the argument sub-array may only contain 1 element if no + * type was specified. + * + * @return string[] + */ + public function getArguments() + { + if (empty($this->arguments)) { + return array(); + } + + $arguments = explode(',', $this->arguments); + foreach ($arguments as $key => $value) { + $arguments[$key] = explode(' ', trim($value)); + } + + return $arguments; + } + + /** + * Checks whether the method tag describes a static method or not. + * + * @return bool TRUE if the method declaration is for a static method, FALSE + * otherwise. + */ + public function isStatic() + { + return $this->isStatic; + } + + /** + * Sets a new value for whether the method is static or not. + * + * @param bool $isStatic The new value to set. + * + * @return $this + */ + public function setIsStatic($isStatic) + { + $this->isStatic = $isStatic; + + $this->content = null; + return $this; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php new file mode 100644 index 0000000..9bc0270 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php @@ -0,0 +1,119 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @param tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ParamTag extends ReturnTag +{ + /** @var string */ + protected $variableName = ''; + + /** @var bool determines whether this is a variadic argument */ + protected $isVariadic = false; + + /** + * {@inheritdoc} + */ + public function getContent() + { + if (null === $this->content) { + $this->content + = "{$this->type} {$this->variableName} {$this->description}"; + } + return $this->content; + } + /** + * {@inheritdoc} + */ + public function setContent($content) + { + Tag::setContent($content); + $parts = preg_split( + '/(\s+)/Su', + $this->description, + 3, + PREG_SPLIT_DELIM_CAPTURE + ); + + // if the first item that is encountered is not a variable; it is a type + if (isset($parts[0]) + && (strlen($parts[0]) > 0) + && ($parts[0][0] !== '$') + ) { + $this->type = array_shift($parts); + array_shift($parts); + } + + // if the next item starts with a $ or ...$ it must be the variable name + if (isset($parts[0]) + && (strlen($parts[0]) > 0) + && ($parts[0][0] == '$' || substr($parts[0], 0, 4) === '...$') + ) { + $this->variableName = array_shift($parts); + array_shift($parts); + + if (substr($this->variableName, 0, 3) === '...') { + $this->isVariadic = true; + $this->variableName = substr($this->variableName, 3); + } + } + + $this->setDescription(implode('', $parts)); + + $this->content = $content; + return $this; + } + + /** + * Returns the variable's name. + * + * @return string + */ + public function getVariableName() + { + return $this->variableName; + } + + /** + * Sets the variable's name. + * + * @param string $name The new name for this variable. + * + * @return $this + */ + public function setVariableName($name) + { + $this->variableName = $name; + + $this->content = null; + return $this; + } + + /** + * Returns whether this tag is variadic. + * + * @return boolean + */ + public function isVariadic() + { + return $this->isVariadic; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php new file mode 100644 index 0000000..3340602 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php @@ -0,0 +1,24 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @property-read tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class PropertyReadTag extends PropertyTag +{ +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php new file mode 100644 index 0000000..288ecff --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php @@ -0,0 +1,24 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @property tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class PropertyTag extends ParamTag +{ +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php new file mode 100644 index 0000000..ec4e866 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php @@ -0,0 +1,24 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @property-write tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class PropertyWriteTag extends PropertyTag +{ +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php new file mode 100644 index 0000000..9293db9 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php @@ -0,0 +1,99 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag; +use phpDocumentor\Reflection\DocBlock\Type\Collection; + +/** + * Reflection class for a @return tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ReturnTag extends Tag +{ + /** @var string The raw type component. */ + protected $type = ''; + + /** @var Collection The parsed type component. */ + protected $types = null; + + /** + * {@inheritdoc} + */ + public function getContent() + { + if (null === $this->content) { + $this->content = "{$this->type} {$this->description}"; + } + + return $this->content; + } + + /** + * {@inheritdoc} + */ + public function setContent($content) + { + parent::setContent($content); + + $parts = preg_split('/\s+/Su', $this->description, 2); + + // any output is considered a type + $this->type = $parts[0]; + $this->types = null; + + $this->setDescription(isset($parts[1]) ? $parts[1] : ''); + + $this->content = $content; + return $this; + } + + /** + * Returns the unique types of the variable. + * + * @return string[] + */ + public function getTypes() + { + return $this->getTypesCollection()->getArrayCopy(); + } + + /** + * Returns the type section of the variable. + * + * @return string + */ + public function getType() + { + return (string) $this->getTypesCollection(); + } + + /** + * Returns the type collection. + * + * @return void + */ + protected function getTypesCollection() + { + if (null === $this->types) { + $this->types = new Collection( + array($this->type), + $this->docblock ? $this->docblock->getContext() : null + ); + } + return $this->types; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php new file mode 100644 index 0000000..4f5f22c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php @@ -0,0 +1,81 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @see tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class SeeTag extends Tag +{ + /** @var string */ + protected $refers = null; + + /** + * {@inheritdoc} + */ + public function getContent() + { + if (null === $this->content) { + $this->content = "{$this->refers} {$this->description}"; + } + return $this->content; + } + + /** + * {@inheritdoc} + */ + public function setContent($content) + { + parent::setContent($content); + $parts = preg_split('/\s+/Su', $this->description, 2); + + // any output is considered a type + $this->refers = $parts[0]; + + $this->setDescription(isset($parts[1]) ? $parts[1] : ''); + + $this->content = $content; + return $this; + } + + /** + * Gets the structural element this tag refers to. + * + * @return string + */ + public function getReference() + { + return $this->refers; + } + + /** + * Sets the structural element this tag refers to. + * + * @param string $refers The new type this tag refers to. + * + * @return $this + */ + public function setReference($refers) + { + $this->refers = $refers; + + $this->content = null; + return $this; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php new file mode 100644 index 0000000..ba009c4 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php @@ -0,0 +1,26 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag\VersionTag; + +/** + * Reflection class for a @since tag in a Docblock. + * + * @author Vasil Rangelov + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class SinceTag extends VersionTag +{ +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php new file mode 100644 index 0000000..3400220 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php @@ -0,0 +1,137 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @source tag in a Docblock. + * + * @author Vasil Rangelov + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class SourceTag extends Tag +{ + /** + * @var int The starting line, relative to the structural element's + * location. + */ + protected $startingLine = 1; + + /** + * @var int|null The number of lines, relative to the starting line. NULL + * means "to the end". + */ + protected $lineCount = null; + + /** + * {@inheritdoc} + */ + public function getContent() + { + if (null === $this->content) { + $this->content + = "{$this->startingLine} {$this->lineCount} {$this->description}"; + } + + return $this->content; + } + + /** + * {@inheritdoc} + */ + public function setContent($content) + { + parent::setContent($content); + if (preg_match( + '/^ + # Starting line + ([1-9]\d*) + \s* + # Number of lines + (?: + ((?1)) + \s+ + )? + # Description + (.*) + $/sux', + $this->description, + $matches + )) { + $this->startingLine = (int)$matches[1]; + if (isset($matches[2]) && '' !== $matches[2]) { + $this->lineCount = (int)$matches[2]; + } + $this->setDescription($matches[3]); + $this->content = $content; + } + + return $this; + } + + /** + * Gets the starting line. + * + * @return int The starting line, relative to the structural element's + * location. + */ + public function getStartingLine() + { + return $this->startingLine; + } + + /** + * Sets the starting line. + * + * @param int $startingLine The new starting line, relative to the + * structural element's location. + * + * @return $this + */ + public function setStartingLine($startingLine) + { + $this->startingLine = $startingLine; + + $this->content = null; + return $this; + } + + /** + * Returns the number of lines. + * + * @return int|null The number of lines, relative to the starting line. NULL + * means "to the end". + */ + public function getLineCount() + { + return $this->lineCount; + } + + /** + * Sets the number of lines. + * + * @param int|null $lineCount The new number of lines, relative to the + * starting line. NULL means "to the end". + * + * @return $this + */ + public function setLineCount($lineCount) + { + $this->lineCount = $lineCount; + + $this->content = null; + return $this; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php new file mode 100644 index 0000000..58ee44a --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php @@ -0,0 +1,24 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @throws tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ThrowsTag extends ReturnTag +{ +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php new file mode 100644 index 0000000..da0d663 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php @@ -0,0 +1,24 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @uses tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class UsesTag extends SeeTag +{ +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php new file mode 100644 index 0000000..236b2c8 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php @@ -0,0 +1,24 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @var tag in a Docblock. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class VarTag extends ParamTag +{ +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php new file mode 100644 index 0000000..260f698 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php @@ -0,0 +1,108 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +use phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a @version tag in a Docblock. + * + * @author Vasil Rangelov + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class VersionTag extends Tag +{ + /** + * PCRE regular expression matching a version vector. + * Assumes the "x" modifier. + */ + const REGEX_VECTOR = '(?: + # Normal release vectors. + \d\S* + | + # VCS version vectors. Per PHPCS, they are expected to + # follow the form of the VCS name, followed by ":", followed + # by the version vector itself. + # By convention, popular VCSes like CVS, SVN and GIT use "$" + # around the actual version vector. + [^\s\:]+\:\s*\$[^\$]+\$ + )'; + + /** @var string The version vector. */ + protected $version = ''; + + public function getContent() + { + if (null === $this->content) { + $this->content = "{$this->version} {$this->description}"; + } + + return $this->content; + } + + /** + * {@inheritdoc} + */ + public function setContent($content) + { + parent::setContent($content); + + if (preg_match( + '/^ + # The version vector + (' . self::REGEX_VECTOR . ') + \s* + # The description + (.+)? + $/sux', + $this->description, + $matches + )) { + $this->version = $matches[1]; + $this->setDescription(isset($matches[2]) ? $matches[2] : ''); + $this->content = $content; + } + + return $this; + } + + /** + * Gets the version section of the tag. + * + * @return string The version section of the tag. + */ + public function getVersion() + { + return $this->version; + } + + /** + * Sets the version section of the tag. + * + * @param string $version The new version section of the tag. + * An invalid value will set an empty string. + * + * @return $this + */ + public function setVersion($version) + { + $this->version + = preg_match('/^' . self::REGEX_VECTOR . '$/ux', $version) + ? $version + : ''; + + $this->content = null; + return $this; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php new file mode 100644 index 0000000..90ead3f --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php @@ -0,0 +1,221 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Type; + +use phpDocumentor\Reflection\DocBlock\Context; + +/** + * Collection + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Collection extends \ArrayObject +{ + /** @var string Definition of the OR operator for types */ + const OPERATOR_OR = '|'; + + /** @var string Definition of the ARRAY operator for types */ + const OPERATOR_ARRAY = '[]'; + + /** @var string Definition of the NAMESPACE operator in PHP */ + const OPERATOR_NAMESPACE = '\\'; + + /** @var string[] List of recognized keywords */ + protected static $keywords = array( + 'string', 'int', 'integer', 'bool', 'boolean', 'float', 'double', + 'object', 'mixed', 'array', 'resource', 'void', 'null', 'scalar', + 'callback', 'callable', 'false', 'true', 'self', '$this', 'static' + ); + + /** + * Current invoking location. + * + * This is used to prepend to type with a relative location. + * May also be 'default' or 'global', in which case they are ignored. + * + * @var Context + */ + protected $context = null; + + /** + * Registers the namespace and aliases; uses that to add and expand the + * given types. + * + * @param string[] $types Array containing a list of types to add to this + * container. + * @param Context $location The current invoking location. + */ + public function __construct( + array $types = array(), + Context $context = null + ) { + $this->context = null === $context ? new Context() : $context; + + foreach ($types as $type) { + $this->add($type); + } + } + + /** + * Returns the current invoking location. + * + * @return Context + */ + public function getContext() + { + return $this->context; + } + + /** + * Adds a new type to the collection and expands it if it contains a + * relative namespace. + * + * If a class in the type contains a relative namespace than this collection + * will try to expand that into a FQCN. + * + * @param string $type A 'Type' as defined in the phpDocumentor + * documentation. + * + * @throws \InvalidArgumentException if a non-string argument is passed. + * + * @see http://phpdoc.org/docs/latest/for-users/types.html for the + * definition of a type. + * + * @return void + */ + public function add($type) + { + if (!is_string($type)) { + throw new \InvalidArgumentException( + 'A type should be represented by a string, received: ' + .var_export($type, true) + ); + } + + // separate the type by the OR operator + $type_parts = explode(self::OPERATOR_OR, $type); + foreach ($type_parts as $part) { + $expanded_type = $this->expand($part); + if ($expanded_type) { + $this[] = $expanded_type; + } + } + } + + /** + * Returns a string representation of the collection. + * + * @return string The resolved types across the collection, separated with + * {@link self::OPERATOR_OR}. + */ + public function __toString() + { + return implode(self::OPERATOR_OR, $this->getArrayCopy()); + } + + /** + * Analyzes the given type and returns the FQCN variant. + * + * When a type is provided this method checks whether it is not a keyword or + * Fully Qualified Class Name. If so it will use the given namespace and + * aliases to expand the type to a FQCN representation. + * + * This method only works as expected if the namespace and aliases are set; + * no dynamic reflection is being performed here. + * + * @param string $type The relative or absolute type. + * + * @uses getNamespace to determine with what to prefix the type name. + * @uses getNamespaceAliases to check whether the first part of the relative + * type name should not be replaced with another namespace. + * + * @return string + */ + protected function expand($type) + { + $type = trim($type); + if (!$type) { + return ''; + } + + if ($this->isTypeAnArray($type)) { + return $this->expand(substr($type, 0, -2)) . self::OPERATOR_ARRAY; + } + + if ($this->isRelativeType($type) && !$this->isTypeAKeyword($type)) { + $type_parts = explode(self::OPERATOR_NAMESPACE, $type, 2); + + $namespace_aliases = $this->context->getNamespaceAliases(); + // if the first segment is not an alias; prepend namespace name and + // return + if (!isset($namespace_aliases[$type_parts[0]])) { + $namespace = $this->context->getNamespace(); + if ('' !== $namespace) { + $namespace .= self::OPERATOR_NAMESPACE; + } + return self::OPERATOR_NAMESPACE . $namespace . $type; + } + + $type_parts[0] = $namespace_aliases[$type_parts[0]]; + $type = implode(self::OPERATOR_NAMESPACE, $type_parts); + } + + return $type; + } + + /** + * Detects whether the given type represents an array. + * + * @param string $type A relative or absolute type as defined in the + * phpDocumentor documentation. + * + * @return bool + */ + protected function isTypeAnArray($type) + { + return substr($type, -2) === self::OPERATOR_ARRAY; + } + + /** + * Detects whether the given type represents a PHPDoc keyword. + * + * @param string $type A relative or absolute type as defined in the + * phpDocumentor documentation. + * + * @return bool + */ + protected function isTypeAKeyword($type) + { + return in_array(strtolower($type), static::$keywords, true); + } + + /** + * Detects whether the given type represents a relative or absolute path. + * + * This method will detect keywords as being absolute; even though they are + * not preceeded by a namespace separator. + * + * @param string $type A relative or absolute type as defined in the + * phpDocumentor documentation. + * + * @return bool + */ + protected function isRelativeType($type) + { + return ($type[0] !== self::OPERATOR_NAMESPACE) + || $this->isTypeAKeyword($type); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php new file mode 100644 index 0000000..a6ca7b3 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php @@ -0,0 +1,245 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Description + * + * @author Vasil Rangelov + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class DescriptionTest extends \PHPUnit_Framework_TestCase +{ + public function testConstruct() + { + $fixture = <<assertSame($fixture, $object->getContents()); + + $parsedContents = $object->getParsedContents(); + $this->assertCount(1, $parsedContents); + $this->assertSame($fixture, $parsedContents[0]); + } + + public function testInlineTagParsing() + { + $fixture = <<assertSame($fixture, $object->getContents()); + + $parsedContents = $object->getParsedContents(); + $this->assertCount(3, $parsedContents); + $this->assertSame('This is text for a ', $parsedContents[0]); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag\LinkTag', + $parsedContents[1] + ); + $this->assertSame( + ' that uses inline +tags.', + $parsedContents[2] + ); + } + + public function testInlineTagAtStartParsing() + { + $fixture = <<assertSame($fixture, $object->getContents()); + + $parsedContents = $object->getParsedContents(); + $this->assertCount(3, $parsedContents); + + $this->assertSame('', $parsedContents[0]); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag\LinkTag', + $parsedContents[1] + ); + $this->assertSame( + ' is text for a description that uses inline +tags.', + $parsedContents[2] + ); + } + + public function testNestedInlineTagParsing() + { + $fixture = <<assertSame($fixture, $object->getContents()); + + $parsedContents = $object->getParsedContents(); + $this->assertCount(3, $parsedContents); + + $this->assertSame( + 'This is text for a description with ', + $parsedContents[0] + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $parsedContents[1] + ); + $this->assertSame('.', $parsedContents[2]); + + $parsedDescription = $parsedContents[1]->getParsedDescription(); + $this->assertCount(3, $parsedDescription); + $this->assertSame("inline tag with\n", $parsedDescription[0]); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag\LinkTag', + $parsedDescription[1] + ); + $this->assertSame(' in it', $parsedDescription[2]); + } + + public function testLiteralOpeningDelimiter() + { + $fixture = <<assertSame($fixture, $object->getContents()); + + $parsedContents = $object->getParsedContents(); + $this->assertCount(1, $parsedContents); + $this->assertSame($fixture, $parsedContents[0]); + } + + public function testNestedLiteralOpeningDelimiter() + { + $fixture = <<assertSame($fixture, $object->getContents()); + + $parsedContents = $object->getParsedContents(); + $this->assertCount(3, $parsedContents); + $this->assertSame( + 'This is text for a description containing ', + $parsedContents[0] + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $parsedContents[1] + ); + $this->assertSame('.', $parsedContents[2]); + + $this->assertSame( + array('inline tag that has { that +is literal'), + $parsedContents[1]->getParsedDescription() + ); + } + + public function testLiteralClosingDelimiter() + { + $fixture = <<assertSame($fixture, $object->getContents()); + + $parsedContents = $object->getParsedContents(); + $this->assertCount(1, $parsedContents); + $this->assertSame( + 'This is text for a description with } that is not a tag.', + $parsedContents[0] + ); + } + + public function testNestedLiteralClosingDelimiter() + { + $fixture = <<assertSame($fixture, $object->getContents()); + + $parsedContents = $object->getParsedContents(); + $this->assertCount(3, $parsedContents); + $this->assertSame( + 'This is text for a description with ', + $parsedContents[0] + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $parsedContents[1] + ); + $this->assertSame('.', $parsedContents[2]); + + $this->assertSame( + array('inline tag with } that is not an +inline tag'), + $parsedContents[1]->getParsedDescription() + ); + } + + public function testInlineTagEscapingSequence() + { + $fixture = <<assertSame($fixture, $object->getContents()); + + $parsedContents = $object->getParsedContents(); + $this->assertCount(1, $parsedContents); + $this->assertSame( + 'This is text for a description with literal {@link}.', + $parsedContents[0] + ); + } + + public function testNestedInlineTagEscapingSequence() + { + $fixture = <<assertSame($fixture, $object->getContents()); + + $parsedContents = $object->getParsedContents(); + $this->assertCount(3, $parsedContents); + $this->assertSame( + 'This is text for a description with an ', + $parsedContents[0] + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $parsedContents[1] + ); + $this->assertSame('.', $parsedContents[2]); + + $this->assertSame( + array('inline tag with literal +{@link} in it'), + $parsedContents[1]->getParsedDescription() + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php new file mode 100644 index 0000000..ff257aa --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php @@ -0,0 +1,86 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\CoversTag + * + * @author Daniel O'Connor + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class CoversTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\CoversTag can create + * a link for the covers doc block. + * + * @param string $type + * @param string $content + * @param string $exContent + * @param string $exReference + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\CoversTag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exContent, + $exDescription, + $exReference + ) { + $tag = new CoversTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($exContent, $tag->getContent()); + $this->assertEquals($exDescription, $tag->getDescription()); + $this->assertEquals($exReference, $tag->getReference()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, $content, $exContent, $exDescription, $exReference + return array( + array( + 'covers', + 'Foo::bar()', + 'Foo::bar()', + '', + 'Foo::bar()' + ), + array( + 'covers', + 'Foo::bar() Testing', + 'Foo::bar() Testing', + 'Testing', + 'Foo::bar()', + ), + array( + 'covers', + 'Foo::bar() Testing comments', + 'Foo::bar() Testing comments', + 'Testing comments', + 'Foo::bar()', + ), + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php new file mode 100644 index 0000000..7a75e79 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php @@ -0,0 +1,115 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag + * + * @author Vasil Rangelov + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class DeprecatedTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create + * a link for the @deprecated doc block. + * + * @param string $type + * @param string $content + * @param string $exContent + * @param string $exDescription + * @param string $exVersion + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exContent, + $exDescription, + $exVersion + ) { + $tag = new DeprecatedTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($exContent, $tag->getContent()); + $this->assertEquals($exDescription, $tag->getDescription()); + $this->assertEquals($exVersion, $tag->getVersion()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, $content, $exContent, $exDescription, $exVersion + return array( + array( + 'deprecated', + '1.0 First release.', + '1.0 First release.', + 'First release.', + '1.0' + ), + array( + 'deprecated', + "1.0\nFirst release.", + "1.0\nFirst release.", + 'First release.', + '1.0' + ), + array( + 'deprecated', + "1.0\nFirst\nrelease.", + "1.0\nFirst\nrelease.", + "First\nrelease.", + '1.0' + ), + array( + 'deprecated', + 'Unfinished release', + 'Unfinished release', + 'Unfinished release', + '' + ), + array( + 'deprecated', + '1.0', + '1.0', + '', + '1.0' + ), + array( + 'deprecated', + 'GIT: $Id$', + 'GIT: $Id$', + '', + 'GIT: $Id$' + ), + array( + 'deprecated', + 'GIT: $Id$ Dev build', + 'GIT: $Id$ Dev build', + 'Dev build', + 'GIT: $Id$' + ) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php new file mode 100644 index 0000000..519a61b --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php @@ -0,0 +1,203 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\ExampleTag + * + * @author Vasil Rangelov + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ExampleTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\SourceTag can + * understand the @source DocBlock. + * + * @param string $type + * @param string $content + * @param string $exContent + * @param string $exStartingLine + * @param string $exLineCount + * @param string $exFilepath + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\ExampleTag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exContent, + $exDescription, + $exStartingLine, + $exLineCount, + $exFilePath + ) { + $tag = new ExampleTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($exContent, $tag->getContent()); + $this->assertEquals($exDescription, $tag->getDescription()); + $this->assertEquals($exStartingLine, $tag->getStartingLine()); + $this->assertEquals($exLineCount, $tag->getLineCount()); + $this->assertEquals($exFilePath, $tag->getFilePath()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, + // $content, + // $exContent, + // $exDescription, + // $exStartingLine, + // $exLineCount, + // $exFilePath + return array( + array( + 'example', + 'file.php', + 'file.php', + '', + 1, + null, + 'file.php' + ), + array( + 'example', + 'Testing comments', + 'Testing comments', + 'comments', + 1, + null, + 'Testing' + ), + array( + 'example', + 'file.php 2 Testing', + 'file.php 2 Testing', + 'Testing', + 2, + null, + 'file.php' + ), + array( + 'example', + 'file.php 2 3 Testing comments', + 'file.php 2 3 Testing comments', + 'Testing comments', + 2, + 3, + 'file.php' + ), + array( + 'example', + 'file.php 2 -1 Testing comments', + 'file.php 2 -1 Testing comments', + '-1 Testing comments', + 2, + null, + 'file.php' + ), + array( + 'example', + 'file.php -1 1 Testing comments', + 'file.php -1 1 Testing comments', + '-1 1 Testing comments', + 1, + null, + 'file.php' + ), + array( + 'example', + '"file with spaces.php" Testing comments', + '"file with spaces.php" Testing comments', + 'Testing comments', + 1, + null, + 'file with spaces.php' + ), + array( + 'example', + '"file with spaces.php" 2 Testing comments', + '"file with spaces.php" 2 Testing comments', + 'Testing comments', + 2, + null, + 'file with spaces.php' + ), + array( + 'example', + '"file with spaces.php" 2 3 Testing comments', + '"file with spaces.php" 2 3 Testing comments', + 'Testing comments', + 2, + 3, + 'file with spaces.php' + ), + array( + 'example', + '"file with spaces.php" 2 -3 Testing comments', + '"file with spaces.php" 2 -3 Testing comments', + '-3 Testing comments', + 2, + null, + 'file with spaces.php' + ), + array( + 'example', + '"file with spaces.php" -2 3 Testing comments', + '"file with spaces.php" -2 3 Testing comments', + '-2 3 Testing comments', + 1, + null, + 'file with spaces.php' + ), + array( + 'example', + 'file%20with%20spaces.php Testing comments', + 'file%20with%20spaces.php Testing comments', + 'Testing comments', + 1, + null, + 'file with spaces.php' + ), + array( + 'example', + 'folder/file%20with%20spaces.php Testing comments', + 'folder/file%20with%20spaces.php Testing comments', + 'Testing comments', + 1, + null, + 'folder/file with spaces.php' + ), + array( + 'example', + 'http://example.com/file%20with%20spaces.php Testing comments', + 'http://example.com/file%20with%20spaces.php Testing comments', + 'Testing comments', + 1, + null, + 'http://example.com/file%20with%20spaces.php' + ) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php new file mode 100644 index 0000000..0c64ed0 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php @@ -0,0 +1,87 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\LinkTag + * + * @author Ben Selby + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class LinkTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create + * a link for the @link doc block. + * + * @param string $type + * @param string $content + * @param string $exContent + * @param string $exDescription + * @param string $exLink + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\LinkTag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exContent, + $exDescription, + $exLink + ) { + $tag = new LinkTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($exContent, $tag->getContent()); + $this->assertEquals($exDescription, $tag->getDescription()); + $this->assertEquals($exLink, $tag->getLink()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, $content, $exContent, $exDescription, $exLink + return array( + array( + 'link', + 'http://www.phpdoc.org/', + 'http://www.phpdoc.org/', + 'http://www.phpdoc.org/', + 'http://www.phpdoc.org/' + ), + array( + 'link', + 'http://www.phpdoc.org/ Testing', + 'http://www.phpdoc.org/ Testing', + 'Testing', + 'http://www.phpdoc.org/' + ), + array( + 'link', + 'http://www.phpdoc.org/ Testing comments', + 'http://www.phpdoc.org/ Testing comments', + 'Testing comments', + 'http://www.phpdoc.org/' + ), + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php new file mode 100644 index 0000000..efc3a15 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php @@ -0,0 +1,146 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\MethodTag + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class MethodTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * @param string $signature The signature to test. + * @param bool $valid Whether the given signature is expected to + * be valid. + * @param string $expected_name The method name that is expected from this + * signature. + * @param string $expected_return The return type that is expected from this + * signature. + * @param bool $paramCount Number of parameters in the signature. + * @param string $description The short description mentioned in the + * signature. + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\MethodTag + * @dataProvider getTestSignatures + * + * @return void + */ + public function testConstruct( + $signature, + $valid, + $expected_name, + $expected_return, + $expected_isStatic, + $paramCount, + $description + ) { + ob_start(); + $tag = new MethodTag('method', $signature); + $stdout = ob_get_clean(); + + $this->assertSame( + $valid, + empty($stdout), + 'No error should have been output if the signature is valid' + ); + + if (!$valid) { + return; + } + + $this->assertEquals($expected_name, $tag->getMethodName()); + $this->assertEquals($expected_return, $tag->getType()); + $this->assertEquals($description, $tag->getDescription()); + $this->assertEquals($expected_isStatic, $tag->isStatic()); + $this->assertCount($paramCount, $tag->getArguments()); + } + + public function getTestSignatures() + { + return array( + // TODO: Verify this case +// array( +// 'foo', +// false, 'foo', '', false, 0, '' +// ), + array( + 'foo()', + true, 'foo', 'void', false, 0, '' + ), + array( + 'foo() description', + true, 'foo', 'void', false, 0, 'description' + ), + array( + 'int foo()', + true, 'foo', 'int', false, 0, '' + ), + array( + 'int foo() description', + true, 'foo', 'int', false, 0, 'description' + ), + array( + 'int foo($a, $b)', + true, 'foo', 'int', false, 2, '' + ), + array( + 'int foo() foo(int $a, int $b)', + true, 'foo', 'int', false, 2, '' + ), + array( + 'int foo(int $a, int $b)', + true, 'foo', 'int', false, 2, '' + ), + array( + 'null|int foo(int $a, int $b)', + true, 'foo', 'null|int', false, 2, '' + ), + array( + 'int foo(null|int $a, int $b)', + true, 'foo', 'int', false, 2, '' + ), + array( + '\Exception foo() foo(Exception $a, Exception $b)', + true, 'foo', '\Exception', false, 2, '' + ), + array( + 'int foo() foo(Exception $a, Exception $b) description', + true, 'foo', 'int', false, 2, 'description' + ), + array( + 'int foo() foo(\Exception $a, \Exception $b) description', + true, 'foo', 'int', false, 2, 'description' + ), + array( + 'void()', + true, 'void', 'void', false, 0, '' + ), + array( + 'static foo()', + true, 'foo', 'static', false, 0, '' + ), + array( + 'static void foo()', + true, 'foo', 'void', true, 0, '' + ), + array( + 'static static foo()', + true, 'foo', 'static', true, 0, '' + ) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php new file mode 100644 index 0000000..0e05382 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php @@ -0,0 +1,118 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\ParamTag + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ParamTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ParamTag can + * understand the @param DocBlock. + * + * @param string $type + * @param string $content + * @param string $extractedType + * @param string $extractedTypes + * @param string $extractedVarName + * @param string $extractedDescription + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\ParamTag + * @dataProvider provideDataForConstructor + * + * @return void + */ + public function testConstructorParsesInputsIntoCorrectFields( + $type, + $content, + $extractedType, + $extractedTypes, + $extractedVarName, + $extractedDescription + ) { + $tag = new ParamTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($extractedType, $tag->getType()); + $this->assertEquals($extractedTypes, $tag->getTypes()); + $this->assertEquals($extractedVarName, $tag->getVariableName()); + $this->assertEquals($extractedDescription, $tag->getDescription()); + } + + /** + * Data provider for testConstructorParsesInputsIntoCorrectFields() + * + * @return array + */ + public function provideDataForConstructor() + { + return array( + array('param', 'int', 'int', array('int'), '', ''), + array('param', '$bob', '', array(), '$bob', ''), + array( + 'param', + 'int Number of bobs', + 'int', + array('int'), + '', + 'Number of bobs' + ), + array( + 'param', + 'int $bob', + 'int', + array('int'), + '$bob', + '' + ), + array( + 'param', + 'int $bob Number of bobs', + 'int', + array('int'), + '$bob', + 'Number of bobs' + ), + array( + 'param', + "int Description \n on multiple lines", + 'int', + array('int'), + '', + "Description \n on multiple lines" + ), + array( + 'param', + "int \n\$bob Variable name on a new line", + 'int', + array('int'), + '$bob', + "Variable name on a new line" + ), + array( + 'param', + "\nint \$bob Type on a new line", + 'int', + array('int'), + '$bob', + "Type on a new line" + ) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php new file mode 100644 index 0000000..9e2aec0 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php @@ -0,0 +1,102 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\ReturnTag + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ReturnTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag can + * understand the @return DocBlock. + * + * @param string $type + * @param string $content + * @param string $extractedType + * @param string $extractedTypes + * @param string $extractedDescription + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag + * @dataProvider provideDataForConstructor + * + * @return void + */ + public function testConstructorParsesInputsIntoCorrectFields( + $type, + $content, + $extractedType, + $extractedTypes, + $extractedDescription + ) { + $tag = new ReturnTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($extractedType, $tag->getType()); + $this->assertEquals($extractedTypes, $tag->getTypes()); + $this->assertEquals($extractedDescription, $tag->getDescription()); + } + + /** + * Data provider for testConstructorParsesInputsIntoCorrectFields() + * + * @return array + */ + public function provideDataForConstructor() + { + return array( + array('return', '', '', array(), ''), + array('return', 'int', 'int', array('int'), ''), + array( + 'return', + 'int Number of Bobs', + 'int', + array('int'), + 'Number of Bobs' + ), + array( + 'return', + 'int|double Number of Bobs', + 'int|double', + array('int', 'double'), + 'Number of Bobs' + ), + array( + 'return', + "int Number of \n Bobs", + 'int', + array('int'), + "Number of \n Bobs" + ), + array( + 'return', + " int Number of Bobs", + 'int', + array('int'), + "Number of Bobs" + ), + array( + 'return', + "int\nNumber of Bobs", + 'int', + array('int'), + "Number of Bobs" + ) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php new file mode 100644 index 0000000..6829b04 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php @@ -0,0 +1,86 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\SeeTag + * + * @author Daniel O'Connor + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class SeeTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the phpDocumentor_Reflection_DocBlock_Tag_See can create a link + * for the @see doc block. + * + * @param string $type + * @param string $content + * @param string $exContent + * @param string $exReference + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\SeeTag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exContent, + $exDescription, + $exReference + ) { + $tag = new SeeTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($exContent, $tag->getContent()); + $this->assertEquals($exDescription, $tag->getDescription()); + $this->assertEquals($exReference, $tag->getReference()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, $content, $exContent, $exDescription, $exReference + return array( + array( + 'see', + 'Foo::bar()', + 'Foo::bar()', + '', + 'Foo::bar()' + ), + array( + 'see', + 'Foo::bar() Testing', + 'Foo::bar() Testing', + 'Testing', + 'Foo::bar()', + ), + array( + 'see', + 'Foo::bar() Testing comments', + 'Foo::bar() Testing comments', + 'Testing comments', + 'Foo::bar()', + ), + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php new file mode 100644 index 0000000..8caf25d --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php @@ -0,0 +1,115 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\SinceTag + * + * @author Vasil Rangelov + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class SinceTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create + * a link for the @since doc block. + * + * @param string $type + * @param string $content + * @param string $exContent + * @param string $exDescription + * @param string $exVersion + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\SinceTag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exContent, + $exDescription, + $exVersion + ) { + $tag = new SinceTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($exContent, $tag->getContent()); + $this->assertEquals($exDescription, $tag->getDescription()); + $this->assertEquals($exVersion, $tag->getVersion()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, $content, $exContent, $exDescription, $exVersion + return array( + array( + 'since', + '1.0 First release.', + '1.0 First release.', + 'First release.', + '1.0' + ), + array( + 'since', + "1.0\nFirst release.", + "1.0\nFirst release.", + 'First release.', + '1.0' + ), + array( + 'since', + "1.0\nFirst\nrelease.", + "1.0\nFirst\nrelease.", + "First\nrelease.", + '1.0' + ), + array( + 'since', + 'Unfinished release', + 'Unfinished release', + 'Unfinished release', + '' + ), + array( + 'since', + '1.0', + '1.0', + '', + '1.0' + ), + array( + 'since', + 'GIT: $Id$', + 'GIT: $Id$', + '', + 'GIT: $Id$' + ), + array( + 'since', + 'GIT: $Id$ Dev build', + 'GIT: $Id$ Dev build', + 'Dev build', + 'GIT: $Id$' + ) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php new file mode 100644 index 0000000..2a40e0a --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php @@ -0,0 +1,116 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\SourceTag + * + * @author Vasil Rangelov + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class SourceTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\SourceTag can + * understand the @source DocBlock. + * + * @param string $type + * @param string $content + * @param string $exContent + * @param string $exStartingLine + * @param string $exLineCount + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\SourceTag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exContent, + $exDescription, + $exStartingLine, + $exLineCount + ) { + $tag = new SourceTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($exContent, $tag->getContent()); + $this->assertEquals($exDescription, $tag->getDescription()); + $this->assertEquals($exStartingLine, $tag->getStartingLine()); + $this->assertEquals($exLineCount, $tag->getLineCount()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, $content, $exContent, $exDescription, $exStartingLine, $exLineCount + return array( + array( + 'source', + '2', + '2', + '', + 2, + null + ), + array( + 'source', + 'Testing', + 'Testing', + 'Testing', + 1, + null + ), + array( + 'source', + '2 Testing', + '2 Testing', + 'Testing', + 2, + null + ), + array( + 'source', + '2 3 Testing comments', + '2 3 Testing comments', + 'Testing comments', + 2, + 3 + ), + array( + 'source', + '2 -1 Testing comments', + '2 -1 Testing comments', + '-1 Testing comments', + 2, + null + ), + array( + 'source', + '-1 1 Testing comments', + '-1 1 Testing comments', + '-1 1 Testing comments', + 1, + null + ) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php new file mode 100644 index 0000000..3c669d5 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php @@ -0,0 +1,102 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\ThrowsTag + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ThrowsTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag can + * understand the @throws DocBlock. + * + * @param string $type + * @param string $content + * @param string $extractedType + * @param string $extractedTypes + * @param string $extractedDescription + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag + * @dataProvider provideDataForConstructor + * + * @return void + */ + public function testConstructorParsesInputsIntoCorrectFields( + $type, + $content, + $extractedType, + $extractedTypes, + $extractedDescription + ) { + $tag = new ThrowsTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($extractedType, $tag->getType()); + $this->assertEquals($extractedTypes, $tag->getTypes()); + $this->assertEquals($extractedDescription, $tag->getDescription()); + } + + /** + * Data provider for testConstructorParsesInputsIntoCorrectFields() + * + * @return array + */ + public function provideDataForConstructor() + { + return array( + array('throws', '', '', array(), ''), + array('throws', 'int', 'int', array('int'), ''), + array( + 'throws', + 'int Number of Bobs', + 'int', + array('int'), + 'Number of Bobs' + ), + array( + 'throws', + 'int|double Number of Bobs', + 'int|double', + array('int', 'double'), + 'Number of Bobs' + ), + array( + 'throws', + "int Number of \n Bobs", + 'int', + array('int'), + "Number of \n Bobs" + ), + array( + 'throws', + " int Number of Bobs", + 'int', + array('int'), + "Number of Bobs" + ), + array( + 'throws', + "int\nNumber of Bobs", + 'int', + array('int'), + "Number of Bobs" + ) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php new file mode 100644 index 0000000..45868d7 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php @@ -0,0 +1,86 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\UsesTag + * + * @author Daniel O'Connor + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class UsesTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\UsesTag can create + * a link for the @uses doc block. + * + * @param string $type + * @param string $content + * @param string $exContent + * @param string $exReference + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\UsesTag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exContent, + $exDescription, + $exReference + ) { + $tag = new UsesTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($exContent, $tag->getContent()); + $this->assertEquals($exDescription, $tag->getDescription()); + $this->assertEquals($exReference, $tag->getReference()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, $content, $exContent, $exDescription, $exReference + return array( + array( + 'uses', + 'Foo::bar()', + 'Foo::bar()', + '', + 'Foo::bar()' + ), + array( + 'uses', + 'Foo::bar() Testing', + 'Foo::bar() Testing', + 'Testing', + 'Foo::bar()', + ), + array( + 'uses', + 'Foo::bar() Testing comments', + 'Foo::bar() Testing comments', + 'Testing comments', + 'Foo::bar()', + ), + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php new file mode 100644 index 0000000..9ae2aa5 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php @@ -0,0 +1,94 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\VarTag + * + * @author Daniel O'Connor + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class VarTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\VarTag can + * understand the @var doc block. + * + * @param string $type + * @param string $content + * @param string $exType + * @param string $exVariable + * @param string $exDescription + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\VarTag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exType, + $exVariable, + $exDescription + ) { + $tag = new VarTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($exType, $tag->getType()); + $this->assertEquals($exVariable, $tag->getVariableName()); + $this->assertEquals($exDescription, $tag->getDescription()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, $content, $exType, $exVariable, $exDescription + return array( + array( + 'var', + 'int', + 'int', + '', + '' + ), + array( + 'var', + 'int $bob', + 'int', + '$bob', + '' + ), + array( + 'var', + 'int $bob Number of bobs', + 'int', + '$bob', + 'Number of bobs' + ), + array( + 'var', + '', + '', + '', + '' + ), + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php new file mode 100644 index 0000000..e145386 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php @@ -0,0 +1,115 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\VersionTag + * + * @author Vasil Rangelov + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class VersionTagTest extends \PHPUnit_Framework_TestCase +{ + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create + * a link for the @version doc block. + * + * @param string $type + * @param string $content + * @param string $exContent + * @param string $exDescription + * @param string $exVersion + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag\VersionTag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exContent, + $exDescription, + $exVersion + ) { + $tag = new VersionTag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($exContent, $tag->getContent()); + $this->assertEquals($exDescription, $tag->getDescription()); + $this->assertEquals($exVersion, $tag->getVersion()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, $content, $exContent, $exDescription, $exVersion + return array( + array( + 'version', + '1.0 First release.', + '1.0 First release.', + 'First release.', + '1.0' + ), + array( + 'version', + "1.0\nFirst release.", + "1.0\nFirst release.", + 'First release.', + '1.0' + ), + array( + 'version', + "1.0\nFirst\nrelease.", + "1.0\nFirst\nrelease.", + "First\nrelease.", + '1.0' + ), + array( + 'version', + 'Unfinished release', + 'Unfinished release', + 'Unfinished release', + '' + ), + array( + 'version', + '1.0', + '1.0', + '', + '1.0' + ), + array( + 'version', + 'GIT: $Id$', + 'GIT: $Id$', + '', + 'GIT: $Id$' + ), + array( + 'version', + 'GIT: $Id$ Dev build', + 'GIT: $Id$ Dev build', + 'Dev build', + 'GIT: $Id$' + ) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php new file mode 100644 index 0000000..9e873ec --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php @@ -0,0 +1,313 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use phpDocumentor\Reflection\DocBlock; +use phpDocumentor\Reflection\DocBlock\Context; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Tag\VarTag + * + * @author Daniel O'Connor + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class TagTest extends \PHPUnit_Framework_TestCase +{ + + /** + * @expectedException \InvalidArgumentException + * + * @return void + */ + public function testInvalidTagLine() + { + Tag::createInstance('Invalid tag line'); + } + + /** + * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler + * + * @return void + */ + public function testTagHandlerUnregistration() + { + $currentHandler = __NAMESPACE__ . '\Tag\VarTag'; + $tagPreUnreg = Tag::createInstance('@var mixed'); + $this->assertInstanceOf( + $currentHandler, + $tagPreUnreg + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPreUnreg + ); + + Tag::registerTagHandler('var', null); + + $tagPostUnreg = Tag::createInstance('@var mixed'); + $this->assertNotInstanceOf( + $currentHandler, + $tagPostUnreg + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPostUnreg + ); + + Tag::registerTagHandler('var', $currentHandler); + } + + /** + * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler + * + * @return void + */ + public function testTagHandlerCorrectRegistration() + { + if (0 == ini_get('allow_url_include')) { + $this->markTestSkipped('"data" URIs for includes are required.'); + } + $currentHandler = __NAMESPACE__ . '\Tag\VarTag'; + $tagPreReg = Tag::createInstance('@var mixed'); + $this->assertInstanceOf( + $currentHandler, + $tagPreReg + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPreReg + ); + + include 'data:text/plain;base64,'. base64_encode( +<<assertTrue(Tag::registerTagHandler('var', '\MyTagHandler')); + + $tagPostReg = Tag::createInstance('@var mixed'); + $this->assertNotInstanceOf( + $currentHandler, + $tagPostReg + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPostReg + ); + $this->assertInstanceOf( + '\MyTagHandler', + $tagPostReg + ); + + $this->assertTrue(Tag::registerTagHandler('var', $currentHandler)); + } + + /** + * @depends testTagHandlerCorrectRegistration + * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler + * @covers \phpDocumentor\Reflection\DocBlock\Tag::createInstance + * + * @return void + */ + public function testNamespacedTagHandlerCorrectRegistration() + { + $tagPreReg = Tag::createInstance('@T something'); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPreReg + ); + $this->assertNotInstanceOf( + '\MyTagHandler', + $tagPreReg + ); + + $this->assertTrue( + Tag::registerTagHandler('\MyNamespace\MyTag', '\MyTagHandler') + ); + + $tagPostReg = Tag::createInstance( + '@T something', + new DocBlock( + '', + new Context('', array('T' => '\MyNamespace\MyTag')) + ) + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPostReg + ); + $this->assertInstanceOf( + '\MyTagHandler', + $tagPostReg + ); + + $this->assertTrue( + Tag::registerTagHandler('\MyNamespace\MyTag', null) + ); + } + + /** + * @depends testTagHandlerCorrectRegistration + * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler + * @covers \phpDocumentor\Reflection\DocBlock\Tag::createInstance + * + * @return void + */ + public function testNamespacedTagHandlerIncorrectRegistration() + { + $tagPreReg = Tag::createInstance('@T something'); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPreReg + ); + $this->assertNotInstanceOf( + '\MyTagHandler', + $tagPreReg + ); + + $this->assertFalse( + Tag::registerTagHandler('MyNamespace\MyTag', '\MyTagHandler') + ); + + $tagPostReg = Tag::createInstance( + '@T something', + new DocBlock( + '', + new Context('', array('T' => '\MyNamespace\MyTag')) + ) + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPostReg + ); + $this->assertNotInstanceOf( + '\MyTagHandler', + $tagPostReg + ); + } + + /** + * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler + * + * @return void + */ + public function testNonExistentTagHandlerRegistration() + { + $currentHandler = __NAMESPACE__ . '\Tag\VarTag'; + $tagPreReg = Tag::createInstance('@var mixed'); + $this->assertInstanceOf( + $currentHandler, + $tagPreReg + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPreReg + ); + + $this->assertFalse(Tag::registerTagHandler('var', 'Non existent')); + + $tagPostReg = Tag::createInstance('@var mixed'); + $this->assertInstanceOf( + $currentHandler, + $tagPostReg + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPostReg + ); + } + + /** + * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler + * + * @return void + */ + public function testIncompatibleTagHandlerRegistration() + { + $currentHandler = __NAMESPACE__ . '\Tag\VarTag'; + $tagPreReg = Tag::createInstance('@var mixed'); + $this->assertInstanceOf( + $currentHandler, + $tagPreReg + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPreReg + ); + + $this->assertFalse( + Tag::registerTagHandler('var', __NAMESPACE__ . '\TagTest') + ); + + $tagPostReg = Tag::createInstance('@var mixed'); + $this->assertInstanceOf( + $currentHandler, + $tagPostReg + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\Tag', + $tagPostReg + ); + } + + /** + * Test that the \phpDocumentor\Reflection\DocBlock\Tag\VarTag can + * understand the @var doc block. + * + * @param string $type + * @param string $content + * @param string $exDescription + * + * @covers \phpDocumentor\Reflection\DocBlock\Tag + * @dataProvider provideDataForConstuctor + * + * @return void + */ + public function testConstructorParesInputsIntoCorrectFields( + $type, + $content, + $exDescription + ) { + $tag = new Tag($type, $content); + + $this->assertEquals($type, $tag->getName()); + $this->assertEquals($content, $tag->getContent()); + $this->assertEquals($exDescription, $tag->getDescription()); + } + + /** + * Data provider for testConstructorParesInputsIntoCorrectFields + * + * @return array + */ + public function provideDataForConstuctor() + { + // $type, $content, $exDescription + return array( + array( + 'unknown', + 'some content', + 'some content', + ), + array( + 'unknown', + '', + '', + ) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php new file mode 100644 index 0000000..78c7306 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php @@ -0,0 +1,195 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Type; + +use phpDocumentor\Reflection\DocBlock\Context; + +/** + * Test class for \phpDocumentor\Reflection\DocBlock\Type\Collection + * + * @covers phpDocumentor\Reflection\DocBlock\Type\Collection + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class CollectionTest extends \PHPUnit_Framework_TestCase +{ + /** + * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct + * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::getContext + * + * @return void + */ + public function testConstruct() + { + $collection = new Collection(); + $this->assertCount(0, $collection); + $this->assertEquals('', $collection->getContext()->getNamespace()); + $this->assertCount(0, $collection->getContext()->getNamespaceAliases()); + } + + /** + * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct + * + * @return void + */ + public function testConstructWithTypes() + { + $collection = new Collection(array('integer', 'string')); + $this->assertCount(2, $collection); + } + + /** + * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct + * + * @return void + */ + public function testConstructWithNamespace() + { + $collection = new Collection(array(), new Context('\My\Space')); + $this->assertEquals('My\Space', $collection->getContext()->getNamespace()); + + $collection = new Collection(array(), new Context('My\Space')); + $this->assertEquals('My\Space', $collection->getContext()->getNamespace()); + + $collection = new Collection(array(), null); + $this->assertEquals('', $collection->getContext()->getNamespace()); + } + + /** + * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct + * + * @return void + */ + public function testConstructWithNamespaceAliases() + { + $fixture = array('a' => 'b'); + $collection = new Collection(array(), new Context(null, $fixture)); + $this->assertEquals( + array('a' => '\b'), + $collection->getContext()->getNamespaceAliases() + ); + } + + /** + * @param string $fixture + * @param array $expected + * + * @dataProvider provideTypesToExpand + * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add + * + * @return void + */ + public function testAdd($fixture, $expected) + { + $collection = new Collection( + array(), + new Context('\My\Space', array('Alias' => '\My\Space\Aliasing')) + ); + $collection->add($fixture); + + $this->assertSame($expected, $collection->getArrayCopy()); + } + + /** + * @param string $fixture + * @param array $expected + * + * @dataProvider provideTypesToExpandWithoutNamespace + * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add + * + * @return void + */ + public function testAddWithoutNamespace($fixture, $expected) + { + $collection = new Collection( + array(), + new Context(null, array('Alias' => '\My\Space\Aliasing')) + ); + $collection->add($fixture); + + $this->assertSame($expected, $collection->getArrayCopy()); + } + + /** + * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add + * @expectedException InvalidArgumentException + * + * @return void + */ + public function testAddWithInvalidArgument() + { + $collection = new Collection(); + $collection->add(array()); + } + + /** + * Returns the types and their expected values to test the retrieval of + * types. + * + * @param string $method Name of the method consuming this data provider. + * @param string $namespace Name of the namespace to user as basis. + * + * @return string[] + */ + public function provideTypesToExpand($method, $namespace = '\My\Space\\') + { + return array( + array('', array()), + array(' ', array()), + array('int', array('int')), + array('int ', array('int')), + array('string', array('string')), + array('DocBlock', array($namespace.'DocBlock')), + array('DocBlock[]', array($namespace.'DocBlock[]')), + array(' DocBlock ', array($namespace.'DocBlock')), + array('\My\Space\DocBlock', array('\My\Space\DocBlock')), + array('Alias\DocBlock', array('\My\Space\Aliasing\DocBlock')), + array( + 'DocBlock|Tag', + array($namespace .'DocBlock', $namespace .'Tag') + ), + array( + 'DocBlock|null', + array($namespace.'DocBlock', 'null') + ), + array( + '\My\Space\DocBlock|Tag', + array('\My\Space\DocBlock', $namespace.'Tag') + ), + array( + 'DocBlock[]|null', + array($namespace.'DocBlock[]', 'null') + ), + array( + 'DocBlock[]|int[]', + array($namespace.'DocBlock[]', 'int[]') + ), + ); + } + + /** + * Returns the types and their expected values to test the retrieval of + * types when no namespace is available. + * + * @param string $method Name of the method consuming this data provider. + * + * @return string[] + */ + public function provideTypesToExpandWithoutNamespace($method) + { + return $this->provideTypesToExpand($method, '\\'); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php new file mode 100644 index 0000000..30eedfc --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php @@ -0,0 +1,337 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock\Context; +use phpDocumentor\Reflection\DocBlock\Location; +use phpDocumentor\Reflection\DocBlock\Tag\ReturnTag; + +/** + * Test class for phpDocumentor\Reflection\DocBlock + * + * @author Mike van Riel + * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class DocBlockTest extends \PHPUnit_Framework_TestCase +{ + /** + * @covers \phpDocumentor\Reflection\DocBlock + * + * @return void + */ + public function testConstruct() + { + $fixture = << '\phpDocumentor')), + new Location(2) + ); + $this->assertEquals( + 'This is a short description', + $object->getShortDescription() + ); + $this->assertEquals( + 'This is a long description', + $object->getLongDescription()->getContents() + ); + $this->assertCount(2, $object->getTags()); + $this->assertTrue($object->hasTag('see')); + $this->assertTrue($object->hasTag('return')); + $this->assertFalse($object->hasTag('category')); + + $this->assertSame('MyNamespace', $object->getContext()->getNamespace()); + $this->assertSame( + array('PHPDoc' => '\phpDocumentor'), + $object->getContext()->getNamespaceAliases() + ); + $this->assertSame(2, $object->getLocation()->getLineNumber()); + } + + /** + * @covers \phpDocumentor\Reflection\DocBlock::splitDocBlock + * + * @return void + */ + public function testConstructWithTagsOnly() + { + $fixture = <<assertEquals('', $object->getShortDescription()); + $this->assertEquals('', $object->getLongDescription()->getContents()); + $this->assertCount(2, $object->getTags()); + $this->assertTrue($object->hasTag('see')); + $this->assertTrue($object->hasTag('return')); + $this->assertFalse($object->hasTag('category')); + } + + /** + * @covers \phpDocumentor\Reflection\DocBlock::isTemplateStart + */ + public function testIfStartOfTemplateIsDiscovered() + { + $fixture = <<assertEquals('', $object->getShortDescription()); + $this->assertEquals('', $object->getLongDescription()->getContents()); + $this->assertCount(2, $object->getTags()); + $this->assertTrue($object->hasTag('see')); + $this->assertTrue($object->hasTag('return')); + $this->assertFalse($object->hasTag('category')); + $this->assertTrue($object->isTemplateStart()); + } + + /** + * @covers \phpDocumentor\Reflection\DocBlock::isTemplateEnd + */ + public function testIfEndOfTemplateIsDiscovered() + { + $fixture = <<assertEquals('', $object->getShortDescription()); + $this->assertEquals('', $object->getLongDescription()->getContents()); + $this->assertTrue($object->isTemplateEnd()); + } + + /** + * @covers \phpDocumentor\Reflection\DocBlock::cleanInput + * + * @return void + */ + public function testConstructOneLiner() + { + $fixture = '/** Short description and nothing more. */'; + $object = new DocBlock($fixture); + $this->assertEquals( + 'Short description and nothing more.', + $object->getShortDescription() + ); + $this->assertEquals('', $object->getLongDescription()->getContents()); + $this->assertCount(0, $object->getTags()); + } + + /** + * @covers \phpDocumentor\Reflection\DocBlock::__construct + * + * @return void + */ + public function testConstructFromReflector() + { + $object = new DocBlock(new \ReflectionClass($this)); + $this->assertEquals( + 'Test class for phpDocumentor\Reflection\DocBlock', + $object->getShortDescription() + ); + $this->assertEquals('', $object->getLongDescription()->getContents()); + $this->assertCount(4, $object->getTags()); + $this->assertTrue($object->hasTag('author')); + $this->assertTrue($object->hasTag('copyright')); + $this->assertTrue($object->hasTag('license')); + $this->assertTrue($object->hasTag('link')); + $this->assertFalse($object->hasTag('category')); + } + + /** + * @expectedException \InvalidArgumentException + * + * @return void + */ + public function testExceptionOnInvalidObject() + { + new DocBlock($this); + } + + public function testDotSeperation() + { + $fixture = <<assertEquals( + 'This is a short description.', + $object->getShortDescription() + ); + $this->assertEquals( + "This is a long description.\nThis is a continuation of the long " + ."description.", + $object->getLongDescription()->getContents() + ); + } + + /** + * @covers \phpDocumentor\Reflection\DocBlock::parseTags + * @expectedException \LogicException + * + * @return void + */ + public function testInvalidTagBlock() + { + if (0 == ini_get('allow_url_include')) { + $this->markTestSkipped('"data" URIs for includes are required.'); + } + + include 'data:text/plain;base64,'. base64_encode( + <<assertEquals( + 'This is a short description.', + $object->getShortDescription() + ); + $this->assertEquals( + 'This is a long description.', + $object->getLongDescription()->getContents() + ); + $tags = $object->getTags(); + $this->assertCount(2, $tags); + $this->assertTrue($object->hasTag('method')); + $this->assertTrue($object->hasTag('Method')); + $this->assertInstanceOf( + __NAMESPACE__ . '\DocBlock\Tag\MethodTag', + $tags[0] + ); + $this->assertInstanceOf( + __NAMESPACE__ . '\DocBlock\Tag', + $tags[1] + ); + $this->assertNotInstanceOf( + __NAMESPACE__ . '\DocBlock\Tag\MethodTag', + $tags[1] + ); + } + + /** + * @depends testConstructFromReflector + * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName + * + * @return void + */ + public function testGetTagsByNameZeroAndOneMatch() + { + $object = new DocBlock(new \ReflectionClass($this)); + $this->assertEmpty($object->getTagsByName('category')); + $this->assertCount(1, $object->getTagsByName('author')); + } + + /** + * @depends testConstructWithTagsOnly + * @covers \phpDocumentor\Reflection\DocBlock::parseTags + * + * @return void + */ + public function testParseMultilineTag() + { + $fixture = <<assertCount(1, $object->getTags()); + } + + /** + * @depends testConstructWithTagsOnly + * @covers \phpDocumentor\Reflection\DocBlock::parseTags + * + * @return void + */ + public function testParseMultilineTagWithLineBreaks() + { + $fixture = <<assertCount(1, $tags = $object->getTags()); + /** @var ReturnTag $tag */ + $tag = reset($tags); + $this->assertEquals("Content on\n multiple lines.\n\n One more, after the break.", $tag->getDescription()); + } + + /** + * @depends testConstructWithTagsOnly + * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName + * + * @return void + */ + public function testGetTagsByNameMultipleMatch() + { + $fixture = <<assertEmpty($object->getTagsByName('category')); + $this->assertCount(1, $object->getTagsByName('return')); + $this->assertCount(2, $object->getTagsByName('param')); + } +} diff --git a/vendor/phpspec/prophecy/.gitignore b/vendor/phpspec/prophecy/.gitignore new file mode 100644 index 0000000..c50c8c4 --- /dev/null +++ b/vendor/phpspec/prophecy/.gitignore @@ -0,0 +1,4 @@ +*.tgz +*.phar +bin +vendor diff --git a/vendor/phpspec/prophecy/.travis.yml b/vendor/phpspec/prophecy/.travis.yml new file mode 100644 index 0000000..004e612 --- /dev/null +++ b/vendor/phpspec/prophecy/.travis.yml @@ -0,0 +1,19 @@ +language: php + +php: [5.3, 5.4, 5.5, 5.6, 7, hhvm] + +sudo: false + +cache: + directories: + - $HOME/.composer/cache + +branches: + except: + - /^bugfix\/.*$/ + - /^feature\/.*$/ + - /^optimization\/.*$/ + +before_script: travis_retry composer install --no-interaction + +script: vendor/bin/phpspec run -fpretty -v diff --git a/vendor/phpspec/prophecy/CHANGES.md b/vendor/phpspec/prophecy/CHANGES.md new file mode 100644 index 0000000..c9b0b99 --- /dev/null +++ b/vendor/phpspec/prophecy/CHANGES.md @@ -0,0 +1,140 @@ +1.6.0 / 2016-02-15 +================== + + * Add Variadics support (thanks @pamil) + * Add ProphecyComparator for comparing objects that need revealing (thanks @jon-acker) + * Add ApproximateValueToken (thanks @dantleech) + * Add support for 'self' and 'parent' return type (thanks @bendavies) + * Add __invoke to allowed reflectable methods list (thanks @ftrrtf) + * Updated ExportUtil to reflect the latest changes by Sebastian (thanks @jakari) + * Specify the required php version for composer (thanks @jakzal) + * Exclude 'args' in the generated backtrace (thanks @oradwell) + * Fix code generation for scalar parameters (thanks @trowski) + * Fix missing sprintf in InvalidArgumentException __construct call (thanks @emmanuelballery) + * Fix phpdoc for magic methods (thanks @Tobion) + * Fix PhpDoc for interfaces usage (thanks @ImmRanneft) + * Prevent final methods from being manually extended (thanks @kamioftea) + * Enhance exception for invalid argument to ThrowPromise (thanks @Tobion) + +1.5.0 / 2015-04-27 +================== + + * Add support for PHP7 scalar type hints (thanks @trowski) + * Add support for PHP7 return types (thanks @trowski) + * Update internal test suite to support PHP7 + +1.4.1 / 2015-04-27 +================== + + * Fixed bug in closure-based argument tokens (#181) + +1.4.0 / 2015-03-27 +================== + + * Fixed errors in return type phpdocs (thanks @sobit) + * Fixed stringifying of hash containing one value (thanks @avant1) + * Improved clarity of method call expectation exception (thanks @dantleech) + * Add ability to specify which argument is returned in willReturnArgument (thanks @coderbyheart) + * Add more information to MethodNotFound exceptions (thanks @ciaranmcnulty) + * Support for mocking classes with methods that return references (thanks @edsonmedina) + * Improved object comparison (thanks @whatthejeff) + * Adopted '^' in composer dependencies (thanks @GrahamCampbell) + * Fixed non-typehinted arguments being treated as optional (thanks @whatthejeff) + * Magic methods are now filtered for keywords (thanks @seagoj) + * More readable errors for failure when expecting single calls (thanks @dantleech) + +1.3.1 / 2014-11-17 +================== + + * Fix the edge case when failed predictions weren't recorded for `getCheckedPredictions()` + +1.3.0 / 2014-11-14 +================== + + * Add a way to get checked predictions with `MethodProphecy::getCheckedPredictions()` + * Fix HHVM compatibility + * Remove dead code (thanks @stof) + * Add support for DirectoryIterators (thanks @shanethehat) + +1.2.0 / 2014-07-18 +================== + + * Added support for doubling magic methods documented in the class phpdoc (thanks @armetiz) + * Fixed a segfault appearing in some cases (thanks @dmoreaulf) + * Fixed the doubling of methods with typehints on non-existent classes (thanks @gquemener) + * Added support for internal classes using keywords as method names (thanks @milan) + * Added IdenticalValueToken and Argument::is (thanks @florianv) + * Removed the usage of scalar typehints in HHVM as HHVM 3 does not support them anymore in PHP code (thanks @whatthejeff) + +1.1.2 / 2014-01-24 +================== + + * Spy automatically promotes spied method call to an expected one + +1.1.1 / 2014-01-15 +================== + + * Added support for HHVM + +1.1.0 / 2014-01-01 +================== + + * Changed the generated class names to use a static counter instead of a random number + * Added a clss patch for ReflectionClass::newInstance to make its argument optional consistently (thanks @docteurklein) + * Fixed mirroring of classes with typehints on non-existent classes (thanks @docteurklein) + * Fixed the support of array callables in CallbackPromise and CallbackPrediction (thanks @ciaranmcnulty) + * Added support for properties in ObjectStateToken (thanks @adrienbrault) + * Added support for mocking classes with a final constructor (thanks @ciaranmcnulty) + * Added ArrayEveryEntryToken and Argument::withEveryEntry() (thanks @adrienbrault) + * Added an exception when trying to prophesize on a final method instead of ignoring silently (thanks @docteurklein) + * Added StringContainToken and Argument::containingString() (thanks @peterjmit) + * Added ``shouldNotHaveBeenCalled`` on the MethodProphecy (thanks @ciaranmcnulty) + * Fixed the comparison of objects in ExactValuetoken (thanks @sstok) + * Deprecated ``shouldNotBeenCalled`` in favor of ``shouldNotHaveBeenCalled`` + +1.0.4 / 2013-08-10 +================== + + * Better randomness for generated class names (thanks @sstok) + * Add support for interfaces into TypeToken and Argument::type() (thanks @sstok) + * Add support for old-style (method name === class name) constructors (thanks @l310 for report) + +1.0.3 / 2013-07-04 +================== + + * Support callable typehints (thanks @stof) + * Do not attempt to autoload arrays when generating code (thanks @MarcoDeBortoli) + * New ArrayEntryToken (thanks @kagux) + +1.0.2 / 2013-05-19 +================== + + * Logical `AND` token added (thanks @kagux) + * Logical `NOT` token added (thanks @kagux) + * Add support for setting custom constructor arguments + * Properly stringify hashes + * Record calls that throw exceptions + * Migrate spec suite to PhpSpec 2.0 + +1.0.1 / 2013-04-30 +================== + + * Fix broken UnexpectedCallException message + * Trim AggregateException message + +1.0.0 / 2013-04-29 +================== + + * Improve exception messages + +1.0.0-BETA2 / 2013-04-03 +======================== + + * Add more debug information to CallTimes and Call prediction exception messages + * Fix MethodNotFoundException wrong namespace (thanks @gunnarlium) + * Fix some typos in the exception messages (thanks @pborreli) + +1.0.0-BETA1 / 2013-03-25 +======================== + + * Initial release diff --git a/vendor/phpspec/prophecy/CONTRIBUTING.md b/vendor/phpspec/prophecy/CONTRIBUTING.md new file mode 100644 index 0000000..72d8e93 --- /dev/null +++ b/vendor/phpspec/prophecy/CONTRIBUTING.md @@ -0,0 +1,21 @@ +Contributing +------------ + +Prophecy is an open source, community-driven project. If you'd like to contribute, +feel free to do this, but remember to follow these few simple rules: + +- Make your feature addition or bug fix, +- Add either specs or examples for any changes you're making (bugfixes or additions) + (please look into `spec/` folder for some examples). This is important so we don't break + it in a future version unintentionally, +- Commit your code, but do not mess with `CHANGES.md`, + +Running tests +------------- + +Make sure that you don't break anything with your changes by running: + +```bash +$> composer install --prefer-dist +$> vendor/bin/phpspec run +``` diff --git a/vendor/phpspec/prophecy/LICENSE b/vendor/phpspec/prophecy/LICENSE new file mode 100644 index 0000000..c8b3647 --- /dev/null +++ b/vendor/phpspec/prophecy/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2013 Konstantin Kudryashov + Marcello Duarte + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/phpspec/prophecy/README.md b/vendor/phpspec/prophecy/README.md new file mode 100644 index 0000000..65ec16c --- /dev/null +++ b/vendor/phpspec/prophecy/README.md @@ -0,0 +1,391 @@ +# Prophecy + +[![Stable release](https://poser.pugx.org/phpspec/prophecy/version.svg)](https://packagist.org/packages/phpspec/prophecy) +[![Build Status](https://travis-ci.org/phpspec/prophecy.svg?branch=master)](https://travis-ci.org/phpspec/prophecy) + +Prophecy is a highly opinionated yet very powerful and flexible PHP object mocking +framework. Though initially it was created to fulfil phpspec2 needs, it is flexible +enough to be used inside any testing framework out there with minimal effort. + +## A simple example + +```php +prophet->prophesize('App\Security\Hasher'); + $user = new App\Entity\User($hasher->reveal()); + + $hasher->generateHash($user, 'qwerty')->willReturn('hashed_pass'); + + $user->setPassword('qwerty'); + + $this->assertEquals('hashed_pass', $user->getPassword()); + } + + protected function setup() + { + $this->prophet = new \Prophecy\Prophet; + } + + protected function tearDown() + { + $this->prophet->checkPredictions(); + } +} +``` + +## Installation + +### Prerequisites + +Prophecy requires PHP 5.3.3 or greater. + +### Setup through composer + +First, add Prophecy to the list of dependencies inside your `composer.json`: + +```json +{ + "require-dev": { + "phpspec/prophecy": "~1.0" + } +} +``` + +Then simply install it with composer: + +```bash +$> composer install --prefer-dist +``` + +You can read more about Composer on its [official webpage](http://getcomposer.org). + +## How to use it + +First of all, in Prophecy every word has a logical meaning, even the name of the library +itself (Prophecy). When you start feeling that, you'll become very fluid with this +tool. + +For example, Prophecy has been named that way because it concentrates on describing the future +behavior of objects with very limited knowledge about them. But as with any other prophecy, +those object prophecies can't create themselves - there should be a Prophet: + +```php +$prophet = new Prophecy\Prophet; +``` + +The Prophet creates prophecies by *prophesizing* them: + +```php +$prophecy = $prophet->prophesize(); +``` + +The result of the `prophesize()` method call is a new object of class `ObjectProphecy`. Yes, +that's your specific object prophecy, which describes how your object would behave +in the near future. But first, you need to specify which object you're talking about, +right? + +```php +$prophecy->willExtend('stdClass'); +$prophecy->willImplement('SessionHandlerInterface'); +``` + +There are 2 interesting calls - `willExtend` and `willImplement`. The first one tells +object prophecy that our object should extend specific class, the second one says that +it should implement some interface. Obviously, objects in PHP can implement multiple +interfaces, but extend only one parent class. + +### Dummies + +Ok, now we have our object prophecy. What can we do with it? First of all, we can get +our object *dummy* by revealing its prophecy: + +```php +$dummy = $prophecy->reveal(); +``` + +The `$dummy` variable now holds a special dummy object. Dummy objects are objects that extend +and/or implement preset classes/interfaces by overriding all their public methods. The key +point about dummies is that they do not hold any logic - they just do nothing. Any method +of the dummy will always return `null` and the dummy will never throw any exceptions. +Dummy is your friend if you don't care about the actual behavior of this double and just need +a token object to satisfy a method typehint. + +You need to understand one thing - a dummy is not a prophecy. Your object prophecy is still +assigned to `$prophecy` variable and in order to manipulate with your expectations, you +should work with it. `$dummy` is a dummy - a simple php object that tries to fulfil your +prophecy. + +### Stubs + +Ok, now we know how to create basic prophecies and reveal dummies from them. That's +awesome if we don't care about our _doubles_ (objects that reflect originals) +interactions. If we do, we need to use *stubs* or *mocks*. + +A stub is an object double, which doesn't have any expectations about the object behavior, +but when put in specific environment, behaves in specific way. Ok, I know, it's cryptic, +but bear with me for a minute. Simply put, a stub is a dummy, which depending on the called +method signature does different things (has logic). To create stubs in Prophecy: + +```php +$prophecy->read('123')->willReturn('value'); +``` + +Oh wow. We've just made an arbitrary call on the object prophecy? Yes, we did. And this +call returned us a new object instance of class `MethodProphecy`. Yep, that's a specific +method with arguments prophecy. Method prophecies give you the ability to create method +promises or predictions. We'll talk about method predictions later in the _Mocks_ section. + +#### Promises + +Promises are logical blocks, that represent your fictional methods in prophecy terms +and they are handled by the `MethodProphecy::will(PromiseInterface $promise)` method. +As a matter of fact, the call that we made earlier (`willReturn('value')`) is a simple +shortcut to: + +```php +$prophecy->read('123')->will(new Prophecy\Promise\ReturnPromise(array('value'))); +``` + +This promise will cause any call to our double's `read()` method with exactly one +argument - `'123'` to always return `'value'`. But that's only for this +promise, there's plenty others you can use: + +- `ReturnPromise` or `->willReturn(1)` - returns a value from a method call +- `ReturnArgumentPromise` or `->willReturnArgument($index)` - returns the nth method argument from call +- `ThrowPromise` or `->willThrow` - causes the method to throw specific exception +- `CallbackPromise` or `->will($callback)` - gives you a quick way to define your own custom logic + +Keep in mind, that you can always add even more promises by implementing +`Prophecy\Promise\PromiseInterface`. + +#### Method prophecies idempotency + +Prophecy enforces same method prophecies and, as a consequence, same promises and +predictions for the same method calls with the same arguments. This means: + +```php +$methodProphecy1 = $prophecy->read('123'); +$methodProphecy2 = $prophecy->read('123'); +$methodProphecy3 = $prophecy->read('321'); + +$methodProphecy1 === $methodProphecy2; +$methodProphecy1 !== $methodProphecy3; +``` + +That's interesting, right? Now you might ask me how would you define more complex +behaviors where some method call changes behavior of others. In PHPUnit or Mockery +you do that by predicting how many times your method will be called. In Prophecy, +you'll use promises for that: + +```php +$user->getName()->willReturn(null); + +// For PHP 5.4 +$user->setName('everzet')->will(function () { + $this->getName()->willReturn('everzet'); +}); + +// For PHP 5.3 +$user->setName('everzet')->will(function ($args, $user) { + $user->getName()->willReturn('everzet'); +}); + +// Or +$user->setName('everzet')->will(function ($args) use ($user) { + $user->getName()->willReturn('everzet'); +}); +``` + +And now it doesn't matter how many times or in which order your methods are called. +What matters is their behaviors and how well you faked it. + +#### Arguments wildcarding + +The previous example is awesome (at least I hope it is for you), but that's not +optimal enough. We hardcoded `'everzet'` in our expectation. Isn't there a better +way? In fact there is, but it involves understanding what this `'everzet'` +actually is. + +You see, even if method arguments used during method prophecy creation look +like simple method arguments, in reality they are not. They are argument token +wildcards. As a matter of fact, `->setName('everzet')` looks like a simple call just +because Prophecy automatically transforms it under the hood into: + +```php +$user->setName(new Prophecy\Argument\Token\ExactValueToken('everzet')); +``` + +Those argument tokens are simple PHP classes, that implement +`Prophecy\Argument\Token\TokenInterface` and tell Prophecy how to compare real arguments +with your expectations. And yes, those classnames are damn big. That's why there's a +shortcut class `Prophecy\Argument`, which you can use to create tokens like that: + +```php +use Prophecy\Argument; + +$user->setName(Argument::exact('everzet')); +``` + +`ExactValueToken` is not very useful in our case as it forced us to hardcode the username. +That's why Prophecy comes bundled with a bunch of other tokens: + +- `IdenticalValueToken` or `Argument::is($value)` - checks that the argument is identical to a specific value +- `ExactValueToken` or `Argument::exact($value)` - checks that the argument matches a specific value +- `TypeToken` or `Argument::type($typeOrClass)` - checks that the argument matches a specific type or + classname +- `ObjectStateToken` or `Argument::which($method, $value)` - checks that the argument method returns + a specific value +- `CallbackToken` or `Argument::that(callback)` - checks that the argument matches a custom callback +- `AnyValueToken` or `Argument::any()` - matches any argument +- `AnyValuesToken` or `Argument::cetera()` - matches any arguments to the rest of the signature +- `StringContainsToken` or `Argument::containingString($value)` - checks that the argument contains a specific string value + +And you can add even more by implementing `TokenInterface` with your own custom classes. + +So, let's refactor our initial `{set,get}Name()` logic with argument tokens: + +```php +use Prophecy\Argument; + +$user->getName()->willReturn(null); + +// For PHP 5.4 +$user->setName(Argument::type('string'))->will(function ($args) { + $this->getName()->willReturn($args[0]); +}); + +// For PHP 5.3 +$user->setName(Argument::type('string'))->will(function ($args, $user) { + $user->getName()->willReturn($args[0]); +}); + +// Or +$user->setName(Argument::type('string'))->will(function ($args) use ($user) { + $user->getName()->willReturn($args[0]); +}); +``` + +That's it. Now our `{set,get}Name()` prophecy will work with any string argument provided to it. +We've just described how our stub object should behave, even though the original object could have +no behavior whatsoever. + +One last bit about arguments now. You might ask, what happens in case of: + +```php +use Prophecy\Argument; + +$user->getName()->willReturn(null); + +// For PHP 5.4 +$user->setName(Argument::type('string'))->will(function ($args) { + $this->getName()->willReturn($args[0]); +}); + +// For PHP 5.3 +$user->setName(Argument::type('string'))->will(function ($args, $user) { + $user->getName()->willReturn($args[0]); +}); + +// Or +$user->setName(Argument::type('string'))->will(function ($args) use ($user) { + $user->getName()->willReturn($args[0]); +}); + +$user->setName(Argument::any())->will(function () { +}); +``` + +Nothing. Your stub will continue behaving the way it did before. That's because of how +arguments wildcarding works. Every argument token type has a different score level, which +wildcard then uses to calculate the final arguments match score and use the method prophecy +promise that has the highest score. In this case, `Argument::type()` in case of success +scores `5` and `Argument::any()` scores `3`. So the type token wins, as does the first +`setName()` method prophecy and its promise. The simple rule of thumb - more precise token +always wins. + +#### Getting stub objects + +Ok, now we know how to define our prophecy method promises, let's get our stub from +it: + +```php +$stub = $prophecy->reveal(); +``` + +As you might see, the only difference between how we get dummies and stubs is that with +stubs we describe every object conversation instead of just agreeing with `null` returns +(object being *dummy*). As a matter of fact, after you define your first promise +(method call), Prophecy will force you to define all the communications - it throws +the `UnexpectedCallException` for any call you didn't describe with object prophecy before +calling it on a stub. + +### Mocks + +Now we know how to define doubles without behavior (dummies) and doubles with behavior, but +no expectations (stubs). What's left is doubles for which we have some expectations. These +are called mocks and in Prophecy they look almost exactly the same as stubs, except that +they define *predictions* instead of *promises* on method prophecies: + +```php +$entityManager->flush()->shouldBeCalled(); +``` + +#### Predictions + +The `shouldBeCalled()` method here assigns `CallPrediction` to our method prophecy. +Predictions are a delayed behavior check for your prophecies. You see, during the entire lifetime +of your doubles, Prophecy records every single call you're making against it inside your +code. After that, Prophecy can use this collected information to check if it matches defined +predictions. You can assign predictions to method prophecies using the +`MethodProphecy::should(PredictionInterface $prediction)` method. As a matter of fact, +the `shouldBeCalled()` method we used earlier is just a shortcut to: + +```php +$entityManager->flush()->should(new Prophecy\Prediction\CallPrediction()); +``` + +It checks if your method of interest (that matches both the method name and the arguments wildcard) +was called 1 or more times. If the prediction failed then it throws an exception. When does this +check happen? Whenever you call `checkPredictions()` on the main Prophet object: + +```php +$prophet->checkPredictions(); +``` + +In PHPUnit, you would want to put this call into the `tearDown()` method. If no predictions +are defined, it would do nothing. So it won't harm to call it after every test. + +There are plenty more predictions you can play with: + +- `CallPrediction` or `shouldBeCalled()` - checks that the method has been called 1 or more times +- `NoCallsPrediction` or `shouldNotBeCalled()` - checks that the method has not been called +- `CallTimesPrediction` or `shouldBeCalledTimes($count)` - checks that the method has been called + `$count` times +- `CallbackPrediction` or `should($callback)` - checks the method against your own custom callback + +Of course, you can always create your own custom prediction any time by implementing +`PredictionInterface`. + +### Spies + +The last bit of awesomeness in Prophecy is out-of-the-box spies support. As I said in the previous +section, Prophecy records every call made during the double's entire lifetime. This means +you don't need to record predictions in order to check them. You can also do it +manually by using the `MethodProphecy::shouldHave(PredictionInterface $prediction)` method: + +```php +$em = $prophet->prophesize('Doctrine\ORM\EntityManager'); + +$controller->createUser($em->reveal()); + +$em->flush()->shouldHaveBeenCalled(); +``` + +Such manipulation with doubles is called spying. And with Prophecy it just works. diff --git a/vendor/phpspec/prophecy/composer.json b/vendor/phpspec/prophecy/composer.json new file mode 100644 index 0000000..15be673 --- /dev/null +++ b/vendor/phpspec/prophecy/composer.json @@ -0,0 +1,42 @@ +{ + "name": "phpspec/prophecy", + "description": "Highly opinionated mocking framework for PHP 5.3+", + "keywords": ["Mock", "Stub", "Dummy", "Double", "Fake", "Spy"], + "homepage": "https://github.com/phpspec/prophecy", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "require": { + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "~2.0", + "sebastian/comparator": "~1.1", + "doctrine/instantiator": "^1.0.2", + "sebastian/recursion-context": "~1.0" + }, + + "require-dev": { + "phpspec/phpspec": "~2.0" + }, + + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + } +} diff --git a/vendor/phpspec/prophecy/composer.lock b/vendor/phpspec/prophecy/composer.lock new file mode 100644 index 0000000..795005a --- /dev/null +++ b/vendor/phpspec/prophecy/composer.lock @@ -0,0 +1,720 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "0cb11a8d8108277277f9931f6e4fa947", + "content-hash": "d2c6dc828e1217dfa154bc2dbb431edb", + "packages": [ + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14 21:17:01" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2015-02-03 12:10:50" + }, + { + "name": "sebastian/comparator", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2015-07-26 15:48:44" + }, + { + "name": "sebastian/diff", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "http://www.github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2015-02-22 15:13:53" + }, + { + "name": "sebastian/exporter", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2015-06-21 07:55:53" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba", + "reference": "994d4a811bafe801fb06dccbee797863ba2792ba", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2015-06-21 08:04:50" + } + ], + "packages-dev": [ + { + "name": "phpspec/php-diff", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/phpspec/php-diff.git", + "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a", + "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Diff": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Chris Boulton", + "homepage": "http://github.com/chrisboulton", + "role": "Original developer" + } + ], + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", + "time": "2013-11-01 13:02:21" + }, + { + "name": "phpspec/phpspec", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/phpspec.git", + "reference": "36635a903bdeb54899d7407bc95610501fd98559" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/phpspec/zipball/36635a903bdeb54899d7407bc95610501fd98559", + "reference": "36635a903bdeb54899d7407bc95610501fd98559", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.1", + "php": ">=5.3.3", + "phpspec/php-diff": "~1.0.0", + "phpspec/prophecy": "~1.4", + "sebastian/exporter": "~1.0", + "symfony/console": "~2.3", + "symfony/event-dispatcher": "~2.1", + "symfony/finder": "~2.1", + "symfony/process": "^2.6", + "symfony/yaml": "~2.1" + }, + "require-dev": { + "behat/behat": "^3.0.11", + "bossa/phpspec2-expect": "~1.0", + "phpunit/phpunit": "~4.4", + "symfony/filesystem": "~2.1" + }, + "suggest": { + "phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters" + }, + "bin": [ + "bin/phpspec" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "PhpSpec": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "homepage": "http://marcelloduarte.net/" + } + ], + "description": "Specification-oriented BDD framework for PHP 5.3+", + "homepage": "http://phpspec.net/", + "keywords": [ + "BDD", + "SpecBDD", + "TDD", + "spec", + "specification", + "testing", + "tests" + ], + "time": "2015-09-07 07:07:37" + }, + { + "name": "symfony/console", + "version": "v2.7.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "5efd632294c8320ea52492db22292ff853a43766" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/5efd632294c8320ea52492db22292ff853a43766", + "reference": "5efd632294c8320ea52492db22292ff853a43766", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1", + "symfony/process": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2015-10-20 14:38:46" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.7.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87a5db5ea887763fa3a31a5471b512ff1596d9b8", + "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.0,>=2.0.5", + "symfony/dependency-injection": "~2.6", + "symfony/expression-language": "~2.6", + "symfony/stopwatch": "~2.3" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2015-10-11 09:39:48" + }, + { + "name": "symfony/finder", + "version": "v2.7.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", + "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2015-10-11 09:39:48" + }, + { + "name": "symfony/process", + "version": "v2.7.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/4a959dd4e19c2c5d7512689413921e0a74386ec7", + "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2015-10-23 14:47:27" + }, + { + "name": "symfony/yaml", + "version": "v2.7.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "eca9019c88fbe250164affd107bc8057771f3f4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/eca9019c88fbe250164affd107bc8057771f3f4d", + "reference": "eca9019c88fbe250164affd107bc8057771f3f4d", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2015-10-11 09:39:48" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php new file mode 100644 index 0000000..5d6a2da --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php @@ -0,0 +1,146 @@ +beConstructedWith(array(42, 'zet', $object)); + + $class = get_class($object->getWrappedObject()); + $hash = spl_object_hash($object->getWrappedObject()); + + $this->__toString()->shouldReturn("exact(42), exact(\"zet\"), exact($class:$hash Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))"); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $token1 + * @param \Prophecy\Argument\Token\TokenInterface $token2 + * @param \Prophecy\Argument\Token\TokenInterface $token3 + */ + function it_generates_string_representation_from_all_tokens_imploded($token1, $token2, $token3) + { + $token1->__toString()->willReturn('token_1'); + $token2->__toString()->willReturn('token_2'); + $token3->__toString()->willReturn('token_3'); + + $this->beConstructedWith(array($token1, $token2, $token3)); + $this->__toString()->shouldReturn('token_1, token_2, token_3'); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $token + */ + function it_exposes_list_of_tokens($token) + { + $this->beConstructedWith(array($token)); + + $this->getTokens()->shouldReturn(array($token)); + } + + function it_returns_score_of_1_if_there_are_no_tokens_and_arguments() + { + $this->beConstructedWith(array()); + + $this->scoreArguments(array())->shouldReturn(1); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $token1 + * @param \Prophecy\Argument\Token\TokenInterface $token2 + * @param \Prophecy\Argument\Token\TokenInterface $token3 + */ + function it_should_return_match_score_based_on_all_tokens_score($token1, $token2, $token3) + { + $token1->scoreArgument('one')->willReturn(3); + $token1->isLast()->willReturn(false); + $token2->scoreArgument(2)->willReturn(5); + $token2->isLast()->willReturn(false); + $token3->scoreArgument($obj = new \stdClass())->willReturn(10); + $token3->isLast()->willReturn(false); + + $this->beConstructedWith(array($token1, $token2, $token3)); + $this->scoreArguments(array('one', 2, $obj))->shouldReturn(18); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $token1 + * @param \Prophecy\Argument\Token\TokenInterface $token2 + * @param \Prophecy\Argument\Token\TokenInterface $token3 + */ + function it_returns_false_if_there_is_less_arguments_than_tokens($token1, $token2, $token3) + { + $token1->scoreArgument('one')->willReturn(3); + $token1->isLast()->willReturn(false); + $token2->scoreArgument(2)->willReturn(5); + $token2->isLast()->willReturn(false); + $token3->scoreArgument(null)->willReturn(false); + $token3->isLast()->willReturn(false); + + $this->beConstructedWith(array($token1, $token2, $token3)); + $this->scoreArguments(array('one', 2))->shouldReturn(false); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $token1 + * @param \Prophecy\Argument\Token\TokenInterface $token2 + * @param \Prophecy\Argument\Token\TokenInterface $token3 + */ + function it_returns_false_if_there_is_less_tokens_than_arguments($token1, $token2, $token3) + { + $token1->scoreArgument('one')->willReturn(3); + $token1->isLast()->willReturn(false); + $token2->scoreArgument(2)->willReturn(5); + $token2->isLast()->willReturn(false); + $token3->scoreArgument($obj = new \stdClass())->willReturn(10); + $token3->isLast()->willReturn(false); + + $this->beConstructedWith(array($token1, $token2, $token3)); + $this->scoreArguments(array('one', 2, $obj, 4))->shouldReturn(false); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $token1 + * @param \Prophecy\Argument\Token\TokenInterface $token2 + * @param \Prophecy\Argument\Token\TokenInterface $token3 + */ + function it_should_return_false_if_one_of_the_tokens_returns_false($token1, $token2, $token3) + { + $token1->scoreArgument('one')->willReturn(3); + $token1->isLast()->willReturn(false); + $token2->scoreArgument(2)->willReturn(false); + $token2->isLast()->willReturn(false); + $token3->scoreArgument($obj = new \stdClass())->willReturn(10); + $token3->isLast()->willReturn(false); + + $this->beConstructedWith(array($token1, $token2, $token3)); + $this->scoreArguments(array('one', 2, $obj))->shouldReturn(false); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $token1 + * @param \Prophecy\Argument\Token\TokenInterface $token2 + * @param \Prophecy\Argument\Token\TokenInterface $token3 + */ + function it_should_calculate_score_until_last_token($token1, $token2, $token3) + { + $token1->scoreArgument('one')->willReturn(3); + $token1->isLast()->willReturn(false); + + $token2->scoreArgument(2)->willReturn(7); + $token2->isLast()->willReturn(true); + + $token3->scoreArgument($obj = new \stdClass())->willReturn(10); + $token3->isLast()->willReturn(false); + + $this->beConstructedWith(array($token1, $token2, $token3)); + $this->scoreArguments(array('one', 2, $obj))->shouldReturn(10); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php new file mode 100644 index 0000000..a43e923 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php @@ -0,0 +1,28 @@ +shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + function its_string_representation_is_star() + { + $this->__toString()->shouldReturn('*'); + } + + function it_scores_any_argument_as_3() + { + $this->scoreArgument(42)->shouldReturn(3); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php new file mode 100644 index 0000000..c29076f --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php @@ -0,0 +1,28 @@ +shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_last() + { + $this->shouldBeLast(); + } + + function its_string_representation_is_star_with_followup() + { + $this->__toString()->shouldReturn('* [, ...]'); + } + + function it_scores_any_argument_as_2() + { + $this->scoreArgument(42)->shouldReturn(2); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php new file mode 100644 index 0000000..8799d6d --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php @@ -0,0 +1,55 @@ +beConstructedWith(10.12345678, 4); + } + + function it_is_initializable() + { + $this->shouldHaveType('Prophecy\Argument\Token\ApproximateValueToken'); + } + + function it_implements_TokenInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + function it_scores_10_if_rounded_argument_matches_rounded_value() + { + $this->scoreArgument(10.12345)->shouldReturn(10); + } + + function it_does_not_score_if_rounded_argument_does_not_match_rounded_value() + { + $this->scoreArgument(10.1234)->shouldReturn(false); + } + + function it_uses_a_default_precision_of_zero() + { + $this->beConstructedWith(10.7); + $this->scoreArgument(11.4)->shouldReturn(10); + } + + function it_does_not_score_if_rounded_argument_is_not_numeric() + { + $this->scoreArgument('hello')->shouldReturn(false); + } + + function it_has_simple_string_representation() + { + $this->__toString()->shouldBe('≅10.1235'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php new file mode 100644 index 0000000..5d040d5 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php @@ -0,0 +1,64 @@ +beConstructedWith(2); + } + + function it_implements_TokenInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + function it_scores_6_if_argument_array_has_proper_count() + { + $this->scoreArgument(array(1,2))->shouldReturn(6); + } + + /** + * @param \Countable $countable + */ + function it_scores_6_if_argument_countable_object_has_proper_count($countable) + { + $countable->count()->willReturn(2); + $this->scoreArgument($countable)->shouldReturn(6); + } + + function it_does_not_score_if_argument_is_neither_array_nor_countable_object() + { + $this->scoreArgument('string')->shouldBe(false); + $this->scoreArgument(5)->shouldBe(false); + $this->scoreArgument(new \stdClass)->shouldBe(false); + } + + function it_does_not_score_if_argument_array_has_wrong_count() + { + $this->scoreArgument(array(1))->shouldReturn(false); + } + + /** + * @param \Countable $countable + */ + function it_does_not_score_if_argument_countable_object_has_wrong_count($countable) + { + $countable->count()->willReturn(3); + $this->scoreArgument($countable)->shouldReturn(false); + } + + function it_has_simple_string_representation() + { + $this->__toString()->shouldBe('count(2)'); + } + +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php new file mode 100644 index 0000000..8ff0f15 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php @@ -0,0 +1,229 @@ +beConstructedWith($key, $value); + } + + function it_implements_TokenInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + function it_holds_key_and_value($key, $value) + { + $this->getKey()->shouldBe($key); + $this->getValue()->shouldBe($value); + } + + function its_string_representation_tells_that_its_an_array_containing_the_key_value_pair($key, $value) + { + $key->__toString()->willReturn('key'); + $value->__toString()->willReturn('value'); + $this->__toString()->shouldBe('[..., key => value, ...]'); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $key + * @param \stdClass $object + */ + function it_wraps_non_token_value_into_ExactValueToken($key, $object) + { + $this->beConstructedWith($key, $object); + $this->getValue()->shouldHaveType('\Prophecy\Argument\Token\ExactValueToken'); + } + + /** + * @param \stdClass $object + * @param \Prophecy\Argument\Token\TokenInterface $value + */ + function it_wraps_non_token_key_into_ExactValueToken($object, $value) + { + $this->beConstructedWith($object, $value); + $this->getKey()->shouldHaveType('\Prophecy\Argument\Token\ExactValueToken'); + } + + function it_scores_array_half_of_combined_scores_from_key_and_value_tokens($key, $value) + { + $key->scoreArgument('key')->willReturn(4); + $value->scoreArgument('value')->willReturn(6); + $this->scoreArgument(array('key'=>'value'))->shouldBe(5); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $key + * @param \Prophecy\Argument\Token\TokenInterface $value + * @param \Iterator $object + */ + function it_scores_traversable_object_half_of_combined_scores_from_key_and_value_tokens($key, $value, $object) + { + $object->current()->will(function () use ($object) { + $object->valid()->willReturn(false); + + return 'value'; + }); + $object->key()->willReturn('key'); + $object->rewind()->willReturn(null); + $object->next()->willReturn(null); + $object->valid()->willReturn(true); + $key->scoreArgument('key')->willReturn(6); + $value->scoreArgument('value')->willReturn(2); + $this->scoreArgument($object)->shouldBe(4); + } + + /** + * @param \Prophecy\Argument\Token\AnyValuesToken $key + * @param \Prophecy\Argument\Token\TokenInterface $value + * @param \ArrayAccess $object + */ + function it_throws_exception_during_scoring_of_array_accessible_object_if_key_is_not_ExactValueToken($key, $value, $object) + { + $key->__toString()->willReturn('any_token'); + $this->beConstructedWith($key,$value); + $errorMessage = 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL. + 'But you used `any_token`.'; + $this->shouldThrow(new InvalidArgumentException($errorMessage))->duringScoreArgument($object); + } + + /** + * @param \Prophecy\Argument\Token\ExactValueToken $key + * @param \Prophecy\Argument\Token\TokenInterface $value + * @param \ArrayAccess $object + */ + function it_scores_array_accessible_object_half_of_combined_scores_from_key_and_value_tokens($key, $value, $object) + { + $object->offsetExists('key')->willReturn(true); + $object->offsetGet('key')->willReturn('value'); + $key->getValue()->willReturn('key'); + $key->scoreArgument('key')->willReturn(3); + $value->scoreArgument('value')->willReturn(1); + $this->scoreArgument($object)->shouldBe(2); + } + + /** + * @param \Prophecy\Argument\Token\AnyValuesToken $key + * @param \Prophecy\Argument\Token\TokenInterface $value + * @param \ArrayIterator $object + */ + function it_accepts_any_key_token_type_to_score_object_that_is_both_traversable_and_array_accessible($key, $value, $object) + { + $this->beConstructedWith($key, $value); + $object->current()->will(function () use ($object) { + $object->valid()->willReturn(false); + + return 'value'; + }); + $object->key()->willReturn('key'); + $object->rewind()->willReturn(null); + $object->next()->willReturn(null); + $object->valid()->willReturn(true); + $this->shouldNotThrow(new InvalidArgumentException)->duringScoreArgument($object); + } + + function it_does_not_score_if_argument_is_neither_array_nor_traversable_nor_array_accessible() + { + $this->scoreArgument('string')->shouldBe(false); + $this->scoreArgument(new \stdClass)->shouldBe(false); + } + + function it_does_not_score_empty_array() + { + $this->scoreArgument(array())->shouldBe(false); + } + + function it_does_not_score_array_if_key_and_value_tokens_do_not_score_same_entry($key, $value) + { + $argument = array(1 => 'foo', 2 => 'bar'); + $key->scoreArgument(1)->willReturn(true); + $key->scoreArgument(2)->willReturn(false); + $value->scoreArgument('foo')->willReturn(false); + $value->scoreArgument('bar')->willReturn(true); + $this->scoreArgument($argument)->shouldBe(false); + } + + /** + * @param \Iterator $object + */ + function it_does_not_score_traversable_object_without_entries($object) + { + $object->rewind()->willReturn(null); + $object->next()->willReturn(null); + $object->valid()->willReturn(false); + $this->scoreArgument($object)->shouldBe(false); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $key + * @param \Prophecy\Argument\Token\TokenInterface $value + * @param \Iterator $object + */ + function it_does_not_score_traversable_object_if_key_and_value_tokens_do_not_score_same_entry($key, $value, $object) + { + $object->current()->willReturn('foo'); + $object->current()->will(function () use ($object) { + $object->valid()->willReturn(false); + + return 'bar'; + }); + $object->key()->willReturn(1); + $object->key()->willReturn(2); + $object->rewind()->willReturn(null); + $object->next()->willReturn(null); + $object->valid()->willReturn(true); + $key->scoreArgument(1)->willReturn(true); + $key->scoreArgument(2)->willReturn(false); + $value->scoreArgument('foo')->willReturn(false); + $value->scoreArgument('bar')->willReturn(true); + $this->scoreArgument($object)->shouldBe(false); + } + + /** + * @param \Prophecy\Argument\Token\ExactValueToken $key + * @param \ArrayAccess $object + */ + function it_does_not_score_array_accessible_object_if_it_has_no_offset_with_key_token_value($key, $object) + { + $object->offsetExists('key')->willReturn(false); + $key->getValue()->willReturn('key'); + $this->scoreArgument($object)->shouldBe(false); + } + + /** + * @param \Prophecy\Argument\Token\ExactValueToken $key + * @param \Prophecy\Argument\Token\TokenInterface $value + * @param \ArrayAccess $object + */ + function it_does_not_score_array_accessible_object_if_key_and_value_tokens_do_not_score_same_entry($key, $value, $object) + { + $object->offsetExists('key')->willReturn(true); + $object->offsetGet('key')->willReturn('value'); + $key->getValue()->willReturn('key'); + $value->scoreArgument('value')->willReturn(false); + $key->scoreArgument('key')->willReturn(true); + $this->scoreArgument($object)->shouldBe(false); + } + + function its_score_is_capped_at_8($key, $value) + { + $key->scoreArgument('key')->willReturn(10); + $value->scoreArgument('value')->willReturn(10); + $this->scoreArgument(array('key'=>'value'))->shouldBe(8); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php new file mode 100644 index 0000000..8662e7d --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php @@ -0,0 +1,109 @@ +beConstructedWith($value); + } + + function it_implements_TokenInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + function it_holds_value($value) + { + $this->getValue()->shouldBe($value); + } + + function its_string_representation_tells_that_its_an_array_containing_only_value($value) + { + $value->__toString()->willReturn('value'); + $this->__toString()->shouldBe('[value, ..., value]'); + } + + /** + * @param \stdClass $stdClass + */ + function it_wraps_non_token_value_into_ExactValueToken($stdClass) + { + $this->beConstructedWith($stdClass); + $this->getValue()->shouldHaveType('Prophecy\Argument\Token\ExactValueToken'); + } + + function it_does_not_score_if_argument_is_neither_array_nor_traversable() + { + $this->scoreArgument('string')->shouldBe(false); + $this->scoreArgument(new \stdClass)->shouldBe(false); + } + + function it_does_not_score_empty_array() + { + $this->scoreArgument(array())->shouldBe(false); + } + + /** + * @param \Iterator $object + */ + function it_does_not_score_traversable_object_without_entries($object) + { + $object->rewind()->willReturn(null); + $object->next()->willReturn(null); + $object->valid()->willReturn(false); + $this->scoreArgument($object)->shouldBe(false); + } + + function it_scores_avg_of_scores_from_value_tokens($value) + { + $value->scoreArgument('value1')->willReturn(6); + $value->scoreArgument('value2')->willReturn(3); + $this->scoreArgument(array('value1', 'value2'))->shouldBe(4.5); + } + + function it_scores_false_if_entry_scores_false($value) + { + $value->scoreArgument('value1')->willReturn(6); + $value->scoreArgument('value2')->willReturn(false); + $this->scoreArgument(array('value1', 'value2'))->shouldBe(false); + } + + function it_does_not_score_array_keys($value) + { + $value->scoreArgument('value')->willReturn(6); + $value->scoreArgument('key')->shouldNotBeCalled(0); + $this->scoreArgument(array('key' => 'value'))->shouldBe(6); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $value + * @param \Iterator $object + */ + function it_scores_traversable_object_from_value_token($value, $object) + { + $object->current()->will(function ($args, $object) { + $object->valid()->willReturn(false); + + return 'value'; + }); + $object->key()->willReturn('key'); + $object->rewind()->willReturn(null); + $object->next()->willReturn(null); + $object->valid()->willReturn(true); + $value->scoreArgument('value')->willReturn(2); + $this->scoreArgument($object)->shouldBe(2); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php new file mode 100644 index 0000000..4395bf0 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php @@ -0,0 +1,42 @@ +beConstructedWith('get_class'); + } + + function it_implements_TokenInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + function it_scores_7_if_argument_matches_callback() + { + $this->beConstructedWith(function ($argument) { return 2 === $argument; }); + + $this->scoreArgument(2)->shouldReturn(7); + } + + function it_does_not_scores_if_argument_does_not_match_callback() + { + $this->beConstructedWith(function ($argument) { return 2 === $argument; }); + + $this->scoreArgument(5)->shouldReturn(false); + } + + function its_string_representation_should_tell_that_its_callback() + { + $this->__toString()->shouldReturn('callback()'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php new file mode 100644 index 0000000..9e46e02 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php @@ -0,0 +1,155 @@ +beConstructedWith(42); + } + + function it_implements_TokenInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + function it_holds_value() + { + $this->getValue()->shouldReturn(42); + } + + function it_scores_10_if_value_is_equal_to_argument() + { + $this->scoreArgument(42)->shouldReturn(10); + $this->scoreArgument('42')->shouldReturn(10); + } + + function it_scores_10_if_value_is_an_object_and_equal_to_argument() + { + $value = new \DateTime(); + $value2 = clone $value; + + $this->beConstructedWith($value); + $this->scoreArgument($value2)->shouldReturn(10); + } + + function it_does_not_scores_if_value_is_not_equal_to_argument() + { + $this->scoreArgument(50)->shouldReturn(false); + $this->scoreArgument(new \stdClass())->shouldReturn(false); + } + + function it_does_not_scores_if_value_an_object_and_is_not_equal_to_argument() + { + $value = new ExactValueTokenFixtureB('ABC'); + $value2 = new ExactValueTokenFixtureB('CBA'); + + $this->beConstructedWith($value); + $this->scoreArgument($value2)->shouldReturn(false); + } + + function it_does_not_scores_if_value_type_and_is_not_equal_to_argument() + { + $this->beConstructedWith(false); + $this->scoreArgument(0)->shouldReturn(false); + } + + function it_generates_proper_string_representation_for_integer() + { + $this->beConstructedWith(42); + $this->__toString()->shouldReturn('exact(42)'); + } + + function it_generates_proper_string_representation_for_string() + { + $this->beConstructedWith('some string'); + $this->__toString()->shouldReturn('exact("some string")'); + } + + function it_generates_single_line_representation_for_multiline_string() + { + $this->beConstructedWith("some\nstring"); + $this->__toString()->shouldReturn('exact("some\\nstring")'); + } + + function it_generates_proper_string_representation_for_double() + { + $this->beConstructedWith(42.3); + $this->__toString()->shouldReturn('exact(42.3)'); + } + + function it_generates_proper_string_representation_for_boolean_true() + { + $this->beConstructedWith(true); + $this->__toString()->shouldReturn('exact(true)'); + } + + function it_generates_proper_string_representation_for_boolean_false() + { + $this->beConstructedWith(false); + $this->__toString()->shouldReturn('exact(false)'); + } + + function it_generates_proper_string_representation_for_null() + { + $this->beConstructedWith(null); + $this->__toString()->shouldReturn('exact(null)'); + } + + function it_generates_proper_string_representation_for_empty_array() + { + $this->beConstructedWith(array()); + $this->__toString()->shouldReturn('exact([])'); + } + + function it_generates_proper_string_representation_for_array() + { + $this->beConstructedWith(array('zet', 42)); + $this->__toString()->shouldReturn('exact(["zet", 42])'); + } + + function it_generates_proper_string_representation_for_resource() + { + $resource = fopen(__FILE__, 'r'); + $this->beConstructedWith($resource); + $this->__toString()->shouldReturn('exact(stream:'.$resource.')'); + } + + /** + * @param \stdClass $object + */ + function it_generates_proper_string_representation_for_object($object) + { + $objHash = sprintf('%s:%s', + get_class($object->getWrappedObject()), + spl_object_hash($object->getWrappedObject()) + ); + + $this->beConstructedWith($object); + $this->__toString()->shouldReturn("exact($objHash Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))"); + } +} + +class ExactValueTokenFixtureA +{ + public $errors; +} + +class ExactValueTokenFixtureB extends ExactValueTokenFixtureA +{ + public $errors; + public $value = null; + + public function __construct($value) + { + $this->value = $value; + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php new file mode 100644 index 0000000..00c3a21 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php @@ -0,0 +1,152 @@ +beConstructedWith(42); + } + + function it_is_initializable() + { + $this->shouldHaveType('Prophecy\Argument\Token\IdenticalValueToken'); + } + + function it_scores_11_if_string_value_is_identical_to_argument() + { + $this->beConstructedWith('foo'); + $this->scoreArgument('foo')->shouldReturn(11); + } + + function it_scores_11_if_boolean_value_is_identical_to_argument() + { + $this->beConstructedWith(false); + $this->scoreArgument(false)->shouldReturn(11); + } + + function it_scores_11_if_integer_value_is_identical_to_argument() + { + $this->beConstructedWith(31); + $this->scoreArgument(31)->shouldReturn(11); + } + + function it_scores_11_if_float_value_is_identical_to_argument() + { + $this->beConstructedWith(31.12); + $this->scoreArgument(31.12)->shouldReturn(11); + } + + function it_scores_11_if_array_value_is_identical_to_argument() + { + $this->beConstructedWith(array('foo' => 'bar')); + $this->scoreArgument(array('foo' => 'bar'))->shouldReturn(11); + } + + function it_scores_11_if_object_value_is_identical_to_argument() + { + $object = new \stdClass(); + + $this->beConstructedWith($object); + $this->scoreArgument($object)->shouldReturn(11); + } + + function it_scores_false_if_value_is_not_identical_to_argument() + { + $this->beConstructedWith(new \stdClass()); + $this->scoreArgument('foo')->shouldReturn(false); + } + + function it_scores_false_if_object_value_is_not_the_same_instance_than_argument() + { + $this->beConstructedWith(new \stdClass()); + $this->scoreArgument(new \stdClass())->shouldReturn(false); + } + + function it_scores_false_if_integer_value_is_not_identical_to_boolean_argument() + { + $this->beConstructedWith(1); + $this->scoreArgument(true)->shouldReturn(false); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + function it_generates_proper_string_representation_for_integer() + { + $this->beConstructedWith(42); + $this->__toString()->shouldReturn('identical(42)'); + } + + function it_generates_proper_string_representation_for_string() + { + $this->beConstructedWith('some string'); + $this->__toString()->shouldReturn('identical("some string")'); + } + + function it_generates_single_line_representation_for_multiline_string() + { + $this->beConstructedWith("some\nstring"); + $this->__toString()->shouldReturn('identical("some\\nstring")'); + } + + function it_generates_proper_string_representation_for_double() + { + $this->beConstructedWith(42.3); + $this->__toString()->shouldReturn('identical(42.3)'); + } + + function it_generates_proper_string_representation_for_boolean_true() + { + $this->beConstructedWith(true); + $this->__toString()->shouldReturn('identical(true)'); + } + + function it_generates_proper_string_representation_for_boolean_false() + { + $this->beConstructedWith(false); + $this->__toString()->shouldReturn('identical(false)'); + } + + function it_generates_proper_string_representation_for_null() + { + $this->beConstructedWith(null); + $this->__toString()->shouldReturn('identical(null)'); + } + + function it_generates_proper_string_representation_for_empty_array() + { + $this->beConstructedWith(array()); + $this->__toString()->shouldReturn('identical([])'); + } + + function it_generates_proper_string_representation_for_array() + { + $this->beConstructedWith(array('zet', 42)); + $this->__toString()->shouldReturn('identical(["zet", 42])'); + } + + function it_generates_proper_string_representation_for_resource() + { + $resource = fopen(__FILE__, 'r'); + $this->beConstructedWith($resource); + $this->__toString()->shouldReturn('identical(stream:'.$resource.')'); + } + + function it_generates_proper_string_representation_for_object($object) + { + $objHash = sprintf('%s:%s', + get_class($object->getWrappedObject()), + spl_object_hash($object->getWrappedObject()) + ); + + $this->beConstructedWith($object); + $this->__toString()->shouldReturn("identical($objHash Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))"); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php new file mode 100644 index 0000000..bb5e384 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php @@ -0,0 +1,78 @@ +beConstructedWith(array()); + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_not_last() + { + $this->beConstructedWith(array()); + $this->shouldNotBeLast(); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $token1 + * @param \Prophecy\Argument\Token\TokenInterface $token2 + * @param \Prophecy\Argument\Token\TokenInterface $token3 + */ + function it_generates_string_representation_from_all_tokens_imploded($token1, $token2, $token3) + { + $token1->__toString()->willReturn('token_1'); + $token2->__toString()->willReturn('token_2'); + $token3->__toString()->willReturn('token_3'); + + $this->beConstructedWith(array($token1, $token2, $token3)); + $this->__toString()->shouldReturn('bool(token_1 AND token_2 AND token_3)'); + } + + function it_wraps_non_token_arguments_into_ExactValueToken() + { + $this->beConstructedWith(array(15, '1985')); + $this->__toString()->shouldReturn("bool(exact(15) AND exact(\"1985\"))"); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $token1 + * @param \Prophecy\Argument\Token\TokenInterface $token2 + */ + function it_scores_the_maximum_score_from_all_scores_returned_by_tokens($token1, $token2) + { + $token1->scoreArgument(1)->willReturn(10); + $token2->scoreArgument(1)->willReturn(5); + $this->beConstructedWith(array($token1, $token2)); + $this->scoreArgument(1)->shouldReturn(10); + } + + function it_does_not_score_if_there_are_no_arguments_or_tokens() + { + $this->beConstructedWith(array()); + $this->scoreArgument('any')->shouldReturn(false); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $token1 + * @param \Prophecy\Argument\Token\TokenInterface $token2 + */ + function it_does_not_score_if_either_of_tokens_does_not_score($token1, $token2) + { + $token1->scoreArgument(1)->willReturn(10); + $token1->scoreArgument(2)->willReturn(false); + + $token2->scoreArgument(1)->willReturn(false); + $token2->scoreArgument(2)->willReturn(10); + + $this->beConstructedWith(array($token1, $token2)); + + $this->scoreArgument(1)->shouldReturn(false); + $this->scoreArgument(2)->shouldReturn(false); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php new file mode 100644 index 0000000..7ce7f3d --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php @@ -0,0 +1,65 @@ +beConstructedWith($token); + } + + function it_implements_TokenInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_holds_originating_token($token) + { + $this->getOriginatingToken()->shouldReturn($token); + } + + function it_has_simple_string_representation($token) + { + $token->__toString()->willReturn('value'); + $this->__toString()->shouldBe('not(value)'); + } + + function it_wraps_non_token_argument_into_ExactValueToken() + { + $this->beConstructedWith(5); + $token = $this->getOriginatingToken(); + $token->shouldhaveType('Prophecy\Argument\Token\ExactValueToken'); + $token->getValue()->shouldBe(5); + } + + function it_scores_4_if_preset_token_does_not_match_the_argument($token) + { + $token->scoreArgument('argument')->willReturn(false); + $this->scoreArgument('argument')->shouldBe(4); + } + + function it_does_not_score_if_preset_token_matches_argument($token) + { + $token->scoreArgument('argument')->willReturn(5); + $this->scoreArgument('argument')->shouldBe(false); + } + + function it_is_last_if_preset_token_is_last($token) + { + $token->isLast()->willReturn(true); + $this->shouldBeLast(); + } + + function it_is_not_last_if_preset_token_is_not_last($token) + { + $token->isLast()->willReturn(false); + $this->shouldNotBeLast(); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php new file mode 100644 index 0000000..a783a15 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php @@ -0,0 +1,101 @@ +beConstructedWith('getName', 'stdClass'); + } + + function it_implements_TokenInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + /** + * @param \ReflectionClass $reflection + */ + function it_scores_8_if_argument_object_has_specific_method_state($reflection) + { + $reflection->getName()->willReturn('stdClass'); + + $this->scoreArgument($reflection)->shouldReturn(8); + } + + /** + * @param \stdClass $class + */ + function it_scores_8_if_argument_object_has_specific_property_state($class) + { + $class->getName = 'stdClass'; + + $this->scoreArgument($class)->shouldReturn(8); + } + + function it_does_not_score_if_argument_method_state_does_not_match() + { + $value = new ObjectStateTokenFixtureB('ABC'); + $value2 = new ObjectStateTokenFixtureB('CBA'); + + $this->beConstructedWith('getSelf', $value); + $this->scoreArgument($value2)->shouldReturn(false); + } + + /** + * @param \stdClass $class + */ + function it_does_not_score_if_argument_property_state_does_not_match($class) + { + $class->getName = 'SplFileInfo'; + + $this->scoreArgument($class)->shouldReturn(false); + } + + /** + * @param \spec\Prophecy\Argument\Token\ObjectStateTokenFixtureA $class + */ + function it_does_not_score_if_argument_object_does_not_have_method_or_property($class) + { + $this->scoreArgument($class)->shouldReturn(false); + } + + function it_does_not_score_if_argument_is_not_object() + { + $this->scoreArgument(42)->shouldReturn(false); + } + + function it_has_simple_string_representation() + { + $this->__toString()->shouldReturn('state(getName(), "stdClass")'); + } +} + +class ObjectStateTokenFixtureA +{ + public $errors; +} + +class ObjectStateTokenFixtureB extends ObjectStateTokenFixtureA +{ + public $errors; + public $value = null; + + public function __construct($value) + { + $this->value = $value; + } + + public function getSelf() + { + return $this; + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php new file mode 100644 index 0000000..c7fd265 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php @@ -0,0 +1,49 @@ +beConstructedWith('a substring'); + } + + function it_is_initializable() + { + $this->shouldHaveType('Prophecy\Argument\Token\StringContainsToken'); + } + + function it_implements_TokenInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_holds_value() + { + $this->getValue()->shouldReturn('a substring'); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + function it_scores_6_if_the_argument_contains_the_value() + { + $this->scoreArgument('Argument containing a substring')->shouldReturn(6); + } + + function it_does_not_score_if_the_argument_does_not_contain_the_value() + { + $this->scoreArgument('Argument will not match')->shouldReturn(false); + } + + function its_string_representation_shows_substring() + { + $this->__toString()->shouldReturn('contains("a substring")'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php new file mode 100644 index 0000000..ae3e26e --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php @@ -0,0 +1,62 @@ +beConstructedWith('integer'); + } + + function it_implements_TokenInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface'); + } + + function it_is_not_last() + { + $this->shouldNotBeLast(); + } + + function it_scores_5_if_argument_matches_simple_type() + { + $this->beConstructedWith('integer'); + + $this->scoreArgument(42)->shouldReturn(5); + } + + function it_does_not_scores_if_argument_does_not_match_simple_type() + { + $this->beConstructedWith('integer'); + + $this->scoreArgument(42.0)->shouldReturn(false); + } + + /** + * @param \ReflectionObject $object + */ + function it_scores_5_if_argument_is_an_instance_of_specified_class($object) + { + $this->beConstructedWith('ReflectionClass'); + + $this->scoreArgument($object)->shouldReturn(5); + } + + function it_has_simple_string_representation() + { + $this->__toString()->shouldReturn('type(integer)'); + } + + /** + * @param \Prophecy\Argument\Token\TokenInterface $interface + */ + function it_scores_5_if_argument_is_an_instance_of_specified_interface($interface) + { + $this->beConstructedWith('Prophecy\Argument\Token\TokenInterface'); + + $this->scoreArgument($interface)->shouldReturn(5); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php new file mode 100644 index 0000000..64232a4 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php @@ -0,0 +1,107 @@ +exact(42); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ExactValueToken'); + $token->getValue()->shouldReturn(42); + } + + function it_has_a_shortcut_for_any_argument_token() + { + $token = $this->any(); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\AnyValueToken'); + } + + function it_has_a_shortcut_for_multiple_arguments_token() + { + $token = $this->cetera(); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\AnyValuesToken'); + } + + function it_has_a_shortcut_for_type_token() + { + $token = $this->type('integer'); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\TypeToken'); + } + + function it_has_a_shortcut_for_callback_token() + { + $token = $this->that('get_class'); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\CallbackToken'); + } + + function it_has_a_shortcut_for_object_state_token() + { + $token = $this->which('getName', 'everzet'); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ObjectStateToken'); + } + + function it_has_a_shortcut_for_logical_and_token() + { + $token = $this->allOf('integer', 5); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\LogicalAndToken'); + } + + function it_has_a_shortcut_for_array_count_token() + { + $token = $this->size(5); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayCountToken'); + } + + function it_has_a_shortcut_for_array_entry_token() + { + $token = $this->withEntry('key', 'value'); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken'); + } + + function it_has_a_shortcut_for_array_every_entry_token() + { + $token = $this->withEveryEntry('value'); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEveryEntryToken'); + } + + function it_has_a_shortcut_for_identical_value_token() + { + $token = $this->is('value'); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\IdenticalValueToken'); + } + + function it_has_a_shortcut_for_array_entry_token_matching_any_key() + { + $token = $this->containing('value'); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken'); + $token->getKey()->shouldHaveType('Prophecy\Argument\Token\AnyValueToken'); + } + + function it_has_a_shortcut_for_array_entry_token_matching_any_value() + { + $token = $this->withKey('key'); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken'); + $token->getValue()->shouldHaveType('Prophecy\Argument\Token\AnyValueToken'); + } + + function it_has_a_shortcut_for_logical_not_token() + { + $token = $this->not('kagux'); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\LogicalNotToken'); + } + + function it_has_a_shortcut_for_string_contains_token() + { + $token = $this->containingString('string'); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\StringContainsToken'); + } + + function it_has_a_shortcut_for_approximate_token() + { + $token = $this->approximate(10); + $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ApproximateValueToken'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php new file mode 100644 index 0000000..acf8d78 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php @@ -0,0 +1,195 @@ +scoreArguments(array(5, 2, 3))->willReturn(10); + $objectProphecy->getMethodProphecies()->willReturn(array()); + + $this->makeCall($objectProphecy, 'setValues', array(5, 2, 3)); + + $calls = $this->findCalls('setValues', $wildcard); + $calls->shouldHaveCount(1); + + $calls[0]->shouldBeAnInstanceOf('Prophecy\Call\Call'); + $calls[0]->getMethodName()->shouldReturn('setValues'); + $calls[0]->getArguments()->shouldReturn(array(5, 2, 3)); + $calls[0]->getReturnValue()->shouldReturn(null); + } + + function it_returns_null_for_any_call_through_makeCall_if_no_method_prophecies_added( + $objectProphecy + ) + { + $objectProphecy->getMethodProphecies()->willReturn(array()); + + $this->makeCall($objectProphecy, 'setValues', array(5, 2, 3))->shouldReturn(null); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $method1 + * @param \Prophecy\Prophecy\MethodProphecy $method2 + * @param \Prophecy\Prophecy\MethodProphecy $method3 + * @param \Prophecy\Argument\ArgumentsWildcard $arguments1 + * @param \Prophecy\Argument\ArgumentsWildcard $arguments2 + * @param \Prophecy\Argument\ArgumentsWildcard $arguments3 + * @param \Prophecy\Promise\PromiseInterface $promise + */ + function it_executes_promise_of_method_prophecy_that_matches_signature_passed_to_makeCall( + $objectProphecy, $method1, $method2, $method3, $arguments1, $arguments2, $arguments3, + $promise + ) + { + $method1->getMethodName()->willReturn('getName'); + $method1->getArgumentsWildcard()->willReturn($arguments1); + $arguments1->scoreArguments(array('world', 'everything'))->willReturn(false); + + $method2->getMethodName()->willReturn('setTitle'); + $method2->getArgumentsWildcard()->willReturn($arguments2); + $arguments2->scoreArguments(array('world', 'everything'))->willReturn(false); + + $method3->getMethodName()->willReturn('getName'); + $method3->getArgumentsWildcard()->willReturn($arguments3); + $method3->getPromise()->willReturn($promise); + $arguments3->scoreArguments(array('world', 'everything'))->willReturn(200); + + $objectProphecy->getMethodProphecies()->willReturn(array( + 'method1' => array($method1), + 'method2' => array($method2, $method3) + )); + $objectProphecy->getMethodProphecies('getName')->willReturn(array($method1, $method3)); + $objectProphecy->reveal()->willReturn(new \stdClass()); + + $promise->execute(array('world', 'everything'), $objectProphecy->getWrappedObject(), $method3)->willReturn(42); + + $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))->shouldReturn(42); + + $calls = $this->findCalls('getName', $arguments3); + $calls->shouldHaveCount(1); + $calls[0]->getReturnValue()->shouldReturn(42); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $method1 + * @param \Prophecy\Prophecy\MethodProphecy $method2 + * @param \Prophecy\Prophecy\MethodProphecy $method3 + * @param \Prophecy\Argument\ArgumentsWildcard $arguments1 + * @param \Prophecy\Argument\ArgumentsWildcard $arguments2 + * @param \Prophecy\Argument\ArgumentsWildcard $arguments3 + * @param \Prophecy\Promise\PromiseInterface $promise + */ + function it_executes_promise_of_method_prophecy_that_matches_with_highest_score_to_makeCall( + $objectProphecy, $method1, $method2, $method3, $arguments1, $arguments2, $arguments3, + $promise + ) + { + $method1->getMethodName()->willReturn('getName'); + $method1->getArgumentsWildcard()->willReturn($arguments1); + $arguments1->scoreArguments(array('world', 'everything'))->willReturn(50); + + $method2->getMethodName()->willReturn('getName'); + $method2->getArgumentsWildcard()->willReturn($arguments2); + $method2->getPromise()->willReturn($promise); + $arguments2->scoreArguments(array('world', 'everything'))->willReturn(300); + + $method3->getMethodName()->willReturn('getName'); + $method3->getArgumentsWildcard()->willReturn($arguments3); + $arguments3->scoreArguments(array('world', 'everything'))->willReturn(200); + + $objectProphecy->getMethodProphecies()->willReturn(array( + 'method1' => array($method1), + 'method2' => array($method2, $method3) + )); + $objectProphecy->getMethodProphecies('getName')->willReturn(array( + $method1, $method2, $method3 + )); + $objectProphecy->reveal()->willReturn(new \stdClass()); + + $promise->execute(array('world', 'everything'), $objectProphecy->getWrappedObject(), $method2) + ->willReturn('second'); + + $this->makeCall($objectProphecy, 'getName', array('world', 'everything')) + ->shouldReturn('second'); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $method + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + */ + function it_throws_exception_if_call_does_not_match_any_of_defined_method_prophecies( + $objectProphecy, $method, $arguments + ) + { + $method->getMethodName()->willReturn('getName'); + $method->getArgumentsWildcard()->willReturn($arguments); + $arguments->scoreArguments(array('world', 'everything'))->willReturn(false); + $arguments->__toString()->willReturn('arg1, arg2'); + + $objectProphecy->getMethodProphecies()->willReturn(array('method1' => array($method))); + $objectProphecy->getMethodProphecies('getName')->willReturn(array($method)); + + $this->shouldThrow('Prophecy\Exception\Call\UnexpectedCallException') + ->duringMakeCall($objectProphecy, 'getName', array('world', 'everything')); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $method + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + */ + function it_returns_null_if_method_prophecy_that_matches_makeCall_arguments_has_no_promise( + $objectProphecy, $method, $arguments + ) + { + $method->getMethodName()->willReturn('getName'); + $method->getArgumentsWildcard()->willReturn($arguments); + $method->getPromise()->willReturn(null); + $arguments->scoreArguments(array('world', 'everything'))->willReturn(100); + + $objectProphecy->getMethodProphecies()->willReturn(array($method)); + $objectProphecy->getMethodProphecies('getName')->willReturn(array($method)); + + $this->makeCall($objectProphecy, 'getName', array('world', 'everything')) + ->shouldReturn(null); + } + + /** + * @param \Prophecy\Argument\ArgumentsWildcard $wildcard + */ + function it_finds_recorded_calls_by_a_method_name_and_arguments_wildcard( + $objectProphecy, $wildcard + ) + { + $objectProphecy->getMethodProphecies()->willReturn(array()); + + $this->makeCall($objectProphecy, 'getName', array('world')); + $this->makeCall($objectProphecy, 'getName', array('everything')); + $this->makeCall($objectProphecy, 'setName', array(42)); + + $wildcard->scoreArguments(array('world'))->willReturn(false); + $wildcard->scoreArguments(array('everything'))->willReturn(10); + + $calls = $this->findCalls('getName', $wildcard); + + $calls->shouldHaveCount(1); + $calls[0]->getMethodName()->shouldReturn('getName'); + $calls[0]->getArguments()->shouldReturn(array('everything')); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php new file mode 100644 index 0000000..d1a8539 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php @@ -0,0 +1,54 @@ +beConstructedWith('setValues', array(5, 2), 42, $exception, 'some_file.php', 23); + } + + function it_exposes_method_name_through_getter() + { + $this->getMethodName()->shouldReturn('setValues'); + } + + function it_exposes_arguments_through_getter() + { + $this->getArguments()->shouldReturn(array(5, 2)); + } + + function it_exposes_return_value_through_getter() + { + $this->getReturnValue()->shouldReturn(42); + } + + function it_exposes_exception_through_getter($exception) + { + $this->getException()->shouldReturn($exception); + } + + function it_exposes_file_and_line_through_getter() + { + $this->getFile()->shouldReturn('some_file.php'); + $this->getLine()->shouldReturn(23); + } + + function it_returns_shortpath_to_callPlace() + { + $this->getCallPlace()->shouldReturn('some_file.php:23'); + } + + function it_returns_unknown_as_callPlace_if_no_file_or_line_provided() + { + $this->beConstructedWith('setValues', array(), 0, null, null, null); + + $this->getCallPlace()->shouldReturn('unknown'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php new file mode 100644 index 0000000..c174e73 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php @@ -0,0 +1,39 @@ +shouldHaveType('SebastianBergmann\Comparator\Comparator'); + } + + function it_accepts_only_closures() + { + $this->accepts(123, 321)->shouldReturn(false); + $this->accepts('string', 'string')->shouldReturn(false); + $this->accepts(false, true)->shouldReturn(false); + $this->accepts(true, false)->shouldReturn(false); + $this->accepts((object)array(), (object)array())->shouldReturn(false); + $this->accepts(function(){}, (object)array())->shouldReturn(false); + $this->accepts(function(){}, (object)array())->shouldReturn(false); + + $this->accepts(function(){}, function(){})->shouldReturn(true); + } + + function it_asserts_that_all_closures_are_different() + { + $this->shouldThrow()->duringAssertEquals(function(){}, function(){}); + } + + function it_asserts_that_all_closures_are_different_even_if_its_the_same_closure() + { + $closure = function(){}; + + $this->shouldThrow()->duringAssertEquals($closure, $closure); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php new file mode 100644 index 0000000..6b13336 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php @@ -0,0 +1,20 @@ +shouldHaveType('SebastianBergmann\Comparator\Factory'); + } + + function it_should_have_ClosureComparator_registered() + { + $comparator = $this->getInstance()->getComparatorFor(function(){}, function(){}); + $comparator->shouldHaveType('Prophecy\Comparator\ClosureComparator'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php new file mode 100644 index 0000000..06bf6f1 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php @@ -0,0 +1,39 @@ +shouldHaveType('SebastianBergmann\Comparator\ObjectComparator'); + } + + function it_accepts_only_prophecy_objects() + { + $this->accepts(123, 321)->shouldReturn(false); + $this->accepts('string', 'string')->shouldReturn(false); + $this->accepts(false, true)->shouldReturn(false); + $this->accepts(true, false)->shouldReturn(false); + $this->accepts((object)array(), (object)array())->shouldReturn(false); + $this->accepts(function(){}, (object)array())->shouldReturn(false); + $this->accepts(function(){}, function(){})->shouldReturn(false); + + $prophet = new Prophet(); + $prophecy = $prophet->prophesize('Prophecy\Prophecy\ObjectProphecy'); + + $this->accepts($prophecy, $prophecy)->shouldReturn(true); + } + + function it_asserts_that_an_object_is_equal_to_its_revealed_prophecy() + { + $prophet = new Prophet(); + $prophecy = $prophet->prophesize('Prophecy\Prophecy\ObjectProphecy'); + + $this->shouldNotThrow()->duringAssertEquals($prophecy->reveal(), $prophecy); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php new file mode 100644 index 0000000..2d7d934 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php @@ -0,0 +1,59 @@ +shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface'); + } + + function its_priority_is_100() + { + $this->getPriority()->shouldReturn(100); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_supports_anything($node) + { + $this->supports($node)->shouldReturn(true); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $class + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg1 + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg2 + */ + function it_makes_all_constructor_arguments_optional($class, $method, $arg1, $arg2) + { + $class->hasMethod('__construct')->willReturn(true); + $class->getMethod('__construct')->willReturn($method); + $method->getArguments()->willReturn(array($arg1, $arg2)); + + $arg1->setDefault(null)->shouldBeCalled(); + $arg2->setDefault(null)->shouldBeCalled(); + + $method->setCode(Argument::type('string'))->shouldBeCalled(); + + $this->apply($class); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $class + */ + function it_creates_new_constructor_if_object_has_none($class) + { + $class->hasMethod('__construct')->willReturn(false); + $class->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode')) + ->shouldBeCalled(); + + $this->apply($class); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php new file mode 100644 index 0000000..8c348b8 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php @@ -0,0 +1,37 @@ +shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface'); + } + + function its_priority_is_minus_50() + { + $this->getPriority()->shouldReturn(-50); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + * @param \Prophecy\Doubler\Generator\Node\MethodNode $getterMethod + */ + function it_uses_parent_code_for_setTraceOptions($node, $method, $getterMethod) + { + $node->hasMethod('setTraceOptions')->willReturn(true); + $node->getMethod('setTraceOptions')->willReturn($method); + $node->hasMethod('getTraceOptions')->willReturn(true); + $node->getMethod('getTraceOptions')->willReturn($getterMethod); + + $method->useParentCode()->shouldBeCalled(); + $getterMethod->useParentCode()->shouldBeCalled(); + + $this->apply($node); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php new file mode 100644 index 0000000..200d961 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php @@ -0,0 +1,44 @@ +shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface'); + } + + function its_priority_is_49() + { + $this->getPriority()->shouldReturn(49); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1 + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2 + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method3 + */ + function it_will_remove_echo_and_eval_methods($node, $method1, $method2, $method3) + { + $node->removeMethod('eval')->shouldBeCalled(); + $node->removeMethod('echo')->shouldBeCalled(); + + $method1->getName()->willReturn('echo'); + $method2->getName()->willReturn('eval'); + $method3->getName()->willReturn('notKeyword'); + + $node->getMethods()->willReturn(array( + 'echo' => $method1, + 'eval' => $method2, + 'notKeyword' => $method3, + )); + + $this->apply($node); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php new file mode 100644 index 0000000..18ea23a --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php @@ -0,0 +1,104 @@ +shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface'); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_supports_anything($node) + { + $this->supports($node)->shouldReturn(true); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_discovers_api_using_phpdoc($node) + { + $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApi'); + + $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled(); + + $this->apply($node); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_ignores_existing_methods($node) + { + $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiExtended'); + + $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled(); + $node->addMethod(new MethodNode('definedMethod'))->shouldNotBeCalled(); + + $this->apply($node); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_discovers_api_using_phpdoc_from_interface($node) + { + $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplemented'); + + $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled(); + + $this->apply($node); + } + + + function it_has_50_priority() + { + $this->getPriority()->shouldReturn(50); + } +} + +/** + * @method void undefinedMethod() + */ +class MagicalApi +{ + /** + * @return void + */ + public function definedMethod() + { + + } +} + +/** + * @method void undefinedMethod() + * @method void definedMethod() + */ +class MagicalApiExtended extends MagicalApi +{ + +} + +/** + */ +class MagicalApiImplemented implements MagicalApiInterface +{ + +} + +/** + * @method void implementedMethod() + */ +interface MagicalApiInterface +{ + +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php new file mode 100644 index 0000000..c460814 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php @@ -0,0 +1,83 @@ +shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface'); + } + + function it_has_priority_of_0() + { + $this->getPriority()->shouldReturn(0); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_supports_any_class($node) + { + $this->supports($node)->shouldReturn(true); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_forces_class_to_implement_ProphecySubjectInterface($node) + { + $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface')->shouldBeCalled(); + + $node->addProperty('objectProphecy', 'private')->willReturn(null); + $node->getMethods()->willReturn(array()); + $node->hasMethod(Argument::any())->willReturn(false); + $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null); + $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null); + + $this->apply($node); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + * @param \Prophecy\Doubler\Generator\Node\MethodNode $constructor + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1 + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2 + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method3 + */ + function it_forces_all_class_methods_except_constructor_to_proxy_calls_into_prophecy_makeCall( + $node, $constructor, $method1, $method2, $method3 + ) + { + $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface')->willReturn(null); + $node->addProperty('objectProphecy', 'private')->willReturn(null); + $node->hasMethod(Argument::any())->willReturn(false); + $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null); + $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null); + + $constructor->getName()->willReturn('__construct'); + $method1->getName()->willReturn('method1'); + $method2->getName()->willReturn('method2'); + $method3->getName()->willReturn('method3'); + + $node->getMethods()->willReturn(array( + 'method1' => $method1, + 'method2' => $method2, + 'method3' => $method3, + )); + + $constructor->setCode(Argument::any())->shouldNotBeCalled(); + + $method1->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());') + ->shouldBeCalled(); + $method2->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());') + ->shouldBeCalled(); + $method3->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());') + ->shouldBeCalled(); + + $this->apply($node); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php new file mode 100644 index 0000000..4116e4d --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php @@ -0,0 +1,47 @@ +shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface'); + } + + function its_priority_is_50() + { + $this->getPriority()->shouldReturn(50); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $reflectionClassNode + * @param \Prophecy\Doubler\Generator\Node\ClassNode $anotherClassNode + */ + function it_supports_ReflectionClass_only($reflectionClassNode, $anotherClassNode) + { + $reflectionClassNode->getParentClass()->willReturn('ReflectionClass'); + $anotherClassNode->getParentClass()->willReturn('stdClass'); + + $this->supports($reflectionClassNode)->shouldReturn(true); + $this->supports($anotherClassNode)->shouldReturn(false); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $class + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg1 + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg2 + */ + function it_makes_all_newInstance_arguments_optional($class, $method, $arg1, $arg2) + { + $class->getMethod('newInstance')->willReturn($method); + $method->getArguments()->willReturn(array($arg1)); + $arg1->setDefault(null)->shouldBeCalled(); + + $this->apply($class); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php new file mode 100644 index 0000000..37fe82f --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php @@ -0,0 +1,91 @@ +shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface'); + } + + function its_priority_is_50() + { + $this->getPriority()->shouldReturn(50); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_does_not_support_nodes_without_parent_class($node) + { + $node->getParentClass()->willReturn('stdClass'); + $this->supports($node)->shouldReturn(false); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_supports_nodes_with_SplFileInfo_as_parent_class($node) + { + $node->getParentClass()->willReturn('SplFileInfo'); + $this->supports($node)->shouldReturn(true); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_supports_nodes_with_derivative_of_SplFileInfo_as_parent_class($node) + { + $node->getParentClass()->willReturn('SplFileInfo'); + $this->supports($node)->shouldReturn(true); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_adds_a_method_to_node_if_not_exists($node) + { + $node->hasMethod('__construct')->willReturn(false); + $node->addMethod(Argument::any())->shouldBeCalled(); + $node->getParentClass()->shouldBeCalled(); + + $this->apply($node); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + */ + function it_updates_existing_method_if_found($node, $method) + { + $node->hasMethod('__construct')->willReturn(true); + $node->getMethod('__construct')->willReturn($method); + $node->getParentClass()->shouldBeCalled(); + + $method->useParentCode()->shouldBeCalled(); + + $this->apply($node); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + */ + function it_should_not_supply_a_file_for_a_directory_iterator($node, $method) + { + $node->hasMethod('__construct')->willReturn(true); + $node->getMethod('__construct')->willReturn($method); + $node->getParentClass()->willReturn('DirectoryIterator'); + + $method->setCode(Argument::that(function($value) { + return strpos($value, '.php') === false; + }))->shouldBeCalled(); + + $this->apply($node); + } + +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php new file mode 100644 index 0000000..2279b72 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php @@ -0,0 +1,61 @@ +shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface'); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_supports_class_that_implements_only_Traversable($node) + { + $node->getInterfaces()->willReturn(array('Traversable')); + + $this->supports($node)->shouldReturn(true); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_does_not_support_class_that_implements_Iterator($node) + { + $node->getInterfaces()->willReturn(array('Traversable', 'Iterator')); + + $this->supports($node)->shouldReturn(false); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_does_not_support_class_that_implements_IteratorAggregate($node) + { + $node->getInterfaces()->willReturn(array('Traversable', 'IteratorAggregate')); + + $this->supports($node)->shouldReturn(false); + } + + function it_has_100_priority() + { + $this->getPriority()->shouldReturn(100); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_forces_node_to_implement_IteratorAggregate($node) + { + $node->addInterface('Iterator')->shouldBeCalled(); + + $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null); + + $this->apply($node); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php new file mode 100644 index 0000000..a39fa87 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php @@ -0,0 +1,122 @@ +beConstructedWith($mirror, $creator, $namer); + } + + function it_does_not_have_patches_by_default() + { + $this->getClassPatches()->shouldHaveCount(0); + } + + /** + * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $patch + */ + function its_registerClassPatch_adds_a_patch_to_the_doubler($patch) + { + $this->registerClassPatch($patch); + $this->getClassPatches()->shouldReturn(array($patch)); + } + + /** + * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt1 + * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt2 + * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt3 + * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt4 + */ + function its_getClassPatches_sorts_patches_by_priority($alt1, $alt2, $alt3, $alt4) + { + $alt1->getPriority()->willReturn(2); + $alt2->getPriority()->willReturn(50); + $alt3->getPriority()->willReturn(10); + $alt4->getPriority()->willReturn(0); + + $this->registerClassPatch($alt1); + $this->registerClassPatch($alt2); + $this->registerClassPatch($alt3); + $this->registerClassPatch($alt4); + + $this->getClassPatches()->shouldReturn(array($alt2, $alt3, $alt1, $alt4)); + } + + /** + * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt1 + * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt2 + * @param \ReflectionClass $class + * @param \ReflectionClass $interface1 + * @param \ReflectionClass $interface2 + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function its_double_mirrors_alterates_and_instantiates_provided_class( + $mirror, $creator, $namer, $alt1, $alt2, $class, $interface1, $interface2, $node + ) + { + $mirror->reflect($class, array($interface1, $interface2))->willReturn($node); + $alt1->supports($node)->willReturn(true); + $alt2->supports($node)->willReturn(false); + $alt1->getPriority()->willReturn(1); + $alt2->getPriority()->willReturn(2); + $namer->name($class, array($interface1, $interface2))->willReturn('SplStack'); + $class->getName()->willReturn('stdClass'); + $interface1->getName()->willReturn('ArrayAccess'); + $interface2->getName()->willReturn('Iterator'); + + $alt1->apply($node)->shouldBeCalled(); + $alt2->apply($node)->shouldNotBeCalled(); + $creator->create('SplStack', $node)->shouldBeCalled(); + + $this->registerClassPatch($alt1); + $this->registerClassPatch($alt2); + + $this->double($class, array($interface1, $interface2)) + ->shouldReturnAnInstanceOf('SplStack'); + } + + /** + * @param \ReflectionClass $class + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_double_instantiates_a_class_with_constructor_argument($mirror, $class, $node, $namer) + { + $class->getName()->willReturn('ReflectionClass'); + $mirror->reflect($class, array())->willReturn($node); + $namer->name($class, array())->willReturn('ReflectionClass'); + + $double = $this->double($class, array(), array('stdClass')); + $double->shouldBeAnInstanceOf('ReflectionClass'); + $double->getName()->shouldReturn('stdClass'); + } + + /** + * @param \ReflectionClass $class + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_can_instantiate_class_with_final_constructor($mirror, $class, $node, $namer) + { + $class->getName()->willReturn('spec\Prophecy\Doubler\WithFinalConstructor'); + $mirror->reflect($class, array())->willReturn($node); + $namer->name($class, array())->willReturn('spec\Prophecy\Doubler\WithFinalConstructor'); + + $double = $this->double($class, array()); + + $double->shouldBeAnInstanceOf('spec\Prophecy\Doubler\WithFinalConstructor'); + } +} + +class WithFinalConstructor +{ + final public function __construct() {} +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php new file mode 100644 index 0000000..b083048 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php @@ -0,0 +1,323 @@ +getParentClass()->willReturn('RuntimeException'); + $class->getInterfaces()->willReturn(array( + 'Prophecy\Doubler\Generator\MirroredInterface', 'ArrayAccess', 'ArrayIterator' + )); + $class->getProperties()->willReturn(array('name' => 'public', 'email' => 'private')); + $class->getMethods()->willReturn(array($method1, $method2, $method3)); + + $method1->getName()->willReturn('getName'); + $method1->getVisibility()->willReturn('public'); + $method1->returnsReference()->willReturn(false); + $method1->isStatic()->willReturn(true); + $method1->getArguments()->willReturn(array($argument11, $argument12)); + $method1->hasReturnType()->willReturn(true); + $method1->getReturnType()->willReturn('string'); + $method1->getCode()->willReturn('return $this->name;'); + + $method2->getName()->willReturn('getEmail'); + $method2->getVisibility()->willReturn('protected'); + $method2->returnsReference()->willReturn(false); + $method2->isStatic()->willReturn(false); + $method2->getArguments()->willReturn(array($argument21)); + $method2->hasReturnType()->willReturn(false); + $method2->getCode()->willReturn('return $this->email;'); + + $method3->getName()->willReturn('getRefValue'); + $method3->getVisibility()->willReturn('public'); + $method3->returnsReference()->willReturn(true); + $method3->isStatic()->willReturn(false); + $method3->getArguments()->willReturn(array($argument31)); + $method3->hasReturnType()->willReturn(false); + $method3->getCode()->willReturn('return $this->refValue;'); + + $argument11->getName()->willReturn('fullname'); + $argument11->getTypeHint()->willReturn('array'); + $argument11->isOptional()->willReturn(true); + $argument11->getDefault()->willReturn(null); + $argument11->isPassedByReference()->willReturn(false); + $argument11->isVariadic()->willReturn(false); + + $argument12->getName()->willReturn('class'); + $argument12->getTypeHint()->willReturn('ReflectionClass'); + $argument12->isOptional()->willReturn(false); + $argument12->isPassedByReference()->willReturn(false); + $argument12->isVariadic()->willReturn(false); + + $argument21->getName()->willReturn('default'); + $argument21->getTypeHint()->willReturn('string'); + $argument21->isOptional()->willReturn(true); + $argument21->getDefault()->willReturn('ever.zet@gmail.com'); + $argument21->isPassedByReference()->willReturn(false); + $argument21->isVariadic()->willReturn(false); + + $argument31->getName()->willReturn('refValue'); + $argument31->getTypeHint()->willReturn(null); + $argument31->isOptional()->willReturn(false); + $argument31->getDefault()->willReturn(); + $argument31->isPassedByReference()->willReturn(false); + $argument31->isVariadic()->willReturn(false); + + $code = $this->generate('CustomClass', $class); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $expected = <<<'PHP' +namespace { +class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface, \ArrayAccess, \ArrayIterator { +public $name; +private $email; + +public static function getName(array $fullname = NULL, \ReflectionClass $class): string { +return $this->name; +} +protected function getEmail(string $default = 'ever.zet@gmail.com') { +return $this->email; +} +public function &getRefValue( $refValue) { +return $this->refValue; +} + +} +} +PHP; + } else { + $expected = <<<'PHP' +namespace { +class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface, \ArrayAccess, \ArrayIterator { +public $name; +private $email; + +public static function getName(array $fullname = NULL, \ReflectionClass $class) { +return $this->name; +} +protected function getEmail(\string $default = 'ever.zet@gmail.com') { +return $this->email; +} +public function &getRefValue( $refValue) { +return $this->refValue; +} + +} +} +PHP; + } + $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n")); + $code->shouldBe($expected); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $class + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1 + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2 + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method3 + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method4 + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument1 + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument2 + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument3 + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument4 + */ + function it_generates_proper_php_code_for_variadics( + $class, $method1, $method2, $method3, $method4, $argument1, $argument2, + $argument3, $argument4 + ) + { + $class->getParentClass()->willReturn('stdClass'); + $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface')); + $class->getProperties()->willReturn(array()); + $class->getMethods()->willReturn(array( + $method1, $method2, $method3, $method4 + )); + + $method1->getName()->willReturn('variadic'); + $method1->getVisibility()->willReturn('public'); + $method1->returnsReference()->willReturn(false); + $method1->isStatic()->willReturn(false); + $method1->getArguments()->willReturn(array($argument1)); + $method1->hasReturnType()->willReturn(false); + $method1->getCode()->willReturn(''); + + $method2->getName()->willReturn('variadicByRef'); + $method2->getVisibility()->willReturn('public'); + $method2->returnsReference()->willReturn(false); + $method2->isStatic()->willReturn(false); + $method2->getArguments()->willReturn(array($argument2)); + $method2->hasReturnType()->willReturn(false); + $method2->getCode()->willReturn(''); + + $method3->getName()->willReturn('variadicWithType'); + $method3->getVisibility()->willReturn('public'); + $method3->returnsReference()->willReturn(false); + $method3->isStatic()->willReturn(false); + $method3->getArguments()->willReturn(array($argument3)); + $method3->hasReturnType()->willReturn(false); + $method3->getCode()->willReturn(''); + + $method4->getName()->willReturn('variadicWithTypeByRef'); + $method4->getVisibility()->willReturn('public'); + $method4->returnsReference()->willReturn(false); + $method4->isStatic()->willReturn(false); + $method4->getArguments()->willReturn(array($argument4)); + $method4->hasReturnType()->willReturn(false); + $method4->getCode()->willReturn(''); + + $argument1->getName()->willReturn('args'); + $argument1->getTypeHint()->willReturn(null); + $argument1->isOptional()->willReturn(false); + $argument1->isPassedByReference()->willReturn(false); + $argument1->isVariadic()->willReturn(true); + + $argument2->getName()->willReturn('args'); + $argument2->getTypeHint()->willReturn(null); + $argument2->isOptional()->willReturn(false); + $argument2->isPassedByReference()->willReturn(true); + $argument2->isVariadic()->willReturn(true); + + $argument3->getName()->willReturn('args'); + $argument3->getTypeHint()->willReturn('\ReflectionClass'); + $argument3->isOptional()->willReturn(false); + $argument3->isPassedByReference()->willReturn(false); + $argument3->isVariadic()->willReturn(true); + + $argument4->getName()->willReturn('args'); + $argument4->getTypeHint()->willReturn('\ReflectionClass'); + $argument4->isOptional()->willReturn(false); + $argument4->isPassedByReference()->willReturn(true); + $argument4->isVariadic()->willReturn(true); + + $code = $this->generate('CustomClass', $class); + $expected = <<<'PHP' +namespace { +class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface { + +public function variadic( ...$args) { + +} +public function variadicByRef( &...$args) { + +} +public function variadicWithType(\\ReflectionClass ...$args) { + +} +public function variadicWithTypeByRef(\\ReflectionClass &...$args) { + +} + +} +} +PHP; + $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n")); + $code->shouldBe($expected); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $class + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument + */ + function it_overrides_properly_methods_with_args_passed_by_reference( + $class, $method, $argument + ) + { + $class->getParentClass()->willReturn('RuntimeException'); + $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface')); + $class->getProperties()->willReturn(array()); + $class->getMethods()->willReturn(array($method)); + + $method->getName()->willReturn('getName'); + $method->getVisibility()->willReturn('public'); + $method->isStatic()->willReturn(false); + $method->getArguments()->willReturn(array($argument)); + $method->hasReturnType()->willReturn(false); + $method->returnsReference()->willReturn(false); + $method->getCode()->willReturn('return $this->name;'); + + $argument->getName()->willReturn('fullname'); + $argument->getTypeHint()->willReturn('array'); + $argument->isOptional()->willReturn(true); + $argument->getDefault()->willReturn(null); + $argument->isPassedByReference()->willReturn(true); + $argument->isVariadic()->willReturn(false); + + $code = $this->generate('CustomClass', $class); + $expected =<<<'PHP' +namespace { +class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface { + +public function getName(array &$fullname = NULL) { +return $this->name; +} + +} +} +PHP; + $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n")); + $code->shouldBe($expected); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $class + */ + function it_generates_empty_class_for_empty_ClassNode($class) + { + $class->getParentClass()->willReturn('stdClass'); + $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface')); + $class->getProperties()->willReturn(array()); + $class->getMethods()->willReturn(array()); + + $code = $this->generate('CustomClass', $class); + $expected =<<<'PHP' +namespace { +class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface { + + +} +} +PHP; + $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n")); + $code->shouldBe($expected); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $class + */ + function it_wraps_class_in_namespace_if_it_is_namespaced($class) + { + $class->getParentClass()->willReturn('stdClass'); + $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface')); + $class->getProperties()->willReturn(array()); + $class->getMethods()->willReturn(array()); + + $code = $this->generate('My\Awesome\CustomClass', $class); + $expected =<<<'PHP' +namespace My\Awesome { +class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface { + + +} +} +PHP; + $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n")); + $code->shouldBe($expected); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php new file mode 100644 index 0000000..c7b5700 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php @@ -0,0 +1,44 @@ +beConstructedWith($generator); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $class + */ + function it_evaluates_code_generated_by_ClassCodeGenerator($generator, $class) + { + $generator->generate('stdClass', $class)->shouldBeCalled()->willReturn( + 'return 42;' + ); + + $this->create('stdClass', $class)->shouldReturn(42); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $class + */ + function it_throws_an_exception_if_class_does_not_exist_after_evaluation($generator, $class) + { + $generator->generate('CustomClass', $class)->shouldBeCalled()->willReturn( + 'return 42;' + ); + + $class->getParentClass()->willReturn('stdClass'); + $class->getInterfaces()->willReturn(array('Interface1', 'Interface2')); + + $this->shouldThrow('Prophecy\Exception\Doubler\ClassCreatorException') + ->duringCreate('CustomClass', $class); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php new file mode 100644 index 0000000..de80448 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php @@ -0,0 +1,784 @@ +getName()->willReturn('Custom\ClassName'); + $class->getParentClass()->willReturn($parent); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array()); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array( + $method1, $method2, $method3 + )); + + $parent->getName()->willReturn('Custom\ParentClassName'); + + $method1->getDeclaringClass()->willReturn($class); + $method2->getDeclaringClass()->willReturn($class); + $method3->getDeclaringClass()->willReturn($class); + + $method1->getName()->willReturn('getName'); + $method2->getName()->willReturn('getSelf'); + $method3->getName()->willReturn('getParent'); + + $method1->isFinal()->willReturn(false); + $method2->isFinal()->willReturn(false); + $method3->isFinal()->willReturn(false); + + $method1->isProtected()->willReturn(false); + $method2->isProtected()->willReturn(false); + $method3->isProtected()->willReturn(false); + + $method1->isStatic()->willReturn(false); + $method2->isStatic()->willReturn(false); + $method3->isStatic()->willReturn(false); + + $method1->returnsReference()->willReturn(false); + $method2->returnsReference()->willReturn(false); + $method3->returnsReference()->willReturn(false); + + $method1->getParameters()->willReturn(array()); + $method2->getParameters()->willReturn(array()); + $method3->getParameters()->willReturn(array()); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $method1->hasReturnType()->willReturn(true); + $method1->getReturnType()->willReturn('string'); + $method2->hasReturnType()->willReturn(true); + $method2->getReturnType()->willReturn('self'); + $method3->hasReturnType()->willReturn(true); + $method3->getReturnType()->willReturn('parent'); + } + + $classNode = $this->reflect($class, array()); + $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode'); + $classNode->getParentClass()->shouldReturn('Custom\ClassName'); + + $methodNodes = $classNode->getMethods(); + $methodNodes->shouldHaveCount(3); + + $classNode->hasMethod('getName')->shouldReturn(true); + $classNode->hasMethod('getSelf')->shouldReturn(true); + $classNode->hasMethod('getParent')->shouldReturn(true); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $classNode->getMethod('getName')->getReturnType()->shouldReturn('string'); + $classNode->getMethod('getSelf')->getReturnType()->shouldReturn('\Custom\ClassName'); + $classNode->getMethod('getParent')->getReturnType()->shouldReturn('\Custom\ParentClassName'); + } + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $method + * @param ReflectionParameter $parameter + */ + function it_changes_argument_names_if_they_are_varying($class, $method, $parameter) + { + + $class->getName()->willReturn('Custom\ClassName'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method)); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array()); + + $method->getParameters()->willReturn(array($parameter)); + $method->getName()->willReturn('methodName'); + $method->isFinal()->willReturn(false); + $method->isProtected()->willReturn(false); + $method->isStatic()->willReturn(false); + $method->returnsReference()->willReturn(false); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $method->hasReturnType()->willReturn(false); + } + + $parameter->getName()->willReturn('...'); + $parameter->isDefaultValueAvailable()->willReturn(true); + $parameter->getDefaultValue()->willReturn(null); + $parameter->isPassedByReference()->willReturn(false); + $parameter->getClass()->willReturn($class); + if (version_compare(PHP_VERSION, '5.6', '>=')) { + $parameter->isVariadic()->willReturn(false); + } + + $classNode = $this->reflect($class, array()); + + $methodNodes = $classNode->getMethods(); + + $argumentNodes = $methodNodes['methodName']->getArguments(); + $argumentNode = $argumentNodes[0]; + + $argumentNode->getName()->shouldReturn('__dot_dot_dot__'); + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $method + */ + function it_reflects_protected_abstract_methods($class, $method) + { + $class->getName()->willReturn('Custom\ClassName'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array($method)); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array()); + + $method->isProtected()->willReturn(true); + $method->isStatic()->willReturn(false); + $method->getParameters()->willReturn(array()); + $method->getName()->willReturn('innerDetail'); + $method->returnsReference()->willReturn(false); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $method->hasReturnType()->willReturn(false); + } + + $classNode = $this->reflect($class, array()); + $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode'); + $classNode->getParentClass()->shouldReturn('Custom\ClassName'); + + $methodNodes = $classNode->getMethods(); + $methodNodes->shouldHaveCount(1); + + $methodNodes['innerDetail']->getVisibility()->shouldReturn('protected'); + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $method + */ + function it_reflects_public_static_methods($class, $method) + { + $class->getName()->willReturn('Custom\ClassName'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array($method)); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array()); + + $method->isProtected()->willReturn(true); + $method->isStatic()->willReturn(true); + $method->getParameters()->willReturn(array()); + $method->getName()->willReturn('innerDetail'); + $method->returnsReference()->willReturn(false); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $method->hasReturnType()->willReturn(false); + } + + $classNode = $this->reflect($class, array()); + $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode'); + $classNode->getParentClass()->shouldReturn('Custom\ClassName'); + + $methodNodes = $classNode->getMethods(); + $methodNodes->shouldHaveCount(1); + + $methodNodes['innerDetail']->getVisibility()->shouldReturn('protected'); + $methodNodes['innerDetail']->isStatic()->shouldReturn(true); + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $constructMethod + * @param ReflectionMethod $destructMethod + * @param ReflectionMethod $sleepMethod + * @param ReflectionMethod $wakeupMethod + * @param ReflectionMethod $toStringMethod + * @param ReflectionMethod $callMethod + * @param ReflectionMethod $invokeMethod + */ + function it_reflects_allowed_magic_methods($class, $constructMethod, $destructMethod, $sleepMethod, $wakeupMethod, $toStringMethod, $callMethod, $invokeMethod) + { + $class->getName()->willReturn('Custom\ClassName'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array()); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array( + $constructMethod, $destructMethod, $sleepMethod, $wakeupMethod, $toStringMethod, $callMethod, $invokeMethod + )); + + $constructMethod->getName()->willReturn('__construct'); + $destructMethod->getName()->willReturn('__destruct'); + $sleepMethod->getName()->willReturn('__sleep'); + $wakeupMethod->getName()->willReturn('__wakeup'); + $toStringMethod->getName()->willReturn('__toString'); + $callMethod->getName()->willReturn('__call'); + $invokeMethod->getName()->willReturn('__invoke'); + + $constructMethod->isFinal()->willReturn(false); + $destructMethod->isFinal()->willReturn(false); + $sleepMethod->isFinal()->willReturn(false); + $wakeupMethod->isFinal()->willReturn(false); + $toStringMethod->isFinal()->willReturn(false); + $callMethod->isFinal()->willReturn(false); + $invokeMethod->isFinal()->willReturn(false); + + $constructMethod->isProtected()->willReturn(false); + $destructMethod->isProtected()->willReturn(false); + $sleepMethod->isProtected()->willReturn(false); + $wakeupMethod->isProtected()->willReturn(false); + $toStringMethod->isProtected()->willReturn(false); + $callMethod->isProtected()->willReturn(false); + $invokeMethod->isProtected()->willReturn(false); + + $constructMethod->isStatic()->willReturn(false); + $destructMethod->isStatic()->willReturn(false); + $sleepMethod->isStatic()->willReturn(false); + $wakeupMethod->isStatic()->willReturn(false); + $toStringMethod->isStatic()->willReturn(false); + $callMethod->isStatic()->willReturn(false); + $invokeMethod->isStatic()->willReturn(false); + + $constructMethod->returnsReference()->willReturn(false); + $destructMethod->returnsReference()->willReturn(false); + $sleepMethod->returnsReference()->willReturn(false); + $wakeupMethod->returnsReference()->willReturn(false); + $toStringMethod->returnsReference()->willReturn(false); + $callMethod->returnsReference()->willReturn(false); + $invokeMethod->returnsReference()->willReturn(false); + + $constructMethod->getParameters()->willReturn(array()); + $destructMethod->getParameters()->willReturn(array()); + $sleepMethod->getParameters()->willReturn(array()); + $wakeupMethod->getParameters()->willReturn(array()); + $toStringMethod->getParameters()->willReturn(array()); + $callMethod->getParameters()->willReturn(array()); + $invokeMethod->getParameters()->willReturn(array()); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $constructMethod->hasReturnType()->willReturn(false); + $destructMethod->hasReturnType()->willReturn(false); + $sleepMethod->hasReturnType()->willReturn(false); + $wakeupMethod->hasReturnType()->willReturn(false); + $toStringMethod->hasReturnType()->willReturn(false); + $callMethod->hasReturnType()->willReturn(false); + $invokeMethod->hasReturnType()->willReturn(false); + } + + $classNode = $this->reflect($class, array()); + $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode'); + $classNode->getParentClass()->shouldReturn('Custom\ClassName'); + + $methodNodes = $classNode->getMethods(); + $methodNodes->shouldHaveCount(7); + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $method + * @param ReflectionParameter $param1 + * @param ReflectionParameter $param2 + * @param ReflectionClass $typeHint + * @param ReflectionParameter $param3 + * @param ReflectionParameter $param4 + */ + function it_properly_reads_methods_arguments_with_types( + $class, $method, $param1, $param2, $typeHint, $param3, $param4 + ) + { + $class->getName()->willReturn('Custom\ClassName'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array()); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method)); + + $method->getName()->willReturn('methodWithArgs'); + $method->isFinal()->willReturn(false); + $method->isProtected()->willReturn(true); + $method->isStatic()->willReturn(false); + $method->returnsReference()->willReturn(false); + $method->getParameters()->willReturn(array($param1, $param2, $param3, $param4)); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $method->hasReturnType()->willReturn(false); + } + + $param1->getName()->willReturn('arg_1'); + $param1->isArray()->willReturn(true); + $param1->getClass()->willReturn(null); + $param1->isDefaultValueAvailable()->willReturn(true); + $param1->isPassedByReference()->willReturn(false); + $param1->allowsNull()->willReturn(false); + $param1->getDefaultValue()->willReturn(array()); + + $param2->getName()->willReturn('arg2'); + $param2->isArray()->willReturn(false); + $param2->getClass()->willReturn($typeHint); + $param2->isDefaultValueAvailable()->willReturn(false); + $param2->isOptional()->willReturn(false); + $param2->isPassedByReference()->willReturn(false); + $param2->allowsNull()->willReturn(false); + $typeHint->getName()->willReturn('ArrayAccess'); + + $param3->getName()->willReturn('arg_3'); + $param3->isArray()->willReturn(false); + if (version_compare(PHP_VERSION, '5.4', '>=')) { + $param3->isCallable()->willReturn(true); + } + $param3->getClass()->willReturn(null); + $param3->isOptional()->willReturn(false); + $param3->isDefaultValueAvailable()->willReturn(false); + $param3->isPassedByReference()->willReturn(false); + $param3->allowsNull()->willReturn(true); + + $param4->getName()->willReturn('arg_4'); + $param4->isArray()->willReturn(false); + $param4->getClass()->willReturn($typeHint); + $param4->isPassedByReference()->willReturn(false); + $param4->allowsNull()->willReturn(true); + + if (version_compare(PHP_VERSION, '5.6', '>=')) { + $param1->isVariadic()->willReturn(false); + $param2->isVariadic()->willReturn(false); + $param3->isVariadic()->willReturn(false); + $param4->isVariadic()->willReturn(true); + } else { + $param4->isOptional()->willReturn(true); + $param4->isDefaultValueAvailable()->willReturn(false); + } + + $classNode = $this->reflect($class, array()); + $methodNodes = $classNode->getMethods(); + $argNodes = $methodNodes['methodWithArgs']->getArguments(); + + $argNodes[0]->getName()->shouldReturn('arg_1'); + $argNodes[0]->getTypeHint()->shouldReturn('array'); + $argNodes[0]->isOptional()->shouldReturn(true); + $argNodes[0]->getDefault()->shouldReturn(array()); + + $argNodes[1]->getName()->shouldReturn('arg2'); + $argNodes[1]->getTypeHint()->shouldReturn('ArrayAccess'); + $argNodes[1]->isOptional()->shouldReturn(false); + + $argNodes[2]->getName()->shouldReturn('arg_3'); + if (version_compare(PHP_VERSION, '5.4', '>=')) { + $argNodes[2]->getTypeHint()->shouldReturn('callable'); + $argNodes[2]->isOptional()->shouldReturn(true); + $argNodes[2]->getDefault()->shouldReturn(null); + } else { + $argNodes[2]->isOptional()->shouldReturn(false); + } + + $argNodes[3]->getName()->shouldReturn('arg_4'); + $argNodes[3]->getTypeHint()->shouldReturn('ArrayAccess'); + if (version_compare(PHP_VERSION, '5.6', '>=')) { + $argNodes[3]->isVariadic()->shouldReturn(true); + } else { + $argNodes[3]->isOptional()->shouldReturn(true); + $argNodes[3]->getDefault()->shouldReturn(null); + } + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $method + * @param ReflectionParameter $param1 + */ + function it_marks_required_args_without_types_as_not_optional( + $class, $method, $param1 + ) + { + $class->getName()->willReturn('Custom\ClassName'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array()); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method)); + + $method->getName()->willReturn('methodWithArgs'); + $method->isFinal()->willReturn(false); + $method->isProtected()->willReturn(false); + $method->isStatic()->willReturn(false); + $method->returnsReference()->willReturn(false); + $method->getParameters()->willReturn(array($param1)); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $method->hasReturnType()->willReturn(false); + } + + $param1->getName()->willReturn('arg_1'); + $param1->isArray()->willReturn(false); + if (version_compare(PHP_VERSION, '5.4', '>=')) { + $param1->isCallable()->willReturn(false); + } + $param1->getClass()->willReturn(null); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $param1->hasType()->willReturn(false); + } + + if (version_compare(PHP_VERSION, '5.6', '>=')) { + $param1->isVariadic()->willReturn(false); + } + $param1->isDefaultValueAvailable()->willReturn(false); + $param1->isOptional()->willReturn(false); + $param1->isPassedByReference()->willReturn(false); + $param1->allowsNull()->willReturn(true); + if (defined('HHVM_VERSION')) { + $param1->getTypehintText()->willReturn(null); + } + + $classNode = $this->reflect($class, array()); + $methodNodes = $classNode->getMethods(); + $argNodes = $methodNodes['methodWithArgs']->getArguments(); + + $argNodes[0]->isOptional()->shouldReturn(false); + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $method + * @param ReflectionParameter $param1 + * @param ReflectionParameter $param2 + * @param ReflectionParameter $param3 + * @param ReflectionClass $typeHint + */ + function it_marks_passed_by_reference_args_as_passed_by_reference( + $class, $method, $param1, $param2, $param3, $typeHint + ) + { + $class->getName()->willReturn('Custom\ClassName'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array()); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method)); + + $method->getName()->willReturn('methodWithArgs'); + $method->isFinal()->willReturn(false); + $method->isProtected()->willReturn(false); + $method->isStatic()->willReturn(false); + $method->returnsReference()->willReturn(false); + $method->getParameters()->willReturn(array($param1, $param2, $param3)); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $method->hasReturnType()->willReturn(false); + } + + $param1->getName()->willReturn('arg_1'); + $param1->isArray()->willReturn(false); + if (version_compare(PHP_VERSION, '5.4', '>=')) { + $param1->isCallable()->willReturn(false); + } + $param1->getClass()->willReturn(null); + if (version_compare(PHP_VERSION, '5.6', '>=')) { + $param1->isVariadic()->willReturn(false); + } + $param1->isDefaultValueAvailable()->willReturn(false); + $param1->isOptional()->willReturn(true); + $param1->isPassedByReference()->willReturn(true); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $param1->hasType()->willReturn(false); + } + + $param1->allowsNull()->willReturn(false); + if (defined('HHVM_VERSION')) { + $param1->getTypehintText()->willReturn(null); + } + + $param2->getName()->willReturn('arg2'); + $param2->isArray()->willReturn(false); + $param2->getClass()->willReturn($typeHint); + if (version_compare(PHP_VERSION, '5.6', '>=')) { + $param2->isVariadic()->willReturn(false); + } + $param2->isDefaultValueAvailable()->willReturn(false); + $param2->isOptional()->willReturn(false); + $param2->isPassedByReference()->willReturn(false); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $param2->hasType()->willReturn(false); + } + + $param2->allowsNull()->willReturn(false); + $typeHint->getName()->willReturn('ArrayAccess'); + + $param3->getName()->willReturn('arg2'); + $param3->isArray()->willReturn(false); + $param3->getClass()->willReturn($typeHint); + if (version_compare(PHP_VERSION, '5.6', '>=')) { + $param3->isVariadic()->willReturn(true); + } else { + $param3->isOptional()->willReturn(true); + $param3->isDefaultValueAvailable()->willReturn(false); + } + $param3->isPassedByReference()->willReturn(true); + $param3->allowsNull()->willReturn(true); + + $classNode = $this->reflect($class, array()); + $methodNodes = $classNode->getMethods(); + $argNodes = $methodNodes['methodWithArgs']->getArguments(); + + $argNodes[0]->isPassedByReference()->shouldReturn(true); + $argNodes[1]->isPassedByReference()->shouldReturn(false); + $argNodes[2]->isPassedByReference()->shouldReturn(true); + } + + /** + * @param ReflectionClass $class + */ + function it_throws_an_exception_if_class_is_final($class) + { + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(true); + $class->getName()->willReturn('Custom\ClassName'); + + $this->shouldThrow('Prophecy\Exception\Doubler\ClassMirrorException') + ->duringReflect($class, array()); + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $method + */ + function it_ignores_final_methods($class, $method) + { + $class->getName()->willReturn('Custom\ClassName'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array()); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method)); + + $method->isFinal()->willReturn(true); + $method->getName()->willReturn('finalImplementation'); + + $classNode = $this->reflect($class, array()); + $classNode->getMethods()->shouldHaveCount(0); + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $method + */ + function it_marks_final_methods_as_unextendable($class, $method) + { + $class->getName()->willReturn('Custom\ClassName'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array()); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method)); + + $method->isFinal()->willReturn(true); + $method->getName()->willReturn('finalImplementation'); + + $classNode = $this->reflect($class, array()); + $classNode->getUnextendableMethods()->shouldHaveCount(1); + $classNode->isExtendable('finalImplementation')->shouldReturn(false); + } + + /** + * @param ReflectionClass $interface + */ + function it_throws_an_exception_if_interface_provided_instead_of_class($interface) + { + $interface->isInterface()->willReturn(true); + $interface->getName()->willReturn('Custom\ClassName'); + + $this->shouldThrow('Prophecy\Exception\InvalidArgumentException') + ->duringReflect($interface, array()); + } + + /** + * @param ReflectionClass $interface1 + * @param ReflectionClass $interface2 + * @param ReflectionMethod $method1 + * @param ReflectionMethod $method2 + * @param ReflectionMethod $method3 + */ + function it_reflects_all_interfaces_methods( + $interface1, $interface2, $method1, $method2, $method3 + ) + { + $interface1->getName()->willReturn('MyInterface1'); + $interface2->getName()->willReturn('MyInterface2'); + + $interface1->isInterface()->willReturn(true); + $interface2->isInterface()->willReturn(true); + + $interface1->getMethods()->willReturn(array($method1)); + $interface2->getMethods()->willReturn(array($method2, $method3)); + + $method1->getName()->willReturn('getName'); + $method2->getName()->willReturn('isPublic'); + $method3->getName()->willReturn('isAbstract'); + + $method1->isProtected()->willReturn(false); + $method2->isProtected()->willReturn(false); + $method3->isProtected()->willReturn(false); + + $method1->returnsReference()->willReturn(false); + $method2->returnsReference()->willReturn(false); + $method3->returnsReference()->willReturn(false); + + $method1->isStatic()->willReturn(false); + $method2->isStatic()->willReturn(false); + $method3->isStatic()->willReturn(false); + + $method1->getParameters()->willReturn(array()); + $method2->getParameters()->willReturn(array()); + $method3->getParameters()->willReturn(array()); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $method1->hasReturnType()->willReturn(false); + $method2->hasReturnType()->willReturn(false); + $method3->hasReturnType()->willReturn(false); + } + + $classNode = $this->reflect(null, array($interface1, $interface2)); + + $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode'); + $classNode->getParentClass()->shouldReturn('stdClass'); + $classNode->getInterfaces()->shouldReturn(array( + 'Prophecy\Doubler\Generator\ReflectionInterface', 'MyInterface2', 'MyInterface1', + )); + + $methodNodes = $classNode->getMethods(); + $methodNodes->shouldHaveCount(3); + + $classNode->hasMethod('getName')->shouldReturn(true); + $classNode->hasMethod('isPublic')->shouldReturn(true); + $classNode->hasMethod('isAbstract')->shouldReturn(true); + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $method1 + * @param ReflectionMethod $method2 + * @param ReflectionMethod $method3 + */ + function it_ignores_virtually_private_methods($class, $method1, $method2, $method3) + { + $class->getName()->willReturn('SomeClass'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array()); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method1, $method2, $method3)); + + $method1->getName()->willReturn('_getName'); + $method2->getName()->willReturn('__toString'); + $method3->getName()->willReturn('isAbstract'); + + $method1->isFinal()->willReturn(false); + $method2->isFinal()->willReturn(false); + $method3->isFinal()->willReturn(false); + + $method1->isProtected()->willReturn(false); + $method2->isProtected()->willReturn(false); + $method3->isProtected()->willReturn(false); + + $method1->isStatic()->willReturn(false); + $method2->isStatic()->willReturn(false); + $method3->isStatic()->willReturn(false); + + $method1->returnsReference()->willReturn(false); + $method2->returnsReference()->willReturn(false); + $method3->returnsReference()->willReturn(false); + + $method1->getParameters()->willReturn(array()); + $method2->getParameters()->willReturn(array()); + $method3->getParameters()->willReturn(array()); + + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $method1->hasReturnType()->willReturn(false); + $method2->hasReturnType()->willReturn(false); + $method3->hasReturnType()->willReturn(false); + } + + $classNode = $this->reflect($class, array()); + $methodNodes = $classNode->getMethods(); + $methodNodes->shouldHaveCount(2); + + $classNode->hasMethod('isAbstract')->shouldReturn(true); + } + + /** + * @param ReflectionClass $class + * @param ReflectionMethod $method + */ + function it_does_not_throw_exception_for_virtually_private_finals($class, $method) + { + $class->getName()->willReturn('SomeClass'); + $class->isInterface()->willReturn(false); + $class->isFinal()->willReturn(false); + $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array()); + $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method)); + + $method->getName()->willReturn('__toString'); + $method->isFinal()->willReturn(true); + + $this->shouldNotThrow()->duringReflect($class, array()); + } + + /** + * @param ReflectionClass $class + */ + function it_throws_an_exception_if_class_provided_in_interfaces_list($class) + { + $class->getName()->willReturn('MyClass'); + $class->isInterface()->willReturn(false); + + $this->shouldThrow('InvalidArgumentException') + ->duringReflect(null, array($class)); + } + + function it_throws_an_exception_if_not_reflection_provided_as_interface() + { + $this->shouldThrow('InvalidArgumentException') + ->duringReflect(null, array(null)); + } + + function it_doesnt_fail_to_typehint_nonexistent_FQCN() + { + $classNode = $this->reflect(new ReflectionClass('spec\Prophecy\Doubler\Generator\OptionalDepsClass'), array()); + $method = $classNode->getMethod('iHaveAStrangeTypeHintedArg'); + $arguments = $method->getArguments(); + $arguments[0]->getTypeHint()->shouldBe('I\Simply\Am\Nonexistent'); + } + + function it_doesnt_fail_to_typehint_nonexistent_RQCN() + { + $classNode = $this->reflect(new ReflectionClass('spec\Prophecy\Doubler\Generator\OptionalDepsClass'), array()); + $method = $classNode->getMethod('iHaveAnEvenStrangerTypeHintedArg'); + $arguments = $method->getArguments(); + $arguments[0]->getTypeHint()->shouldBe('I\Simply\Am\Not'); + } + + function it_doesnt_use_scalar_typehints() + { + $classNode = $this->reflect(new ReflectionClass('ReflectionMethod'), array()); + $method = $classNode->getMethod('export'); + $arguments = $method->getArguments(); + $arguments[0]->getTypeHint()->shouldReturn(null); + $arguments[1]->getTypeHint()->shouldReturn(null); + $arguments[2]->getTypeHint()->shouldReturn(null); + } +} + +class OptionalDepsClass +{ + public function iHaveAStrangeTypeHintedArg(\I\Simply\Am\Nonexistent $class) + { + } + + public function iHaveAnEvenStrangerTypeHintedArg(Simply\Am\Not $class) + { + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php new file mode 100644 index 0000000..2c8d188 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php @@ -0,0 +1,92 @@ +beConstructedWith('name'); + } + + function it_is_not_be_passed_by_reference_by_default() + { + $this->shouldNotBePassedByReference(); + } + + function it_is_passed_by_reference_if_marked() + { + $this->setAsPassedByReference(); + $this->shouldBePassedByReference(); + } + + function it_is_not_variadic_by_default() + { + $this->shouldNotBeVariadic(); + } + + function it_is_variadic_if_marked() + { + $this->setAsVariadic(); + $this->shouldBeVariadic(); + } + + function it_does_not_have_default_by_default() + { + $this->shouldNotHaveDefault(); + } + + function it_does_not_have_default_if_variadic() + { + $this->setDefault(null); + $this->setAsVariadic(); + $this->shouldNotHaveDefault(); + } + + function it_does_have_default_if_not_variadic() + { + $this->setDefault(null); + $this->setAsVariadic(false); + $this->hasDefault()->shouldReturn(true); + } + + function it_has_name_with_which_it_was_been_constructed() + { + $this->getName()->shouldReturn('name'); + } + + function it_has_no_typehint_by_default() + { + $this->getTypeHint()->shouldReturn(null); + } + + function its_typeHint_is_mutable() + { + $this->setTypeHint('array'); + $this->getTypeHint()->shouldReturn('array'); + } + + function it_does_not_have_default_value_by_default() + { + $this->getDefault()->shouldReturn(null); + } + + function it_is_not_optional_by_default() + { + $this->isOptional()->shouldReturn(false); + } + + function its_default_is_mutable() + { + $this->setDefault(array()); + $this->getDefault()->shouldReturn(array()); + } + + function it_is_marked_as_optional_when_default_is_set() + { + $this->setDefault(null); + $this->isOptional()->shouldReturn(true); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php new file mode 100644 index 0000000..be7e102 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php @@ -0,0 +1,200 @@ +getParentClass()->shouldReturn('stdClass'); + } + + function its_parentClass_is_mutable() + { + $this->setParentClass('Exception'); + $this->getParentClass()->shouldReturn('Exception'); + } + + function its_parentClass_is_set_to_stdClass_if_user_set_null() + { + $this->setParentClass(null); + $this->getParentClass()->shouldReturn('stdClass'); + } + + function it_does_not_implement_any_interface_by_default() + { + $this->getInterfaces()->shouldHaveCount(0); + } + + function its_addInterface_adds_item_to_the_list_of_implemented_interfaces() + { + $this->addInterface('MyInterface'); + $this->getInterfaces()->shouldHaveCount(1); + } + + function its_hasInterface_returns_true_if_class_implements_interface() + { + $this->addInterface('MyInterface'); + $this->hasInterface('MyInterface')->shouldReturn(true); + } + + function its_hasInterface_returns_false_if_class_does_not_implements_interface() + { + $this->hasInterface('MyInterface')->shouldReturn(false); + } + + function it_supports_implementation_of_multiple_interfaces() + { + $this->addInterface('MyInterface'); + $this->addInterface('MySecondInterface'); + $this->getInterfaces()->shouldHaveCount(2); + } + + function it_ignores_same_interfaces_added_twice() + { + $this->addInterface('MyInterface'); + $this->addInterface('MyInterface'); + + $this->getInterfaces()->shouldHaveCount(1); + $this->getInterfaces()->shouldReturn(array('MyInterface')); + } + + function it_does_not_have_methods_by_default() + { + $this->getMethods()->shouldHaveCount(0); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1 + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2 + */ + function it_can_has_methods($method1, $method2) + { + $method1->getName()->willReturn('__construct'); + $method2->getName()->willReturn('getName'); + + $this->addMethod($method1); + $this->addMethod($method2); + + $this->getMethods()->shouldReturn(array( + '__construct' => $method1, + 'getName' => $method2 + )); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + */ + function its_hasMethod_returns_true_if_method_exists($method) + { + $method->getName()->willReturn('getName'); + + $this->addMethod($method); + + $this->hasMethod('getName')->shouldReturn(true); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + */ + function its_getMethod_returns_method_by_name($method) + { + $method->getName()->willReturn('getName'); + + $this->addMethod($method); + + $this->getMethod('getName')->shouldReturn($method); + } + + function its_hasMethod_returns_false_if_method_does_not_exists() + { + $this->hasMethod('getName')->shouldReturn(false); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + */ + function its_hasMethod_returns_false_if_method_has_been_removed($method) + { + $method->getName()->willReturn('getName'); + $this->addMethod($method); + $this->removeMethod('getName'); + + $this->hasMethod('getName')->shouldReturn(false); + } + + + function it_does_not_have_properties_by_default() + { + $this->getProperties()->shouldHaveCount(0); + } + + function it_is_able_to_have_properties() + { + $this->addProperty('title'); + $this->addProperty('text', 'private'); + $this->getProperties()->shouldReturn(array( + 'title' => 'public', + 'text' => 'private' + )); + } + + function its_addProperty_does_not_accept_unsupported_visibility() + { + $this->shouldThrow('InvalidArgumentException')->duringAddProperty('title', 'town'); + } + + function its_addProperty_lowercases_visibility_before_setting() + { + $this->addProperty('text', 'PRIVATE'); + $this->getProperties()->shouldReturn(array('text' => 'private')); + } + + function its_has_no_unextendable_methods_by_default() + { + $this->getUnextendableMethods()->shouldHaveCount(0); + } + + function its_addUnextendableMethods_adds_an_unextendable_method() + { + $this->addUnextendableMethod('testMethod'); + $this->getUnextendableMethods()->shouldHaveCount(1); + } + + function its_methods_are_extendable_by_default() + { + $this->isExtendable('testMethod')->shouldReturn(true); + } + + function its_unextendable_methods_are_not_extendable() + { + $this->addUnextendableMethod('testMethod'); + $this->isExtendable('testMethod')->shouldReturn(false); + } + + function its_addUnextendableMethods_doesnt_create_duplicates() + { + $this->addUnextendableMethod('testMethod'); + $this->addUnextendableMethod('testMethod'); + $this->getUnextendableMethods()->shouldHaveCount(1); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + */ + function it_throws_an_exception_when_adding_a_method_that_isnt_extendable($method) + { + $this->addUnextendableMethod('testMethod'); + $method->getName()->willReturn('testMethod'); + + $expectedException = new MethodNotExtendableException( + "Method `testMethod` is not extendable, so can not be added.", + "stdClass", + "testMethod" + ); + $this->shouldThrow($expectedException)->duringAddMethod($method); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php new file mode 100644 index 0000000..49bd9f5 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php @@ -0,0 +1,141 @@ +beConstructedWith('getTitle'); + } + + function it_has_a_name() + { + $this->getName()->shouldReturn('getTitle'); + } + + function it_has_public_visibility_by_default() + { + $this->getVisibility()->shouldReturn('public'); + } + + function its_visibility_is_mutable() + { + $this->setVisibility('private'); + $this->getVisibility()->shouldReturn('private'); + } + + function it_is_not_static_by_default() + { + $this->shouldNotBeStatic(); + } + + function it_does_not_return_a_reference_by_default() + { + $this->returnsReference()->shouldReturn(false); + } + + function it_should_be_settable_as_returning_a_reference_through_setter() + { + $this->setReturnsReference(); + $this->returnsReference()->shouldReturn(true); + } + + function it_should_be_settable_as_static_through_setter() + { + $this->setStatic(); + $this->shouldBeStatic(); + } + + function it_accepts_only_supported_visibilities() + { + $this->shouldThrow('InvalidArgumentException')->duringSetVisibility('stealth'); + } + + function it_lowercases_visibility_before_setting_it() + { + $this->setVisibility('Public'); + $this->getVisibility()->shouldReturn('public'); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument1 + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument2 + */ + function its_useParentCode_causes_method_to_call_parent($argument1, $argument2) + { + $argument1->getName()->willReturn('objectName'); + $argument2->getName()->willReturn('default'); + + $argument1->isVariadic()->willReturn(false); + $argument2->isVariadic()->willReturn(true); + + $this->addArgument($argument1); + $this->addArgument($argument2); + + $this->useParentCode(); + + $this->getCode()->shouldReturn( + 'return parent::getTitle($objectName, ...$default);' + ); + } + + function its_code_is_mutable() + { + $this->setCode('echo "code";'); + $this->getCode()->shouldReturn('echo "code";'); + } + + function its_reference_returning_methods_will_generate_exceptions() + { + $this->setCode('echo "code";'); + $this->setReturnsReference(); + $this->getCode()->shouldReturn("throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), 'getTitle');"); + } + + function its_setCode_provided_with_null_cleans_method_body() + { + $this->setCode(null); + $this->getCode()->shouldReturn(''); + } + + function it_is_constructable_with_code() + { + $this->beConstructedWith('getTitle', 'die();'); + $this->getCode()->shouldReturn('die();'); + } + + function it_does_not_have_arguments_by_default() + { + $this->getArguments()->shouldHaveCount(0); + } + + /** + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument1 + * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument2 + */ + function it_supports_adding_arguments($argument1, $argument2) + { + $this->addArgument($argument1); + $this->addArgument($argument2); + + $this->getArguments()->shouldReturn(array($argument1, $argument2)); + } + + function it_does_not_have_return_type_by_default() + { + $this->hasReturnType()->shouldReturn(false); + } + + function it_setReturnType_sets_return_type() + { + $returnType = 'string'; + + $this->setReturnType($returnType); + + $this->hasReturnType()->shouldReturn(true); + $this->getReturnType()->shouldReturn($returnType); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php new file mode 100644 index 0000000..7026126 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php @@ -0,0 +1,96 @@ +beConstructedWith($doubler); + } + + /** + * @param \Prophecy\Prophecy\ProphecySubjectInterface $double + */ + function it_returns_anonymous_double_instance_by_default($doubler, $double) + { + $doubler->double(null, array())->willReturn($double); + + $this->getInstance()->shouldReturn($double); + } + + /** + * @param \Prophecy\Prophecy\ProphecySubjectInterface $double + * @param \ReflectionClass $class + */ + function it_returns_class_double_instance_if_set($doubler, $double, $class) + { + $doubler->double($class, array())->willReturn($double); + + $this->setParentClass($class); + + $this->getInstance()->shouldReturn($double); + } + + /** + * @param \Prophecy\Prophecy\ProphecySubjectInterface $double1 + * @param \Prophecy\Prophecy\ProphecySubjectInterface $double2 + */ + function it_returns_same_double_instance_if_called_2_times( + $doubler, $double1, $double2 + ) + { + $doubler->double(null, array())->willReturn($double1); + $doubler->double(null, array())->willReturn($double2); + + $this->getInstance()->shouldReturn($double2); + $this->getInstance()->shouldReturn($double2); + } + + function its_setParentClass_throws_ClassNotFoundException_if_class_not_found() + { + $this->shouldThrow('Prophecy\Exception\Doubler\ClassNotFoundException') + ->duringSetParentClass('SomeUnexistingClass'); + } + + /** + * @param \Prophecy\Prophecy\ProphecySubjectInterface $double + */ + function its_setParentClass_throws_exception_if_prophecy_is_already_created( + $doubler, $double + ) + { + $doubler->double(null, array())->willReturn($double); + + $this->getInstance(); + + $this->shouldThrow('Prophecy\Exception\Doubler\DoubleException') + ->duringSetParentClass('stdClass'); + } + + function its_addInterface_throws_InterfaceNotFoundException_if_no_interface_found() + { + $this->shouldThrow('Prophecy\Exception\Doubler\InterfaceNotFoundException') + ->duringAddInterface('SomeUnexistingInterface'); + } + + /** + * @param \Prophecy\Prophecy\ProphecySubjectInterface $double + */ + function its_addInterface_throws_exception_if_prophecy_is_already_created( + $doubler, $double + ) + { + $doubler->double(null, array())->willReturn($double); + + $this->getInstance(); + + $this->shouldThrow('Prophecy\Exception\Doubler\DoubleException') + ->duringAddInterface('ArrayAccess'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php new file mode 100644 index 0000000..a3e7491 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php @@ -0,0 +1,72 @@ +getName()->willReturn('stdClass'); + $this->name($class, array())->shouldStartWith('Double\stdClass\\'); + } + + /** + * @param \ReflectionClass $class + */ + function its_name_generates_name_based_on_namespaced_class_reflection($class) + { + $class->getName()->willReturn('Some\Custom\Class'); + $this->name($class, array())->shouldStartWith('Double\Some\Custom\Class\P'); + } + + /** + * @param \ReflectionClass $interface1 + * @param \ReflectionClass $interface2 + */ + function its_name_generates_name_based_on_interface_shortnames($interface1, $interface2) + { + $interface1->getShortName()->willReturn('HandlerInterface'); + $interface2->getShortName()->willReturn('LoaderInterface'); + + $this->name(null, array($interface1, $interface2))->shouldStartWith( + 'Double\HandlerInterface\LoaderInterface\P' + ); + } + + function it_generates_proper_name_for_no_class_and_interfaces_list() + { + $this->name(null, array())->shouldStartWith('Double\stdClass\P'); + } + + /** + * @param \ReflectionClass $class + * @param \ReflectionClass $interface1 + * @param \ReflectionClass $interface2 + */ + function its_name_generates_name_based_only_on_class_if_its_available( + $class, $interface1, $interface2 + ) + { + $class->getName()->willReturn('Some\Custom\Class'); + $interface1->getShortName()->willReturn('HandlerInterface'); + $interface2->getShortName()->willReturn('LoaderInterface'); + + $this->name($class, array($interface1, $interface2))->shouldStartWith( + 'Double\Some\Custom\Class\P' + ); + } + + public function getMatchers() + { + return array( + 'startWith' => function ($subject, $string) { + return 0 === strpos($subject, $string); + }, + ); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php new file mode 100644 index 0000000..6fd1a5c --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php @@ -0,0 +1,32 @@ +beConstructedWith('msg', $objectProphecy, 'getName', array('arg1', 'arg2')); + } + + function it_is_prophecy_exception() + { + $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ObjectProphecyException'); + } + + function it_exposes_method_name_through_getter() + { + $this->getMethodName()->shouldReturn('getName'); + } + + function it_exposes_arguments_through_getter() + { + $this->getArguments()->shouldReturn(array('arg1', 'arg2')); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php new file mode 100644 index 0000000..5824138 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php @@ -0,0 +1,28 @@ +beConstructedWith('', $node); + } + + function it_is_a_prophecy_exception() + { + $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception'); + $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException'); + } + + function it_contains_a_reflected_node($node) + { + $this->getClassNode()->shouldReturn($node); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php new file mode 100644 index 0000000..21e31a3 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php @@ -0,0 +1,27 @@ +beConstructedWith('', $class); + } + + function it_is_a_prophecy_exception() + { + $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception'); + $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException'); + } + + function it_contains_a_reflected_class_link($class) + { + $this->getReflectedClass()->shouldReturn($class); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php new file mode 100644 index 0000000..251512b --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php @@ -0,0 +1,25 @@ +beConstructedWith('msg', 'CustomClass'); + } + + function it_is_a_prophecy_exception() + { + $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception'); + $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoubleException'); + } + + function its_getClassname_returns_classname() + { + $this->getClassname()->shouldReturn('CustomClass'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php new file mode 100644 index 0000000..6fe5a19 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php @@ -0,0 +1,14 @@ +shouldBeAnInstanceOf('RuntimeException'); + $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php new file mode 100644 index 0000000..ad1a439 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php @@ -0,0 +1,24 @@ +beConstructedWith('msg', 'CustomInterface'); + } + + function it_extends_ClassNotFoundException() + { + $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\ClassNotFoundException'); + } + + function its_getClassname_returns_classname() + { + $this->getClassname()->shouldReturn('CustomInterface'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php new file mode 100644 index 0000000..5028b02 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php @@ -0,0 +1,29 @@ +beConstructedWith('', 'User', 'getName'); + } + + function it_is_DoubleException() + { + $this->shouldHaveType('Prophecy\Exception\Doubler\DoubleException'); + } + + function it_has_MethodName() + { + $this->getMethodName()->shouldReturn('getName'); + } + + function it_has_classname() + { + $this->getClassName()->shouldReturn('User'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php new file mode 100644 index 0000000..a889dd7 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php @@ -0,0 +1,40 @@ +beConstructedWith('', 'User', 'getName', array(1, 2, 3)); + } + + function it_is_DoubleException() + { + $this->shouldHaveType('Prophecy\Exception\Doubler\DoubleException'); + } + + function it_has_MethodName() + { + $this->getMethodName()->shouldReturn('getName'); + } + + function it_has_classnamej() + { + $this->getClassname()->shouldReturn('User'); + } + + function it_has_an_arguments_list() + { + $this->getArguments()->shouldReturn(array(1, 2, 3)); + } + + function it_has_a_default_null_argument_list() + { + $this->beConstructedWith('', 'User', 'getName'); + $this->getArguments()->shouldReturn(null); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php new file mode 100644 index 0000000..22a5ebd --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php @@ -0,0 +1,57 @@ +beConstructedWith(null); + } + + function it_is_prediction_exception() + { + $this->shouldBeAnInstanceOf('RuntimeException'); + $this->shouldBeAnInstanceOf('Prophecy\Exception\Prediction\PredictionException'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + */ + function it_can_store_objectProphecy_link($object) + { + $this->setObjectProphecy($object); + $this->getObjectProphecy()->shouldReturn($object); + } + + function it_should_not_have_exceptions_at_the_beginning() + { + $this->getExceptions()->shouldHaveCount(0); + } + + /** + * @param \Prophecy\Exception\Prediction\PredictionException $exception + */ + function it_should_append_exception_through_append_method($exception) + { + $exception->getMessage()->willReturn('Exception #1'); + + $this->append($exception); + + $this->getExceptions()->shouldReturn(array($exception)); + } + + /** + * @param \Prophecy\Exception\Prediction\PredictionException $exception + */ + function it_should_update_message_during_append($exception) + { + $exception->getMessage()->willReturn('Exception #1'); + + $this->append($exception); + + $this->getMessage()->shouldReturn(" Exception #1"); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php new file mode 100644 index 0000000..473f1a2 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php @@ -0,0 +1,29 @@ +getObjectProphecy()->willReturn($objectProphecy); + + $this->beConstructedWith('message', $methodProphecy); + } + + function it_is_PredictionException() + { + $this->shouldHaveType('Prophecy\Exception\Prediction\PredictionException'); + } + + function it_extends_MethodProphecyException() + { + $this->shouldHaveType('Prophecy\Exception\Prophecy\MethodProphecyException'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php new file mode 100644 index 0000000..adad975 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php @@ -0,0 +1,31 @@ +getObjectProphecy()->willReturn($objectProphecy); + + $this->beConstructedWith('message', $methodProphecy, 5, array($call1, $call2)); + } + + function it_extends_UnexpectedCallsException() + { + $this->shouldBeAnInstanceOf('Prophecy\Exception\Prediction\UnexpectedCallsException'); + } + + function it_should_expose_expectedCount_through_getter() + { + $this->getExpectedCount()->shouldReturn(5); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php new file mode 100644 index 0000000..c0fe24d --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php @@ -0,0 +1,36 @@ +getObjectProphecy()->willReturn($objectProphecy); + + $this->beConstructedWith('message', $methodProphecy, array($call1, $call2)); + } + + function it_is_PredictionException() + { + $this->shouldHaveType('Prophecy\Exception\Prediction\PredictionException'); + } + + function it_extends_MethodProphecyException() + { + $this->shouldHaveType('Prophecy\Exception\Prophecy\MethodProphecyException'); + } + + function it_should_expose_calls_list_through_getter($call1, $call2) + { + $this->getCalls()->shouldReturn(array($call1, $call2)); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php new file mode 100644 index 0000000..97cf9e1 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php @@ -0,0 +1,30 @@ +getObjectProphecy()->willReturn($objectProphecy); + + $this->beConstructedWith('message', $methodProphecy); + } + + function it_extends_DoubleException() + { + $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ObjectProphecyException'); + } + + function it_holds_a_stub_reference($methodProphecy) + { + $this->getMethodProphecy()->shouldReturn($methodProphecy); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php new file mode 100644 index 0000000..bcacfed --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php @@ -0,0 +1,27 @@ +beConstructedWith('message', $objectProphecy); + } + + function it_should_be_a_prophecy_exception() + { + $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ProphecyException'); + } + + function it_holds_double_reference($objectProphecy) + { + $this->getObjectProphecy()->shouldReturn($objectProphecy); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php new file mode 100644 index 0000000..3da8c59 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php @@ -0,0 +1,42 @@ +shouldHaveType('Prophecy\Prediction\PredictionInterface'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + * @param \Prophecy\Call\Call $call + */ + function it_does_nothing_if_there_is_more_than_one_call_been_made($object, $method, $call) + { + $this->check(array($call), $object, $method)->shouldReturn(null); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + */ + function it_throws_NoCallsException_if_no_calls_found($object, $method, $arguments) + { + $method->getObjectProphecy()->willReturn($object); + $method->getMethodName()->willReturn('getName'); + $method->getArgumentsWildcard()->willReturn($arguments); + $arguments->__toString()->willReturn('123'); + $object->reveal()->willReturn(new \stdClass()); + $object->findProphecyMethodCalls('getName', Argument::any())->willReturn(array()); + + $this->shouldThrow('Prophecy\Exception\Prediction\NoCallsException') + ->duringCheck(array(), $object, $method); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php new file mode 100644 index 0000000..c670892 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php @@ -0,0 +1,54 @@ +beConstructedWith(2); + } + + function it_is_prediction() + { + $this->shouldHaveType('Prophecy\Prediction\PredictionInterface'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + * @param \Prophecy\Call\Call $call1 + * @param \Prophecy\Call\Call $call2 + */ + function it_does_nothing_if_there_were_exact_amount_of_calls_being_made( + $object, $method, $call1, $call2 + ) + { + $this->check(array($call1, $call2), $object, $method)->shouldReturn(null); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + * @param \Prophecy\Call\Call $call + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + */ + function it_throws_UnexpectedCallsCountException_if_calls_found( + $object, $method, $call, $arguments + ) + { + $method->getObjectProphecy()->willReturn($object); + $method->getMethodName()->willReturn('getName'); + $method->getArgumentsWildcard()->willReturn($arguments); + $arguments->__toString()->willReturn('123'); + + $call->getMethodName()->willReturn('getName'); + $call->getArguments()->willReturn(array(5, 4, 'three')); + $call->getCallPlace()->willReturn('unknown'); + + $this->shouldThrow('Prophecy\Exception\Prediction\UnexpectedCallsCountException') + ->duringCheck(array($call), $object, $method); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php new file mode 100644 index 0000000..7fe475e --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php @@ -0,0 +1,36 @@ +beConstructedWith('get_class'); + } + + function it_is_prediction() + { + $this->shouldHaveType('Prophecy\Prediction\PredictionInterface'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + * @param \Prophecy\Call\Call $call + */ + function it_proxies_call_to_callback($object, $method, $call) + { + $returnFirstCallCallback = function ($calls, $object, $method) { + throw new RuntimeException; + }; + + $this->beConstructedWith($returnFirstCallCallback); + + $this->shouldThrow('RuntimeException')->duringCheck(array($call), $object, $method); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php new file mode 100644 index 0000000..a3ef9bc --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php @@ -0,0 +1,43 @@ +shouldHaveType('Prophecy\Prediction\PredictionInterface'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_does_nothing_if_there_is_no_calls_made($object, $method) + { + $this->check(array(), $object, $method)->shouldReturn(null); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + * @param \Prophecy\Call\Call $call + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + */ + function it_throws_UnexpectedCallsException_if_calls_found($object, $method, $call, $arguments) + { + $method->getObjectProphecy()->willReturn($object); + $method->getMethodName()->willReturn('getName'); + $method->getArgumentsWildcard()->willReturn($arguments); + $arguments->__toString()->willReturn('123'); + + $call->getMethodName()->willReturn('getName'); + $call->getArguments()->willReturn(array(5, 4, 'three')); + $call->getCallPlace()->willReturn('unknown'); + + $this->shouldThrow('Prophecy\Exception\Prediction\UnexpectedCallsException') + ->duringCheck(array($call), $object, $method); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php new file mode 100644 index 0000000..5d99b1b --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php @@ -0,0 +1,110 @@ +beConstructedWith('get_class'); + } + + function it_is_promise() + { + $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_should_execute_closure_callback($object, $method) + { + $firstArgumentCallback = function ($args) { + return $args[0]; + }; + + $this->beConstructedWith($firstArgumentCallback); + + $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_should_execute_static_array_callback($object, $method) + { + $firstArgumentCallback = array('spec\Prophecy\Promise\ClassCallback', 'staticCallbackMethod'); + + $this->beConstructedWith($firstArgumentCallback); + + $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_should_execute_instance_array_callback($object, $method) + { + $class = new ClassCallback(); + $firstArgumentCallback = array($class, 'callbackMethod'); + + $this->beConstructedWith($firstArgumentCallback); + + $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_should_execute_string_function_callback($object, $method) + { + $firstArgumentCallback = 'spec\Prophecy\Promise\functionCallbackFirstArgument'; + + $this->beConstructedWith($firstArgumentCallback); + + $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one'); + } + +} + +/** + * Class used to test callbackpromise + * + * @param array + * @return string + */ +class ClassCallback +{ + /** + * @param array $args + */ + function callbackMethod($args) + { + return $args[0]; + } + + /** + * @param array $args + */ + static function staticCallbackMethod($args) + { + return $args[0]; + } +} + +/** + * Callback function used to test callbackpromise + * + * @param array + * @return string + */ +function functionCallbackFirstArgument($args) +{ + return $args[0]; +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php new file mode 100644 index 0000000..4acb7bb --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php @@ -0,0 +1,41 @@ +shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_should_return_first_argument_if_provided($object, $method) + { + $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_should_return_null_if_no_arguments_provided($object, $method) + { + $this->execute(array(), $object, $method)->shouldReturn(null); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_should_return_nth_argument_if_provided($object, $method) + { + $this->beConstructedWith(1); + $this->execute(array('one', 'two'), $object, $method)->shouldReturn('two'); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php new file mode 100644 index 0000000..18bfd87 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php @@ -0,0 +1,61 @@ +beConstructedWith(array(42)); + } + + function it_is_promise() + { + $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_returns_value_it_was_constructed_with($object, $method) + { + $this->execute(array(), $object, $method)->shouldReturn(42); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_always_returns_last_value_left_in_the_return_values($object, $method) + { + $this->execute(array(), $object, $method)->shouldReturn(42); + $this->execute(array(), $object, $method)->shouldReturn(42); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_consequently_returns_multiple_values_it_was_constructed_with($object, $method) + { + $this->beConstructedWith(array(42, 24, 12)); + + $this->execute(array(), $object, $method)->shouldReturn(42); + $this->execute(array(), $object, $method)->shouldReturn(24); + $this->execute(array(), $object, $method)->shouldReturn(12); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_returns_null_if_constructed_with_empty_array($object, $method) + { + $this->beConstructedWith(array()); + + $this->execute(array(), $object, $method)->shouldReturn(null); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php new file mode 100644 index 0000000..5f44897 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php @@ -0,0 +1,58 @@ +beConstructedWith('RuntimeException'); + } + + function it_is_promise() + { + $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface'); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_instantiates_and_throws_exception_from_provided_classname($object, $method) + { + $this->beConstructedWith('InvalidArgumentException'); + + $this->shouldThrow('InvalidArgumentException') + ->duringExecute(array(), $object, $method); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_instantiates_exceptions_with_required_arguments($object, $method) + { + $this->beConstructedWith('spec\Prophecy\Promise\RequiredArgumentException'); + + $this->shouldThrow('spec\Prophecy\Promise\RequiredArgumentException') + ->duringExecute(array(), $object, $method); + } + + /** + * @param \Prophecy\Prophecy\ObjectProphecy $object + * @param \Prophecy\Prophecy\MethodProphecy $method + */ + function it_throws_provided_exception($object, $method) + { + $this->beConstructedWith($exc = new \RuntimeException('Some exception')); + + $this->shouldThrow($exc)->duringExecute(array(), $object, $method); + } +} + +class RequiredArgumentException extends \Exception +{ + final public function __construct($message, $code) {} +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php new file mode 100644 index 0000000..41ee8cd --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php @@ -0,0 +1,384 @@ +reveal()->willReturn($reflection); + + $this->beConstructedWith($objectProphecy, 'getName', null); + } + + function it_is_initializable() + { + $this->shouldHaveType('Prophecy\Prophecy\MethodProphecy'); + } + + function its_constructor_throws_MethodNotFoundException_for_unexisting_method($objectProphecy) + { + $this->shouldThrow('Prophecy\Exception\Doubler\MethodNotFoundException')->during( + '__construct', array($objectProphecy, 'getUnexisting', null) + ); + } + + /** + * @param ClassWithFinalMethod $subject + */ + function its_constructor_throws_MethodProphecyException_for_final_methods($objectProphecy, $subject) + { + $objectProphecy->reveal()->willReturn($subject); + + $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->during( + '__construct', array($objectProphecy, 'finalMethod', null) + ); + } + + function its_constructor_transforms_array_passed_as_3rd_argument_to_ArgumentsWildcard( + $objectProphecy + ) + { + $this->beConstructedWith($objectProphecy, 'getName', array(42, 33)); + + $wildcard = $this->getArgumentsWildcard(); + $wildcard->shouldNotBe(null); + $wildcard->__toString()->shouldReturn('exact(42), exact(33)'); + } + + function its_constructor_does_not_touch_third_argument_if_it_is_null($objectProphecy) + { + $this->beConstructedWith($objectProphecy, 'getName', null); + + $wildcard = $this->getArgumentsWildcard(); + $wildcard->shouldBe(null); + } + + /** + * @param \Prophecy\Promise\PromiseInterface $promise + */ + function it_records_promise_through_will_method($promise, $objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $this->will($promise); + $this->getPromise()->shouldReturn($promise); + } + + /** + * @param \Prophecy\Promise\PromiseInterface $promise + */ + function it_adds_itself_to_ObjectProphecy_during_call_to_will($objectProphecy, $promise) + { + $objectProphecy->addMethodProphecy($this)->shouldBeCalled(); + + $this->will($promise); + } + + function it_adds_ReturnPromise_during_willReturn_call($objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $this->willReturn(42); + $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ReturnPromise'); + } + + function it_adds_ThrowPromise_during_willThrow_call($objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $this->willThrow('RuntimeException'); + $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ThrowPromise'); + } + + function it_adds_ReturnArgumentPromise_during_willReturnArgument_call($objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $this->willReturnArgument(); + $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ReturnArgumentPromise'); + } + + function it_adds_ReturnArgumentPromise_during_willReturnArgument_call_with_index_argument($objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $this->willReturnArgument(1); + $promise = $this->getPromise(); + $promise->shouldBeAnInstanceOf('Prophecy\Promise\ReturnArgumentPromise'); + $promise->execute(array('one', 'two'), $objectProphecy, $this)->shouldReturn('two'); + } + + function it_adds_CallbackPromise_during_will_call_with_callback_argument($objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $callback = function () {}; + + $this->will($callback); + $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\CallbackPromise'); + } + + /** + * @param \Prophecy\Prediction\PredictionInterface $prediction + */ + function it_records_prediction_through_should_method($prediction, $objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $this->callOnWrappedObject('should', array($prediction)); + $this->getPrediction()->shouldReturn($prediction); + } + + function it_adds_CallbackPrediction_during_should_call_with_callback_argument($objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $callback = function () {}; + + $this->callOnWrappedObject('should', array($callback)); + $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallbackPrediction'); + } + + /** + * @param \Prophecy\Prediction\PredictionInterface $prediction + */ + function it_adds_itself_to_ObjectProphecy_during_call_to_should($objectProphecy, $prediction) + { + $objectProphecy->addMethodProphecy($this)->shouldBeCalled(); + + $this->callOnWrappedObject('should', array($prediction)); + } + + function it_adds_CallPrediction_during_shouldBeCalled_call($objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $this->callOnWrappedObject('shouldBeCalled', array()); + $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallPrediction'); + } + + function it_adds_NoCallsPrediction_during_shouldNotBeCalled_call($objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $this->callOnWrappedObject('shouldNotBeCalled', array()); + $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\NoCallsPrediction'); + } + + function it_adds_CallTimesPrediction_during_shouldBeCalledTimes_call($objectProphecy) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $this->callOnWrappedObject('shouldBeCalledTimes', array(5)); + $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallTimesPrediction'); + } + + /** + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + * @param \Prophecy\Prediction\PredictionInterface $prediction + * @param \Prophecy\Call\Call $call1 + * @param \Prophecy\Call\Call $call2 + */ + function it_checks_prediction_via_shouldHave_method_call( + $objectProphecy, $arguments, $prediction, $call1, $call2 + ) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled(); + $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2)); + + $this->withArguments($arguments); + $this->callOnWrappedObject('shouldHave', array($prediction)); + } + + /** + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + * @param \Prophecy\Prediction\PredictionInterface $prediction + * @param \Prophecy\Call\Call $call1 + * @param \Prophecy\Call\Call $call2 + */ + function it_sets_return_promise_during_shouldHave_call_if_none_was_set_before( + $objectProphecy, $arguments, $prediction, $call1, $call2 + ) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled(); + $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2)); + + $this->withArguments($arguments); + $this->callOnWrappedObject('shouldHave', array($prediction)); + + $this->getPromise()->shouldReturnAnInstanceOf('Prophecy\Promise\ReturnPromise'); + } + + /** + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + * @param \Prophecy\Prediction\PredictionInterface $prediction + * @param \Prophecy\Call\Call $call1 + * @param \Prophecy\Call\Call $call2 + * @param \Prophecy\Promise\PromiseInterface $promise + */ + function it_does_not_set_return_promise_during_shouldHave_call_if_it_was_set_before( + $objectProphecy, $arguments, $prediction, $call1, $call2, $promise + ) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled(); + $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2)); + + $this->will($promise); + $this->withArguments($arguments); + $this->callOnWrappedObject('shouldHave', array($prediction)); + + $this->getPromise()->shouldReturn($promise); + } + + /** + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + * @param \Prophecy\Prediction\PredictionInterface $prediction1 + * @param \Prophecy\Prediction\PredictionInterface $prediction2 + * @param \Prophecy\Call\Call $call1 + * @param \Prophecy\Call\Call $call2 + * @param \Prophecy\Promise\PromiseInterface $promise + */ + function it_records_checked_predictions( + $objectProphecy, $arguments, $prediction1, $prediction2, $call1, $call2, $promise + ) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + $prediction1->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willReturn(); + $prediction2->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willReturn(); + $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2)); + + $this->will($promise); + $this->withArguments($arguments); + $this->callOnWrappedObject('shouldHave', array($prediction1)); + $this->callOnWrappedObject('shouldHave', array($prediction2)); + + $this->getCheckedPredictions()->shouldReturn(array($prediction1, $prediction2)); + } + + /** + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + * @param \Prophecy\Prediction\PredictionInterface $prediction + * @param \Prophecy\Call\Call $call1 + * @param \Prophecy\Call\Call $call2 + * @param \Prophecy\Promise\PromiseInterface $promise + */ + function it_records_even_failed_checked_predictions( + $objectProphecy, $arguments, $prediction, $call1, $call2, $promise + ) + { + $objectProphecy->addMethodProphecy($this)->willReturn(null); + $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willThrow(new \RuntimeException()); + $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2)); + + $this->will($promise); + $this->withArguments($arguments); + + try { + $this->callOnWrappedObject('shouldHave', array($prediction)); + } catch (\Exception $e) {} + + $this->getCheckedPredictions()->shouldReturn(array($prediction)); + } + + /** + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + * @param \Prophecy\Prediction\PredictionInterface $prediction + * @param \Prophecy\Call\Call $call1 + * @param \Prophecy\Call\Call $call2 + */ + function it_checks_prediction_via_shouldHave_method_call_with_callback( + $objectProphecy, $arguments, $prediction, $call1, $call2 + ) + { + $callback = function ($calls, $object, $method) { + throw new \RuntimeException; + }; + $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2)); + + $this->withArguments($arguments); + $this->shouldThrow('RuntimeException')->duringShouldHave($callback); + } + + function it_does_nothing_during_checkPrediction_if_no_prediction_set() + { + $this->checkPrediction()->shouldReturn(null); + } + + /** + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + * @param \Prophecy\Prediction\PredictionInterface $prediction + * @param \Prophecy\Call\Call $call1 + * @param \Prophecy\Call\Call $call2 + */ + function it_checks_set_prediction_during_checkPrediction( + $objectProphecy, $arguments, $prediction, $call1, $call2 + ) + { + $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled(); + $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2)); + $objectProphecy->addMethodProphecy($this)->willReturn(null); + + $this->withArguments($arguments); + $this->callOnWrappedObject('should', array($prediction)); + $this->checkPrediction(); + } + + function it_links_back_to_ObjectProphecy_through_getter($objectProphecy) + { + $this->getObjectProphecy()->shouldReturn($objectProphecy); + } + + function it_has_MethodName() + { + $this->getMethodName()->shouldReturn('getName'); + } + + /** + * @param \Prophecy\Argument\ArgumentsWildcard $wildcard + */ + function it_contains_ArgumentsWildcard_it_was_constructed_with($objectProphecy, $wildcard) + { + $this->beConstructedWith($objectProphecy, 'getName', $wildcard); + + $this->getArgumentsWildcard()->shouldReturn($wildcard); + } + + /** + * @param \Prophecy\Argument\ArgumentsWildcard $wildcard + */ + function its_ArgumentWildcard_is_mutable_through_setter($wildcard) + { + $this->withArguments($wildcard); + + $this->getArgumentsWildcard()->shouldReturn($wildcard); + } + + function its_withArguments_transforms_passed_array_into_ArgumentsWildcard() + { + $this->withArguments(array(42, 33)); + + $wildcard = $this->getArgumentsWildcard(); + $wildcard->shouldNotBe(null); + $wildcard->__toString()->shouldReturn('exact(42), exact(33)'); + } + + function its_withArguments_throws_exception_if_wrong_arguments_provided() + { + $this->shouldThrow('Prophecy\Exception\InvalidArgumentException')->duringWithArguments(42); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php new file mode 100644 index 0000000..7e249d9 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php @@ -0,0 +1,319 @@ +beConstructedWith($lazyDouble); + + $lazyDouble->getInstance()->willReturn($double); + } + + function it_implements_ProphecyInterface() + { + $this->shouldBeAnInstanceOf('Prophecy\Prophecy\ProphecyInterface'); + } + + function it_sets_parentClass_during_willExtend_call($lazyDouble) + { + $lazyDouble->setParentClass('123')->shouldBeCalled(); + + $this->willExtend('123'); + } + + function it_adds_interface_during_willImplement_call($lazyDouble) + { + $lazyDouble->addInterface('222')->shouldBeCalled(); + + $this->willImplement('222'); + } + + function it_sets_constructor_arguments_during_willBeConstructedWith_call($lazyDouble) + { + $lazyDouble->setArguments(array(1, 2, 5))->shouldBeCalled(); + + $this->willBeConstructedWith(array(1, 2, 5)); + } + + function it_does_not_have_method_prophecies_by_default() + { + $this->getMethodProphecies()->shouldHaveCount(0); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $method1 + * @param \Prophecy\Prophecy\MethodProphecy $method2 + * @param \Prophecy\Argument\ArgumentsWildcard $arguments + */ + function it_should_get_method_prophecies_by_method_name($method1, $method2, $arguments) + { + $method1->getMethodName()->willReturn('getName'); + $method1->getArgumentsWildcard()->willReturn($arguments); + $method2->getMethodName()->willReturn('setName'); + $method2->getArgumentsWildcard()->willReturn($arguments); + + $this->addMethodProphecy($method1); + $this->addMethodProphecy($method2); + + $methods = $this->getMethodProphecies('setName'); + $methods->shouldHaveCount(1); + $methods[0]->getMethodName()->shouldReturn('setName'); + } + + function it_should_return_empty_array_if_no_method_prophecies_found() + { + $methods = $this->getMethodProphecies('setName'); + $methods->shouldHaveCount(0); + } + + /** + * @param \Prophecy\Call\CallCenter $callCenter + */ + function it_should_proxy_makeProphecyMethodCall_to_CallCenter($lazyDouble, $callCenter) + { + $this->beConstructedWith($lazyDouble, $callCenter); + + $callCenter->makeCall($this->getWrappedObject(), 'setName', array('everzet'))->willReturn(42); + + $this->makeProphecyMethodCall('setName', array('everzet'))->shouldReturn(42); + } + + /** + * @param \Prophecy\Call\CallCenter $callCenter + * @param \Prophecy\Prophecy\RevealerInterface $revealer + */ + function it_should_reveal_arguments_and_return_values_from_callCenter( + $lazyDouble, $callCenter, $revealer + ) + { + $this->beConstructedWith($lazyDouble, $callCenter, $revealer); + + $revealer->reveal(array('question'))->willReturn(array('life')); + $revealer->reveal('answer')->willReturn(42); + + $callCenter->makeCall($this->getWrappedObject(), 'setName', array('life'))->willReturn('answer'); + + $this->makeProphecyMethodCall('setName', array('question'))->shouldReturn(42); + } + + /** + * @param \Prophecy\Call\CallCenter $callCenter + * @param \Prophecy\Argument\ArgumentsWildcard $wildcard + * @param \Prophecy\Call\Call $call + */ + function it_should_proxy_getProphecyMethodCalls_to_CallCenter( + $lazyDouble, $callCenter, $wildcard, $call + ) + { + $this->beConstructedWith($lazyDouble, $callCenter); + + $callCenter->findCalls('setName', $wildcard)->willReturn(array($call)); + + $this->findProphecyMethodCalls('setName', $wildcard)->shouldReturn(array($call)); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy + * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard + */ + function its_addMethodProphecy_adds_method_prophecy( + $methodProphecy, $argumentsWildcard + ) + { + $methodProphecy->getArgumentsWildcard()->willReturn($argumentsWildcard); + $methodProphecy->getMethodName()->willReturn('getUsername'); + + $this->addMethodProphecy($methodProphecy); + + $this->getMethodProphecies()->shouldReturn(array( + 'getUsername' => array($methodProphecy) + )); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy1 + * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy2 + * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1 + * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2 + */ + function its_addMethodProphecy_handles_prophecies_with_different_arguments( + $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2 + ) + { + $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1); + $methodProphecy1->getMethodName()->willReturn('getUsername'); + + $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2); + $methodProphecy2->getMethodName()->willReturn('getUsername'); + + $this->addMethodProphecy($methodProphecy1); + $this->addMethodProphecy($methodProphecy2); + + $this->getMethodProphecies()->shouldReturn(array( + 'getUsername' => array( + $methodProphecy1, + $methodProphecy2, + ) + )); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy1 + * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy2 + * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1 + * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2 + */ + function its_addMethodProphecy_handles_prophecies_for_different_methods( + $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2 + ) + { + $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1); + $methodProphecy1->getMethodName()->willReturn('getUsername'); + + $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2); + $methodProphecy2->getMethodName()->willReturn('isUsername'); + + $this->addMethodProphecy($methodProphecy1); + $this->addMethodProphecy($methodProphecy2); + + $this->getMethodProphecies()->shouldReturn(array( + 'getUsername' => array( + $methodProphecy1 + ), + 'isUsername' => array( + $methodProphecy2 + ) + )); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy + */ + function its_addMethodProphecy_throws_exception_when_method_has_no_ArgumentsWildcard( + $methodProphecy + ) + { + $methodProphecy->getArgumentsWildcard()->willReturn(null); + $methodProphecy->getObjectProphecy()->willReturn($this); + $methodProphecy->getMethodName()->willReturn('getTitle'); + + $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->duringAddMethodProphecy( + $methodProphecy + ); + } + + function it_returns_null_after_checkPredictions_call_if_there_is_no_method_prophecies() + { + $this->checkProphecyMethodsPredictions()->shouldReturn(null); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy1 + * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy2 + * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1 + * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2 + */ + function it_throws_AggregateException_during_checkPredictions_if_predictions_fail( + $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2 + ) + { + $methodProphecy1->getMethodName()->willReturn('getName'); + $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1); + $methodProphecy1->checkPrediction() + ->willThrow('Prophecy\Exception\Prediction\AggregateException'); + + $methodProphecy2->getMethodName()->willReturn('setName'); + $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2); + $methodProphecy2->checkPrediction() + ->willThrow('Prophecy\Exception\Prediction\AggregateException'); + + $this->addMethodProphecy($methodProphecy1); + $this->addMethodProphecy($methodProphecy2); + + $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException') + ->duringCheckProphecyMethodsPredictions(); + } + + /** + * @param \Prophecy\Doubler\Doubler $doubler + * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection + */ + function it_returns_new_MethodProphecy_instance_for_arbitrary_call($doubler, $reflection) + { + $doubler->double(Argument::any())->willReturn($reflection); + + $return = $this->getProphecy(); + $return->shouldBeAnInstanceOf('Prophecy\Prophecy\MethodProphecy'); + $return->getMethodName()->shouldReturn('getProphecy'); + } + + /** + * @param \Prophecy\Doubler\Doubler $doubler + * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection + */ + function it_returns_same_MethodProphecy_for_same_registered_signature($doubler, $reflection) + { + $doubler->double(Argument::any())->willReturn($reflection); + + $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3)); + $methodProphecy2 = $this->getProphecy(1, 2, 3); + + $methodProphecy2->shouldBe($methodProphecy1); + } + + /** + * @param \Prophecy\Doubler\Doubler $doubler + * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection + */ + function it_returns_new_MethodProphecy_for_different_signatures($doubler, $reflection) + { + $doubler->double(Argument::any())->willReturn($reflection); + + $value = new ObjectProphecySpecFixtureB('ABC'); + $value2 = new ObjectProphecySpecFixtureB('CBA'); + + $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3, $value)); + $methodProphecy2 = $this->getProphecy(1, 2, 3, $value2); + + $methodProphecy2->shouldNotBe($methodProphecy1); + } + + /** + * @param \Prophecy\Doubler\Doubler $doubler + * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection + */ + function it_returns_new_MethodProphecy_for_all_callback_signatures($doubler, $reflection) + { + $doubler->double(Argument::any())->willReturn($reflection); + + $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(function(){})); + $methodProphecy2 = $this->getProphecy(function(){}); + + $methodProphecy2->shouldNotBe($methodProphecy1); + } +} + +class ObjectProphecySpecFixtureA +{ + public $errors; +} + +class ObjectProphecySpecFixtureB extends ObjectProphecySpecFixtureA +{ + public $errors; + public $value = null; + + public function __construct($value) + { + $this->value = $value; + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php new file mode 100644 index 0000000..4d83d73 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php @@ -0,0 +1,51 @@ +shouldBeAnInstanceOf('Prophecy\Prophecy\RevealerInterface'); + } + + /** + * @param \Prophecy\Prophecy\ProphecyInterface $prophecy + * @param \stdClass $object + */ + function it_reveals_single_instance_of_ProphecyInterface($prophecy, $object) + { + $prophecy->reveal()->willReturn($object); + + $this->reveal($prophecy)->shouldReturn($object); + } + + /** + * @param \Prophecy\Prophecy\ProphecyInterface $prophecy1 + * @param \Prophecy\Prophecy\ProphecyInterface $prophecy2 + * @param \stdClass $object1 + * @param \stdClass $object2 + */ + function it_reveals_instances_of_ProphecyInterface_inside_array( + $prophecy1, $prophecy2, $object1, $object2 + ) + { + $prophecy1->reveal()->willReturn($object1); + $prophecy2->reveal()->willReturn($object2); + + $this->reveal(array( + array('item' => $prophecy2), + $prophecy1 + ))->shouldReturn(array( + array('item' => $object2), + $object1 + )); + } + + function it_does_not_touch_non_prophecy_interface() + { + $this->reveal(42)->shouldReturn(42); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php new file mode 100644 index 0000000..74d5976 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php @@ -0,0 +1,91 @@ +double(null, array())->willReturn($double); + + $this->beConstructedWith($doubler); + } + + function it_constructs_new_prophecy_on_prophesize_call() + { + $prophecy = $this->prophesize(); + $prophecy->shouldBeAnInstanceOf('Prophecy\Prophecy\ObjectProphecy'); + } + + /** + * @param \Prophecy\Prophecy\ProphecySubjectInterface $newDouble + */ + function it_constructs_new_prophecy_with_parent_class_if_specified($doubler, $newDouble) + { + $doubler->double(Argument::any(), array())->willReturn($newDouble); + + $this->prophesize('Prophecy\Prophet')->reveal()->shouldReturn($newDouble); + } + + /** + * @param \Prophecy\Prophecy\ProphecySubjectInterface $newDouble + */ + function it_constructs_new_prophecy_with_interface_if_specified($doubler, $newDouble) + { + $doubler->double(null, Argument::any())->willReturn($newDouble); + + $this->prophesize('ArrayAccess')->reveal()->shouldReturn($newDouble); + } + + function it_exposes_all_created_prophecies_through_getter() + { + $prophecy1 = $this->prophesize(); + $prophecy2 = $this->prophesize(); + + $this->getProphecies()->shouldReturn(array($prophecy1, $prophecy2)); + } + + function it_does_nothing_during_checkPredictions_call_if_no_predictions_defined() + { + $this->checkPredictions()->shouldReturn(null); + } + + /** + * @param \Prophecy\Prophecy\MethodProphecy $method1 + * @param \Prophecy\Prophecy\MethodProphecy $method2 + * @param \Prophecy\Argument\ArgumentsWildcard $arguments1 + * @param \Prophecy\Argument\ArgumentsWildcard $arguments2 + */ + function it_throws_AggregateException_if_defined_predictions_fail( + $method1, $method2, $arguments1, $arguments2 + ) + { + $method1->getMethodName()->willReturn('getName'); + $method1->getArgumentsWildcard()->willReturn($arguments1); + $method1->checkPrediction()->willReturn(null); + + $method2->getMethodName()->willReturn('isSet'); + $method2->getArgumentsWildcard()->willReturn($arguments2); + $method2->checkPrediction()->willThrow( + 'Prophecy\Exception\Prediction\AggregateException' + ); + + $this->prophesize()->addMethodProphecy($method1); + $this->prophesize()->addMethodProphecy($method2); + + $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException') + ->duringCheckPredictions(); + } + + function it_exposes_doubler_through_getter($doubler) + { + $this->getDoubler()->shouldReturn($doubler); + } +} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php new file mode 100644 index 0000000..a4eef59 --- /dev/null +++ b/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php @@ -0,0 +1,97 @@ +stringify(42)->shouldReturn('42'); + } + + function it_generates_proper_string_representation_for_string() + { + $this->stringify('some string')->shouldReturn('"some string"'); + } + + function it_generates_single_line_representation_for_multiline_string() + { + $this->stringify("some\nstring")->shouldReturn('"some\\nstring"'); + } + + function it_generates_proper_string_representation_for_double() + { + $this->stringify(42.3)->shouldReturn('42.3'); + } + + function it_generates_proper_string_representation_for_boolean_true() + { + $this->stringify(true)->shouldReturn('true'); + } + + function it_generates_proper_string_representation_for_boolean_false() + { + $this->stringify(false)->shouldReturn('false'); + } + + function it_generates_proper_string_representation_for_null() + { + $this->stringify(null)->shouldReturn('null'); + } + + function it_generates_proper_string_representation_for_empty_array() + { + $this->stringify(array())->shouldReturn('[]'); + } + + function it_generates_proper_string_representation_for_array() + { + $this->stringify(array('zet', 42))->shouldReturn('["zet", 42]'); + } + + function it_generates_proper_string_representation_for_hash_containing_one_value() + { + $this->stringify(array('ever' => 'zet'))->shouldReturn('["ever" => "zet"]'); + } + + function it_generates_proper_string_representation_for_hash() + { + $this->stringify(array('ever' => 'zet', 52 => 'hey', 'num' => 42))->shouldReturn( + '["ever" => "zet", 52 => "hey", "num" => 42]' + ); + } + + function it_generates_proper_string_representation_for_resource() + { + $resource = fopen(__FILE__, 'r'); + $this->stringify($resource)->shouldReturn('stream:'.$resource); + } + + /** + * @param \stdClass $object + */ + function it_generates_proper_string_representation_for_object($object) + { + $objHash = sprintf('%s:%s', + get_class($object->getWrappedObject()), + spl_object_hash($object->getWrappedObject()) + ) . " Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n)"; + + $this->stringify($object)->shouldReturn("$objHash"); + } + + /** + * @param stdClass $object + */ + function it_generates_proper_string_representation_for_object_without_exporting($object) + { + $objHash = sprintf('%s:%s', + get_class($object->getWrappedObject()), + spl_object_hash($object->getWrappedObject()) + ); + + $this->stringify($object, false)->shouldReturn("$objHash"); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument.php b/vendor/phpspec/prophecy/src/Prophecy/Argument.php new file mode 100644 index 0000000..fde6aa9 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument.php @@ -0,0 +1,212 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy; + +use Prophecy\Argument\Token; + +/** + * Argument tokens shortcuts. + * + * @author Konstantin Kudryashov + */ +class Argument +{ + /** + * Checks that argument is exact value or object. + * + * @param mixed $value + * + * @return Token\ExactValueToken + */ + public static function exact($value) + { + return new Token\ExactValueToken($value); + } + + /** + * Checks that argument is of specific type or instance of specific class. + * + * @param string $type Type name (`integer`, `string`) or full class name + * + * @return Token\TypeToken + */ + public static function type($type) + { + return new Token\TypeToken($type); + } + + /** + * Checks that argument object has specific state. + * + * @param string $methodName + * @param mixed $value + * + * @return Token\ObjectStateToken + */ + public static function which($methodName, $value) + { + return new Token\ObjectStateToken($methodName, $value); + } + + /** + * Checks that argument matches provided callback. + * + * @param callable $callback + * + * @return Token\CallbackToken + */ + public static function that($callback) + { + return new Token\CallbackToken($callback); + } + + /** + * Matches any single value. + * + * @return Token\AnyValueToken + */ + public static function any() + { + return new Token\AnyValueToken; + } + + /** + * Matches all values to the rest of the signature. + * + * @return Token\AnyValuesToken + */ + public static function cetera() + { + return new Token\AnyValuesToken; + } + + /** + * Checks that argument matches all tokens + * + * @param mixed ... a list of tokens + * + * @return Token\LogicalAndToken + */ + public static function allOf() + { + return new Token\LogicalAndToken(func_get_args()); + } + + /** + * Checks that argument array or countable object has exact number of elements. + * + * @param integer $value array elements count + * + * @return Token\ArrayCountToken + */ + public static function size($value) + { + return new Token\ArrayCountToken($value); + } + + /** + * Checks that argument array contains (key, value) pair + * + * @param mixed $key exact value or token + * @param mixed $value exact value or token + * + * @return Token\ArrayEntryToken + */ + public static function withEntry($key, $value) + { + return new Token\ArrayEntryToken($key, $value); + } + + /** + * Checks that arguments array entries all match value + * + * @param mixed $value + * + * @return Token\ArrayEveryEntryToken + */ + public static function withEveryEntry($value) + { + return new Token\ArrayEveryEntryToken($value); + } + + /** + * Checks that argument array contains value + * + * @param mixed $value + * + * @return Token\ArrayEntryToken + */ + public static function containing($value) + { + return new Token\ArrayEntryToken(self::any(), $value); + } + + /** + * Checks that argument array has key + * + * @param mixed $key exact value or token + * + * @return Token\ArrayEntryToken + */ + public static function withKey($key) + { + return new Token\ArrayEntryToken($key, self::any()); + } + + /** + * Checks that argument does not match the value|token. + * + * @param mixed $value either exact value or argument token + * + * @return Token\LogicalNotToken + */ + public static function not($value) + { + return new Token\LogicalNotToken($value); + } + + /** + * @param string $value + * + * @return Token\StringContainsToken + */ + public static function containingString($value) + { + return new Token\StringContainsToken($value); + } + + /** + * Checks that argument is identical value. + * + * @param mixed $value + * + * @return Token\IdenticalValueToken + */ + public static function is($value) + { + return new Token\IdenticalValueToken($value); + } + + /** + * Check that argument is same value when rounding to the + * given precision. + * + * @param float $value + * @param float $precision + * + * @return Token\ApproximateValueToken + */ + public static function approximate($value, $precision = 0) + { + return new Token\ApproximateValueToken($value, $precision); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php new file mode 100644 index 0000000..a088f21 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php @@ -0,0 +1,101 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument; + +/** + * Arguments wildcarding. + * + * @author Konstantin Kudryashov + */ +class ArgumentsWildcard +{ + /** + * @var Token\TokenInterface[] + */ + private $tokens = array(); + private $string; + + /** + * Initializes wildcard. + * + * @param array $arguments Array of argument tokens or values + */ + public function __construct(array $arguments) + { + foreach ($arguments as $argument) { + if (!$argument instanceof Token\TokenInterface) { + $argument = new Token\ExactValueToken($argument); + } + + $this->tokens[] = $argument; + } + } + + /** + * Calculates wildcard match score for provided arguments. + * + * @param array $arguments + * + * @return false|int False OR integer score (higher - better) + */ + public function scoreArguments(array $arguments) + { + if (0 == count($arguments) && 0 == count($this->tokens)) { + return 1; + } + + $arguments = array_values($arguments); + $totalScore = 0; + foreach ($this->tokens as $i => $token) { + $argument = isset($arguments[$i]) ? $arguments[$i] : null; + if (1 >= $score = $token->scoreArgument($argument)) { + return false; + } + + $totalScore += $score; + + if (true === $token->isLast()) { + return $totalScore; + } + } + + if (count($arguments) > count($this->tokens)) { + return false; + } + + return $totalScore; + } + + /** + * Returns string representation for wildcard. + * + * @return string + */ + public function __toString() + { + if (null === $this->string) { + $this->string = implode(', ', array_map(function ($token) { + return (string) $token; + }, $this->tokens)); + } + + return $this->string; + } + + /** + * @return array + */ + public function getTokens() + { + return $this->tokens; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php new file mode 100644 index 0000000..5098811 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php @@ -0,0 +1,52 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +/** + * Any single value token. + * + * @author Konstantin Kudryashov + */ +class AnyValueToken implements TokenInterface +{ + /** + * Always scores 3 for any argument. + * + * @param $argument + * + * @return int + */ + public function scoreArgument($argument) + { + return 3; + } + + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return '*'; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php new file mode 100644 index 0000000..f76b17b --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php @@ -0,0 +1,52 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +/** + * Any values token. + * + * @author Konstantin Kudryashov + */ +class AnyValuesToken implements TokenInterface +{ + /** + * Always scores 2 for any argument. + * + * @param $argument + * + * @return int + */ + public function scoreArgument($argument) + { + return 2; + } + + /** + * Returns true to stop wildcard from processing other tokens. + * + * @return bool + */ + public function isLast() + { + return true; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return '* [, ...]'; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php new file mode 100644 index 0000000..d4918b1 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php @@ -0,0 +1,55 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +/** + * Approximate value token + * + * @author Daniel Leech + */ +class ApproximateValueToken implements TokenInterface +{ + private $value; + private $precision; + + public function __construct($value, $precision = 0) + { + $this->value = $value; + $this->precision = $precision; + } + + /** + * {@inheritdoc} + */ + public function scoreArgument($argument) + { + return round($argument, $this->precision) === round($this->value, $this->precision) ? 10 : false; + } + + /** + * {@inheritdoc} + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return sprintf('≅%s', round($this->value, $this->precision)); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php new file mode 100644 index 0000000..96b4bef --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php @@ -0,0 +1,86 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +/** + * Array elements count token. + * + * @author Boris Mikhaylov + */ + +class ArrayCountToken implements TokenInterface +{ + private $count; + + /** + * @param integer $value + */ + public function __construct($value) + { + $this->count = $value; + } + + /** + * Scores 6 when argument has preset number of elements. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + return $this->isCountable($argument) && $this->hasProperCount($argument) ? 6 : false; + } + + /** + * Returns false. + * + * @return boolean + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return sprintf('count(%s)', $this->count); + } + + /** + * Returns true if object is either array or instance of \Countable + * + * @param $argument + * @return bool + */ + private function isCountable($argument) + { + return (is_array($argument) || $argument instanceof \Countable); + } + + /** + * Returns true if $argument has expected number of elements + * + * @param array|\Countable $argument + * + * @return bool + */ + private function hasProperCount($argument) + { + return $this->count === count($argument); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php new file mode 100644 index 0000000..0305fc7 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php @@ -0,0 +1,143 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +use Prophecy\Exception\InvalidArgumentException; + +/** + * Array entry token. + * + * @author Boris Mikhaylov + */ +class ArrayEntryToken implements TokenInterface +{ + /** @var \Prophecy\Argument\Token\TokenInterface */ + private $key; + /** @var \Prophecy\Argument\Token\TokenInterface */ + private $value; + + /** + * @param mixed $key exact value or token + * @param mixed $value exact value or token + */ + public function __construct($key, $value) + { + $this->key = $this->wrapIntoExactValueToken($key); + $this->value = $this->wrapIntoExactValueToken($value); + } + + /** + * Scores half of combined scores from key and value tokens for same entry. Capped at 8. + * If argument implements \ArrayAccess without \Traversable, then key token is restricted to ExactValueToken. + * + * @param array|\ArrayAccess|\Traversable $argument + * + * @throws \Prophecy\Exception\InvalidArgumentException + * @return bool|int + */ + public function scoreArgument($argument) + { + if ($argument instanceof \Traversable) { + $argument = iterator_to_array($argument); + } + + if ($argument instanceof \ArrayAccess) { + $argument = $this->convertArrayAccessToEntry($argument); + } + + if (!is_array($argument) || empty($argument)) { + return false; + } + + $keyScores = array_map(array($this->key,'scoreArgument'), array_keys($argument)); + $valueScores = array_map(array($this->value,'scoreArgument'), $argument); + $scoreEntry = function ($value, $key) { + return $value && $key ? min(8, ($key + $value) / 2) : false; + }; + + return max(array_map($scoreEntry, $valueScores, $keyScores)); + } + + /** + * Returns false. + * + * @return boolean + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return sprintf('[..., %s => %s, ...]', $this->key, $this->value); + } + + /** + * Returns key + * + * @return TokenInterface + */ + public function getKey() + { + return $this->key; + } + + /** + * Returns value + * + * @return TokenInterface + */ + public function getValue() + { + return $this->value; + } + + /** + * Wraps non token $value into ExactValueToken + * + * @param $value + * @return TokenInterface + */ + private function wrapIntoExactValueToken($value) + { + return $value instanceof TokenInterface ? $value : new ExactValueToken($value); + } + + /** + * Converts instance of \ArrayAccess to key => value array entry + * + * @param \ArrayAccess $object + * + * @return array|null + * @throws \Prophecy\Exception\InvalidArgumentException + */ + private function convertArrayAccessToEntry(\ArrayAccess $object) + { + if (!$this->key instanceof ExactValueToken) { + throw new InvalidArgumentException(sprintf( + 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL. + 'But you used `%s`.', + $this->key + )); + } + + $key = $this->key->getValue(); + + return $object->offsetExists($key) ? array($key => $object[$key]) : array(); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php new file mode 100644 index 0000000..5d41fa4 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php @@ -0,0 +1,82 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +/** + * Array every entry token. + * + * @author Adrien Brault + */ +class ArrayEveryEntryToken implements TokenInterface +{ + /** + * @var TokenInterface + */ + private $value; + + /** + * @param mixed $value exact value or token + */ + public function __construct($value) + { + if (!$value instanceof TokenInterface) { + $value = new ExactValueToken($value); + } + + $this->value = $value; + } + + /** + * {@inheritdoc} + */ + public function scoreArgument($argument) + { + if (!$argument instanceof \Traversable && !is_array($argument)) { + return false; + } + + $scores = array(); + foreach ($argument as $key => $argumentEntry) { + $scores[] = $this->value->scoreArgument($argumentEntry); + } + + if (empty($scores) || in_array(false, $scores, true)) { + return false; + } + + return array_sum($scores) / count($scores); + } + + /** + * {@inheritdoc} + */ + public function isLast() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return sprintf('[%s, ..., %s]', $this->value, $this->value); + } + + /** + * @return TokenInterface + */ + public function getValue() + { + return $this->value; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php new file mode 100644 index 0000000..f45ba20 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php @@ -0,0 +1,75 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +use Prophecy\Exception\InvalidArgumentException; + +/** + * Callback-verified token. + * + * @author Konstantin Kudryashov + */ +class CallbackToken implements TokenInterface +{ + private $callback; + + /** + * Initializes token. + * + * @param callable $callback + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function __construct($callback) + { + if (!is_callable($callback)) { + throw new InvalidArgumentException(sprintf( + 'Callable expected as an argument to CallbackToken, but got %s.', + gettype($callback) + )); + } + + $this->callback = $callback; + } + + /** + * Scores 7 if callback returns true, false otherwise. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + return call_user_func($this->callback, $argument) ? 7 : false; + } + + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return 'callback()'; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php new file mode 100644 index 0000000..aa960f3 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php @@ -0,0 +1,116 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +use SebastianBergmann\Comparator\ComparisonFailure; +use Prophecy\Comparator\Factory as ComparatorFactory; +use Prophecy\Util\StringUtil; + +/** + * Exact value token. + * + * @author Konstantin Kudryashov + */ +class ExactValueToken implements TokenInterface +{ + private $value; + private $string; + private $util; + private $comparatorFactory; + + /** + * Initializes token. + * + * @param mixed $value + * @param StringUtil $util + * @param ComparatorFactory $comparatorFactory + */ + public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null) + { + $this->value = $value; + $this->util = $util ?: new StringUtil(); + + $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); + } + + /** + * Scores 10 if argument matches preset value. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + if (is_object($argument) && is_object($this->value)) { + $comparator = $this->comparatorFactory->getComparatorFor( + $argument, $this->value + ); + + try { + $comparator->assertEquals($argument, $this->value); + return 10; + } catch (ComparisonFailure $failure) {} + } + + // If either one is an object it should be castable to a string + if (is_object($argument) xor is_object($this->value)) { + if (is_object($argument) && !method_exists($argument, '__toString')) { + return false; + } + + if (is_object($this->value) && !method_exists($this->value, '__toString')) { + return false; + } + } elseif (is_numeric($argument) && is_numeric($this->value)) { + // noop + } elseif (gettype($argument) !== gettype($this->value)) { + return false; + } + + return $argument == $this->value ? 10 : false; + } + + /** + * Returns preset value against which token checks arguments. + * + * @return mixed + */ + public function getValue() + { + return $this->value; + } + + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + if (null === $this->string) { + $this->string = sprintf('exact(%s)', $this->util->stringify($this->value)); + } + + return $this->string; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php new file mode 100644 index 0000000..0b6d23a --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php @@ -0,0 +1,74 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +use Prophecy\Util\StringUtil; + +/** + * Identical value token. + * + * @author Florian Voutzinos + */ +class IdenticalValueToken implements TokenInterface +{ + private $value; + private $string; + private $util; + + /** + * Initializes token. + * + * @param mixed $value + * @param StringUtil $util + */ + public function __construct($value, StringUtil $util = null) + { + $this->value = $value; + $this->util = $util ?: new StringUtil(); + } + + /** + * Scores 11 if argument matches preset value. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + return $argument === $this->value ? 11 : false; + } + + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + if (null === $this->string) { + $this->string = sprintf('identical(%s)', $this->util->stringify($this->value)); + } + + return $this->string; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php new file mode 100644 index 0000000..4ee1b25 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php @@ -0,0 +1,80 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +/** + * Logical AND token. + * + * @author Boris Mikhaylov + */ +class LogicalAndToken implements TokenInterface +{ + private $tokens = array(); + + /** + * @param array $arguments exact values or tokens + */ + public function __construct(array $arguments) + { + foreach ($arguments as $argument) { + if (!$argument instanceof TokenInterface) { + $argument = new ExactValueToken($argument); + } + $this->tokens[] = $argument; + } + } + + /** + * Scores maximum score from scores returned by tokens for this argument if all of them score. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + if (0 === count($this->tokens)) { + return false; + } + + $maxScore = 0; + foreach ($this->tokens as $token) { + $score = $token->scoreArgument($argument); + if (false === $score) { + return false; + } + $maxScore = max($score, $maxScore); + } + + return $maxScore; + } + + /** + * Returns false. + * + * @return boolean + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return sprintf('bool(%s)', implode(' AND ', $this->tokens)); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php new file mode 100644 index 0000000..623efa5 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php @@ -0,0 +1,73 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +/** + * Logical NOT token. + * + * @author Boris Mikhaylov + */ +class LogicalNotToken implements TokenInterface +{ + /** @var \Prophecy\Argument\Token\TokenInterface */ + private $token; + + /** + * @param mixed $value exact value or token + */ + public function __construct($value) + { + $this->token = $value instanceof TokenInterface? $value : new ExactValueToken($value); + } + + /** + * Scores 4 when preset token does not match the argument. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + return false === $this->token->scoreArgument($argument) ? 4 : false; + } + + /** + * Returns true if preset token is last. + * + * @return bool|int + */ + public function isLast() + { + return $this->token->isLast(); + } + + /** + * Returns originating token. + * + * @return TokenInterface + */ + public function getOriginatingToken() + { + return $this->token; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return sprintf('not(%s)', $this->token); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php new file mode 100644 index 0000000..8d93bfd --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php @@ -0,0 +1,104 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +use SebastianBergmann\Comparator\ComparisonFailure; +use Prophecy\Comparator\Factory as ComparatorFactory; +use Prophecy\Util\StringUtil; + +/** + * Object state-checker token. + * + * @author Konstantin Kudryashov + */ +class ObjectStateToken implements TokenInterface +{ + private $name; + private $value; + private $util; + private $comparatorFactory; + + /** + * Initializes token. + * + * @param string $methodName + * @param mixed $value Expected return value + * @param null|StringUtil $util + * @param ComparatorFactory $comparatorFactory + */ + public function __construct( + $methodName, + $value, + StringUtil $util = null, + ComparatorFactory $comparatorFactory = null + ) { + $this->name = $methodName; + $this->value = $value; + $this->util = $util ?: new StringUtil; + + $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); + } + + /** + * Scores 8 if argument is an object, which method returns expected value. + * + * @param mixed $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + if (is_object($argument) && method_exists($argument, $this->name)) { + $actual = call_user_func(array($argument, $this->name)); + + $comparator = $this->comparatorFactory->getComparatorFor( + $actual, $this->value + ); + + try { + $comparator->assertEquals($actual, $this->value); + return 8; + } catch (ComparisonFailure $failure) { + return false; + } + } + + if (is_object($argument) && property_exists($argument, $this->name)) { + return $argument->{$this->name} === $this->value ? 8 : false; + } + + return false; + } + + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return sprintf('state(%s(), %s)', + $this->name, + $this->util->stringify($this->value) + ); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php new file mode 100644 index 0000000..24ff8c2 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php @@ -0,0 +1,67 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +/** + * String contains token. + * + * @author Peter Mitchell + */ +class StringContainsToken implements TokenInterface +{ + private $value; + + /** + * Initializes token. + * + * @param string $value + */ + public function __construct($value) + { + $this->value = $value; + } + + public function scoreArgument($argument) + { + return strpos($argument, $this->value) !== false ? 6 : false; + } + + /** + * Returns preset value against which token checks arguments. + * + * @return mixed + */ + public function getValue() + { + return $this->value; + } + + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return sprintf('contains("%s")', $this->value); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php new file mode 100644 index 0000000..625d3ba --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php @@ -0,0 +1,43 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +/** + * Argument token interface. + * + * @author Konstantin Kudryashov + */ +interface TokenInterface +{ + /** + * Calculates token match score for provided argument. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument); + + /** + * Returns true if this token prevents check of other tokens (is last one). + * + * @return bool|int + */ + public function isLast(); + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString(); +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php new file mode 100644 index 0000000..cb65132 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php @@ -0,0 +1,76 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Argument\Token; + +use Prophecy\Exception\InvalidArgumentException; + +/** + * Value type token. + * + * @author Konstantin Kudryashov + */ +class TypeToken implements TokenInterface +{ + private $type; + + /** + * @param string $type + */ + public function __construct($type) + { + $checker = "is_{$type}"; + if (!function_exists($checker) && !interface_exists($type) && !class_exists($type)) { + throw new InvalidArgumentException(sprintf( + 'Type or class name expected as an argument to TypeToken, but got %s.', $type + )); + } + + $this->type = $type; + } + + /** + * Scores 5 if argument has the same type this token was constructed with. + * + * @param $argument + * + * @return bool|int + */ + public function scoreArgument($argument) + { + $checker = "is_{$this->type}"; + if (function_exists($checker)) { + return call_user_func($checker, $argument) ? 5 : false; + } + + return $argument instanceof $this->type ? 5 : false; + } + + /** + * Returns false. + * + * @return bool + */ + public function isLast() + { + return false; + } + + /** + * Returns string representation for token. + * + * @return string + */ + public function __toString() + { + return sprintf('type(%s)', $this->type); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php b/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php new file mode 100644 index 0000000..2f3fbad --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php @@ -0,0 +1,127 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Call; + +use Exception; + +/** + * Call object. + * + * @author Konstantin Kudryashov + */ +class Call +{ + private $methodName; + private $arguments; + private $returnValue; + private $exception; + private $file; + private $line; + + /** + * Initializes call. + * + * @param string $methodName + * @param array $arguments + * @param mixed $returnValue + * @param Exception $exception + * @param null|string $file + * @param null|int $line + */ + public function __construct($methodName, array $arguments, $returnValue, + Exception $exception = null, $file, $line) + { + $this->methodName = $methodName; + $this->arguments = $arguments; + $this->returnValue = $returnValue; + $this->exception = $exception; + + if ($file) { + $this->file = $file; + $this->line = intval($line); + } + } + + /** + * Returns called method name. + * + * @return string + */ + public function getMethodName() + { + return $this->methodName; + } + + /** + * Returns called method arguments. + * + * @return array + */ + public function getArguments() + { + return $this->arguments; + } + + /** + * Returns called method return value. + * + * @return null|mixed + */ + public function getReturnValue() + { + return $this->returnValue; + } + + /** + * Returns exception that call thrown. + * + * @return null|Exception + */ + public function getException() + { + return $this->exception; + } + + /** + * Returns callee filename. + * + * @return string + */ + public function getFile() + { + return $this->file; + } + + /** + * Returns callee line number. + * + * @return int + */ + public function getLine() + { + return $this->line; + } + + /** + * Returns short notation for callee place. + * + * @return string + */ + public function getCallPlace() + { + if (null === $this->file) { + return 'unknown'; + } + + return sprintf('%s:%d', $this->file, $this->line); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php b/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php new file mode 100644 index 0000000..a1f8c61 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php @@ -0,0 +1,162 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Call; + +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Argument\ArgumentsWildcard; +use Prophecy\Util\StringUtil; +use Prophecy\Exception\Call\UnexpectedCallException; + +/** + * Calls receiver & manager. + * + * @author Konstantin Kudryashov + */ +class CallCenter +{ + private $util; + + /** + * @var Call[] + */ + private $recordedCalls = array(); + + /** + * Initializes call center. + * + * @param StringUtil $util + */ + public function __construct(StringUtil $util = null) + { + $this->util = $util ?: new StringUtil; + } + + /** + * Makes and records specific method call for object prophecy. + * + * @param ObjectProphecy $prophecy + * @param string $methodName + * @param array $arguments + * + * @return mixed Returns null if no promise for prophecy found or promise return value. + * + * @throws \Prophecy\Exception\Call\UnexpectedCallException If no appropriate method prophecy found + */ + public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments) + { + // For efficiency exclude 'args' from the generated backtrace + if (PHP_VERSION_ID >= 50400) { + // Limit backtrace to last 3 calls as we don't use the rest + // Limit argument was introduced in PHP 5.4.0 + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3); + } elseif (defined('DEBUG_BACKTRACE_IGNORE_ARGS')) { + // DEBUG_BACKTRACE_IGNORE_ARGS was introduced in PHP 5.3.6 + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + } else { + $backtrace = debug_backtrace(); + } + + $file = $line = null; + if (isset($backtrace[2]) && isset($backtrace[2]['file'])) { + $file = $backtrace[2]['file']; + $line = $backtrace[2]['line']; + } + + // If no method prophecies defined, then it's a dummy, so we'll just return null + if ('__destruct' === $methodName || 0 == count($prophecy->getMethodProphecies())) { + $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line); + + return null; + } + + // There are method prophecies, so it's a fake/stub. Searching prophecy for this call + $matches = array(); + foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) { + if (0 < $score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments)) { + $matches[] = array($score, $methodProphecy); + } + } + + // If fake/stub doesn't have method prophecy for this call - throw exception + if (!count($matches)) { + throw $this->createUnexpectedCallException($prophecy, $methodName, $arguments); + } + + // Sort matches by their score value + @usort($matches, function ($match1, $match2) { return $match2[0] - $match1[0]; }); + + // If Highest rated method prophecy has a promise - execute it or return null instead + $returnValue = null; + $exception = null; + if ($promise = $matches[0][1]->getPromise()) { + try { + $returnValue = $promise->execute($arguments, $prophecy, $matches[0][1]); + } catch (\Exception $e) { + $exception = $e; + } + } + + $this->recordedCalls[] = new Call( + $methodName, $arguments, $returnValue, $exception, $file, $line + ); + + if (null !== $exception) { + throw $exception; + } + + return $returnValue; + } + + /** + * Searches for calls by method name & arguments wildcard. + * + * @param string $methodName + * @param ArgumentsWildcard $wildcard + * + * @return Call[] + */ + public function findCalls($methodName, ArgumentsWildcard $wildcard) + { + return array_values( + array_filter($this->recordedCalls, function (Call $call) use ($methodName, $wildcard) { + return $methodName === $call->getMethodName() + && 0 < $wildcard->scoreArguments($call->getArguments()) + ; + }) + ); + } + + private function createUnexpectedCallException(ObjectProphecy $prophecy, $methodName, + array $arguments) + { + $classname = get_class($prophecy->reveal()); + $argstring = implode(', ', array_map(array($this->util, 'stringify'), $arguments)); + $expected = implode("\n", array_map(function (MethodProphecy $methodProphecy) { + return sprintf(' - %s(%s)', + $methodProphecy->getMethodName(), + $methodProphecy->getArgumentsWildcard() + ); + }, call_user_func_array('array_merge', $prophecy->getMethodProphecies()))); + + return new UnexpectedCallException( + sprintf( + "Method call:\n". + " - %s(%s)\n". + "on %s was not expected, expected calls were:\n%s", + + $methodName, $argstring, $classname, $expected + ), + $prophecy, $methodName, $arguments + ); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php b/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php new file mode 100644 index 0000000..874e474 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php @@ -0,0 +1,42 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Comparator; + +use SebastianBergmann\Comparator\Comparator; +use SebastianBergmann\Comparator\ComparisonFailure; + +/** + * Closure comparator. + * + * @author Konstantin Kudryashov + */ +final class ClosureComparator extends Comparator +{ + public function accepts($expected, $actual) + { + return is_object($expected) && $expected instanceof \Closure + && is_object($actual) && $actual instanceof \Closure; + } + + public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false) + { + throw new ComparisonFailure( + $expected, + $actual, + // we don't need a diff + '', + '', + false, + 'all closures are born different' + ); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php b/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php new file mode 100644 index 0000000..2070db1 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php @@ -0,0 +1,47 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Comparator; + +use SebastianBergmann\Comparator\Factory as BaseFactory; + +/** + * Prophecy comparator factory. + * + * @author Konstantin Kudryashov + */ +final class Factory extends BaseFactory +{ + /** + * @var Factory + */ + private static $instance; + + public function __construct() + { + parent::__construct(); + + $this->register(new ClosureComparator()); + $this->register(new ProphecyComparator()); + } + + /** + * @return Factory + */ + public static function getInstance() + { + if (self::$instance === null) { + self::$instance = new Factory; + } + + return self::$instance; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php b/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php new file mode 100644 index 0000000..298a8e3 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php @@ -0,0 +1,28 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Comparator; + +use Prophecy\Prophecy\ProphecyInterface; +use SebastianBergmann\Comparator\ObjectComparator; + +class ProphecyComparator extends ObjectComparator +{ + public function accepts($expected, $actual) + { + return is_object($expected) && is_object($actual) && $actual instanceof ProphecyInterface; + } + + public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()) + { + parent::assertEquals($expected, $actual->reveal(), $delta, $canonicalize, $ignoreCase, $processed); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php new file mode 100644 index 0000000..d6b6b1a --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php @@ -0,0 +1,68 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler; + +use ReflectionClass; + +/** + * Cached class doubler. + * Prevents mirroring/creation of the same structure twice. + * + * @author Konstantin Kudryashov + */ +class CachedDoubler extends Doubler +{ + private $classes = array(); + + /** + * {@inheritdoc} + */ + public function registerClassPatch(ClassPatch\ClassPatchInterface $patch) + { + $this->classes[] = array(); + + parent::registerClassPatch($patch); + } + + /** + * {@inheritdoc} + */ + protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) + { + $classId = $this->generateClassId($class, $interfaces); + if (isset($this->classes[$classId])) { + return $this->classes[$classId]; + } + + return $this->classes[$classId] = parent::createDoubleClass($class, $interfaces); + } + + /** + * @param ReflectionClass $class + * @param ReflectionClass[] $interfaces + * + * @return string + */ + private function generateClassId(ReflectionClass $class = null, array $interfaces) + { + $parts = array(); + if (null !== $class) { + $parts[] = $class->getName(); + } + foreach ($interfaces as $interface) { + $parts[] = $interface->getName(); + } + sort($parts); + + return md5(implode('', $parts)); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php new file mode 100644 index 0000000..d6d1968 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php @@ -0,0 +1,48 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\ClassPatch; + +use Prophecy\Doubler\Generator\Node\ClassNode; + +/** + * Class patch interface. + * Class patches extend doubles functionality or help + * Prophecy to avoid some internal PHP bugs. + * + * @author Konstantin Kudryashov + */ +interface ClassPatchInterface +{ + /** + * Checks if patch supports specific class node. + * + * @param ClassNode $node + * + * @return bool + */ + public function supports(ClassNode $node); + + /** + * Applies patch to the specific class node. + * + * @param ClassNode $node + * @return void + */ + public function apply(ClassNode $node); + + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority(); +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php new file mode 100644 index 0000000..61998fc --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php @@ -0,0 +1,72 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\ClassPatch; + +use Prophecy\Doubler\Generator\Node\ClassNode; +use Prophecy\Doubler\Generator\Node\MethodNode; + +/** + * Disable constructor. + * Makes all constructor arguments optional. + * + * @author Konstantin Kudryashov + */ +class DisableConstructorPatch implements ClassPatchInterface +{ + /** + * Checks if class has `__construct` method. + * + * @param ClassNode $node + * + * @return bool + */ + public function supports(ClassNode $node) + { + return true; + } + + /** + * Makes all class constructor arguments optional. + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) + { + if (!$node->hasMethod('__construct')) { + $node->addMethod(new MethodNode('__construct', '')); + + return; + } + + $constructor = $node->getMethod('__construct'); + foreach ($constructor->getArguments() as $argument) { + $argument->setDefault(null); + } + + $constructor->setCode(<< + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\ClassPatch; + +use Prophecy\Doubler\Generator\Node\ClassNode; + +/** + * Exception patch for HHVM to remove the stubs from special methods + * + * @author Christophe Coevoet + */ +class HhvmExceptionPatch implements ClassPatchInterface +{ + /** + * Supports exceptions on HHVM. + * + * @param ClassNode $node + * + * @return bool + */ + public function supports(ClassNode $node) + { + if (!defined('HHVM_VERSION')) { + return false; + } + + return 'Exception' === $node->getParentClass() || is_subclass_of($node->getParentClass(), 'Exception'); + } + + /** + * Removes special exception static methods from the doubled methods. + * + * @param ClassNode $node + * + * @return void + */ + public function apply(ClassNode $node) + { + if ($node->hasMethod('setTraceOptions')) { + $node->getMethod('setTraceOptions')->useParentCode(); + } + if ($node->hasMethod('getTraceOptions')) { + $node->getMethod('getTraceOptions')->useParentCode(); + } + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return -50; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php new file mode 100644 index 0000000..b0d9793 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php @@ -0,0 +1,135 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\ClassPatch; + +use Prophecy\Doubler\Generator\Node\ClassNode; + +/** + * Remove method functionality from the double which will clash with php keywords. + * + * @author Milan Magudia + */ +class KeywordPatch implements ClassPatchInterface +{ + /** + * Support any class + * + * @param ClassNode $node + * + * @return boolean + */ + public function supports(ClassNode $node) + { + return true; + } + + /** + * Remove methods that clash with php keywords + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) + { + $methodNames = array_keys($node->getMethods()); + $methodsToRemove = array_intersect($methodNames, $this->getKeywords()); + foreach ($methodsToRemove as $methodName) { + $node->removeMethod($methodName); + } + } + + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority() { + return 49; + } + + /** + * Returns array of php keywords. + * + * @return array + */ + private function getKeywords() { + + return array( + '__halt_compiler', + 'abstract', + 'and', + 'array', + 'as', + 'break', + 'callable', + 'case', + 'catch', + 'class', + 'clone', + 'const', + 'continue', + 'declare', + 'default', + 'die', + 'do', + 'echo', + 'else', + 'elseif', + 'empty', + 'enddeclare', + 'endfor', + 'endforeach', + 'endif', + 'endswitch', + 'endwhile', + 'eval', + 'exit', + 'extends', + 'final', + 'finally', + 'for', + 'foreach', + 'function', + 'global', + 'goto', + 'if', + 'implements', + 'include', + 'include_once', + 'instanceof', + 'insteadof', + 'interface', + 'isset', + 'list', + 'namespace', + 'new', + 'or', + 'print', + 'private', + 'protected', + 'public', + 'require', + 'require_once', + 'return', + 'static', + 'switch', + 'throw', + 'trait', + 'try', + 'unset', + 'use', + 'var', + 'while', + 'xor', + 'yield', + ); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php new file mode 100644 index 0000000..08126d9 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php @@ -0,0 +1,79 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\ClassPatch; + +use phpDocumentor\Reflection\DocBlock; +use Prophecy\Doubler\Generator\Node\ClassNode; +use Prophecy\Doubler\Generator\Node\MethodNode; + +/** + * Discover Magical API using "@method" PHPDoc format. + * + * @author Thomas Tourlourat + */ +class MagicCallPatch implements ClassPatchInterface +{ + /** + * Support any class + * + * @param ClassNode $node + * + * @return boolean + */ + public function supports(ClassNode $node) + { + return true; + } + + /** + * Discover Magical API + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) + { + $parentClass = $node->getParentClass(); + $reflectionClass = new \ReflectionClass($parentClass); + + $phpdoc = new DocBlock($reflectionClass->getDocComment()); + + $tagList = $phpdoc->getTagsByName('method'); + + $interfaces = $reflectionClass->getInterfaces(); + foreach($interfaces as $interface) { + $phpdoc = new DocBlock($interface); + $tagList = array_merge($tagList, $phpdoc->getTagsByName('method')); + } + + foreach($tagList as $tag) { + $methodName = $tag->getMethodName(); + + if (!$reflectionClass->hasMethod($methodName)) { + $methodNode = new MethodNode($tag->getMethodName()); + $methodNode->setStatic($tag->isStatic()); + + $node->addMethod($methodNode); + } + } + } + + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return integer Priority number (higher - earlier) + */ + public function getPriority() + { + return 50; + } +} + diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php new file mode 100644 index 0000000..ab0bb7c --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php @@ -0,0 +1,98 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\ClassPatch; + +use Prophecy\Doubler\Generator\Node\ClassNode; +use Prophecy\Doubler\Generator\Node\MethodNode; +use Prophecy\Doubler\Generator\Node\ArgumentNode; + +/** + * Add Prophecy functionality to the double. + * This is a core class patch for Prophecy. + * + * @author Konstantin Kudryashov + */ +class ProphecySubjectPatch implements ClassPatchInterface +{ + /** + * Always returns true. + * + * @param ClassNode $node + * + * @return bool + */ + public function supports(ClassNode $node) + { + return true; + } + + /** + * Apply Prophecy functionality to class node. + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) + { + $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface'); + $node->addProperty('objectProphecy', 'private'); + + foreach ($node->getMethods() as $name => $method) { + if ('__construct' === strtolower($name)) { + continue; + } + + $method->setCode( + 'return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());' + ); + } + + $prophecySetter = new MethodNode('setProphecy'); + $prophecyArgument = new ArgumentNode('prophecy'); + $prophecyArgument->setTypeHint('Prophecy\Prophecy\ProphecyInterface'); + $prophecySetter->addArgument($prophecyArgument); + $prophecySetter->setCode('$this->objectProphecy = $prophecy;'); + + $prophecyGetter = new MethodNode('getProphecy'); + $prophecyGetter->setCode('return $this->objectProphecy;'); + + if ($node->hasMethod('__call')) { + $__call = $node->getMethod('__call'); + } else { + $__call = new MethodNode('__call'); + $__call->addArgument(new ArgumentNode('name')); + $__call->addArgument(new ArgumentNode('arguments')); + + $node->addMethod($__call); + } + + $__call->setCode(<<getProphecy(), func_get_arg(0) +); +PHP + ); + + $node->addMethod($prophecySetter); + $node->addMethod($prophecyGetter); + } + + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority() + { + return 0; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php new file mode 100644 index 0000000..9166aee --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php @@ -0,0 +1,57 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\ClassPatch; + +use Prophecy\Doubler\Generator\Node\ClassNode; + +/** + * ReflectionClass::newInstance patch. + * Makes first argument of newInstance optional, since it works but signature is misleading + * + * @author Florian Klein + */ +class ReflectionClassNewInstancePatch implements ClassPatchInterface +{ + /** + * Supports ReflectionClass + * + * @param ClassNode $node + * + * @return bool + */ + public function supports(ClassNode $node) + { + return 'ReflectionClass' === $node->getParentClass(); + } + + /** + * Updates newInstance's first argument to make it optional + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) + { + foreach ($node->getMethod('newInstance')->getArguments() as $argument) { + $argument->setDefault(null); + } + } + + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher = earlier) + */ + public function getPriority() + { + return 50; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php new file mode 100644 index 0000000..8401159 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php @@ -0,0 +1,85 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\ClassPatch; + +use Prophecy\Doubler\Generator\Node\ClassNode; +use Prophecy\Doubler\Generator\Node\MethodNode; + +/** + * SplFileInfo patch. + * Makes SplFileInfo and derivative classes usable with Prophecy. + * + * @author Konstantin Kudryashov + */ +class SplFileInfoPatch implements ClassPatchInterface +{ + /** + * Supports everything that extends SplFileInfo. + * + * @param ClassNode $node + * + * @return bool + */ + public function supports(ClassNode $node) + { + if (null === $node->getParentClass()) { + return false; + } + + return 'SplFileInfo' === $node->getParentClass() + || is_subclass_of($node->getParentClass(), 'SplFileInfo') + ; + } + + /** + * Updated constructor code to call parent one with dummy file argument. + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) + { + if ($node->hasMethod('__construct')) { + $constructor = $node->getMethod('__construct'); + } else { + $constructor = new MethodNode('__construct'); + $node->addMethod($constructor); + } + + if ($this->nodeIsDirectoryIterator($node)) { + $constructor->setCode('return parent::__construct("' . __DIR__ . '");'); + return; + } + + $constructor->useParentCode(); + } + + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority() + { + return 50; + } + + /** + * @param ClassNode $node + * @return boolean + */ + private function nodeIsDirectoryIterator(ClassNode $node) + { + $parent = $node->getParentClass(); + return 'DirectoryIterator' === $parent + || is_subclass_of($parent, 'DirectoryIterator'); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php new file mode 100644 index 0000000..eea0202 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php @@ -0,0 +1,83 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\ClassPatch; + +use Prophecy\Doubler\Generator\Node\ClassNode; +use Prophecy\Doubler\Generator\Node\MethodNode; + +/** + * Traversable interface patch. + * Forces classes that implement interfaces, that extend Traversable to also implement Iterator. + * + * @author Konstantin Kudryashov + */ +class TraversablePatch implements ClassPatchInterface +{ + /** + * Supports nodetree, that implement Traversable, but not Iterator or IteratorAggregate. + * + * @param ClassNode $node + * + * @return bool + */ + public function supports(ClassNode $node) + { + if (in_array('Iterator', $node->getInterfaces())) { + return false; + } + if (in_array('IteratorAggregate', $node->getInterfaces())) { + return false; + } + + foreach ($node->getInterfaces() as $interface) { + if ('Traversable' !== $interface && !is_subclass_of($interface, 'Traversable')) { + continue; + } + if ('Iterator' === $interface || is_subclass_of($interface, 'Iterator')) { + continue; + } + if ('IteratorAggregate' === $interface || is_subclass_of($interface, 'IteratorAggregate')) { + continue; + } + + return true; + } + + return false; + } + + /** + * Forces class to implement Iterator interface. + * + * @param ClassNode $node + */ + public function apply(ClassNode $node) + { + $node->addInterface('Iterator'); + + $node->addMethod(new MethodNode('current')); + $node->addMethod(new MethodNode('key')); + $node->addMethod(new MethodNode('next')); + $node->addMethod(new MethodNode('rewind')); + $node->addMethod(new MethodNode('valid')); + } + + /** + * Returns patch priority, which determines when patch will be applied. + * + * @return int Priority number (higher - earlier) + */ + public function getPriority() + { + return 100; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php new file mode 100644 index 0000000..699be3a --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php @@ -0,0 +1,22 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler; + +/** + * Core double interface. + * All doubled classes will implement this one. + * + * @author Konstantin Kudryashov + */ +interface DoubleInterface +{ +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php new file mode 100644 index 0000000..a378ae2 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php @@ -0,0 +1,146 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler; + +use Doctrine\Instantiator\Instantiator; +use Prophecy\Doubler\ClassPatch\ClassPatchInterface; +use Prophecy\Doubler\Generator\ClassMirror; +use Prophecy\Doubler\Generator\ClassCreator; +use Prophecy\Exception\InvalidArgumentException; +use ReflectionClass; + +/** + * Cached class doubler. + * Prevents mirroring/creation of the same structure twice. + * + * @author Konstantin Kudryashov + */ +class Doubler +{ + private $mirror; + private $creator; + private $namer; + + /** + * @var ClassPatchInterface[] + */ + private $patches = array(); + + /** + * @var \Doctrine\Instantiator\Instantiator + */ + private $instantiator; + + /** + * Initializes doubler. + * + * @param ClassMirror $mirror + * @param ClassCreator $creator + * @param NameGenerator $namer + */ + public function __construct(ClassMirror $mirror = null, ClassCreator $creator = null, + NameGenerator $namer = null) + { + $this->mirror = $mirror ?: new ClassMirror; + $this->creator = $creator ?: new ClassCreator; + $this->namer = $namer ?: new NameGenerator; + } + + /** + * Returns list of registered class patches. + * + * @return ClassPatchInterface[] + */ + public function getClassPatches() + { + return $this->patches; + } + + /** + * Registers new class patch. + * + * @param ClassPatchInterface $patch + */ + public function registerClassPatch(ClassPatchInterface $patch) + { + $this->patches[] = $patch; + + @usort($this->patches, function (ClassPatchInterface $patch1, ClassPatchInterface $patch2) { + return $patch2->getPriority() - $patch1->getPriority(); + }); + } + + /** + * Creates double from specific class or/and list of interfaces. + * + * @param ReflectionClass $class + * @param ReflectionClass[] $interfaces Array of ReflectionClass instances + * @param array $args Constructor arguments + * + * @return DoubleInterface + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function double(ReflectionClass $class = null, array $interfaces, array $args = null) + { + foreach ($interfaces as $interface) { + if (!$interface instanceof ReflectionClass) { + throw new InvalidArgumentException(sprintf( + "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n". + "a second argument to `Doubler::double(...)`, but got %s.", + is_object($interface) ? get_class($interface).' class' : gettype($interface) + )); + } + } + + $classname = $this->createDoubleClass($class, $interfaces); + $reflection = new ReflectionClass($classname); + + if (null !== $args) { + return $reflection->newInstanceArgs($args); + } + if ((null === $constructor = $reflection->getConstructor()) + || ($constructor->isPublic() && !$constructor->isFinal())) { + return $reflection->newInstance(); + } + + if (!$this->instantiator) { + $this->instantiator = new Instantiator(); + } + + return $this->instantiator->instantiate($classname); + } + + /** + * Creates double class and returns its FQN. + * + * @param ReflectionClass $class + * @param ReflectionClass[] $interfaces + * + * @return string + */ + protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) + { + $name = $this->namer->name($class, $interfaces); + $node = $this->mirror->reflect($class, $interfaces); + + foreach ($this->patches as $patch) { + if ($patch->supports($node)) { + $patch->apply($node); + } + } + + $this->creator->create($name, $node); + + return $name; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php new file mode 100644 index 0000000..dc03f42 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php @@ -0,0 +1,112 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\Generator; + +/** + * Class code creator. + * Generates PHP code for specific class node tree. + * + * @author Konstantin Kudryashov + */ +class ClassCodeGenerator +{ + /** + * Generates PHP code for class node. + * + * @param string $classname + * @param Node\ClassNode $class + * + * @return string + */ + public function generate($classname, Node\ClassNode $class) + { + $parts = explode('\\', $classname); + $classname = array_pop($parts); + $namespace = implode('\\', $parts); + + $code = sprintf("class %s extends \%s implements %s {\n", + $classname, $class->getParentClass(), implode(', ', + array_map(function ($interface) {return '\\'.$interface;}, $class->getInterfaces()) + ) + ); + + foreach ($class->getProperties() as $name => $visibility) { + $code .= sprintf("%s \$%s;\n", $visibility, $name); + } + $code .= "\n"; + + foreach ($class->getMethods() as $method) { + $code .= $this->generateMethod($method)."\n"; + } + $code .= "\n}"; + + return sprintf("namespace %s {\n%s\n}", $namespace, $code); + } + + private function generateMethod(Node\MethodNode $method) + { + $php = sprintf("%s %s function %s%s(%s)%s {\n", + $method->getVisibility(), + $method->isStatic() ? 'static' : '', + $method->returnsReference() ? '&':'', + $method->getName(), + implode(', ', $this->generateArguments($method->getArguments())), + version_compare(PHP_VERSION, '7.0', '>=') && $method->hasReturnType() + ? sprintf(': %s', $method->getReturnType()) + : '' + ); + $php .= $method->getCode()."\n"; + + return $php.'}'; + } + + private function generateArguments(array $arguments) + { + return array_map(function (Node\ArgumentNode $argument) { + $php = ''; + + if ($hint = $argument->getTypeHint()) { + switch ($hint) { + case 'array': + case 'callable': + $php .= $hint; + break; + + case 'string': + case 'int': + case 'float': + case 'bool': + if (version_compare(PHP_VERSION, '7.0', '>=')) { + $php .= $hint; + break; + } + // Fall-through to default case for PHP 5.x + + default: + $php .= '\\'.$hint; + } + } + + $php .= ' '.($argument->isPassedByReference() ? '&' : ''); + + $php .= $argument->isVariadic() ? '...' : ''; + + $php .= '$'.$argument->getName(); + + if ($argument->isOptional() && !$argument->isVariadic()) { + $php .= ' = '.var_export($argument->getDefault(), true); + } + + return $php; + }, $arguments); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php new file mode 100644 index 0000000..882a4a4 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php @@ -0,0 +1,67 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\Generator; + +use Prophecy\Exception\Doubler\ClassCreatorException; + +/** + * Class creator. + * Creates specific class in current environment. + * + * @author Konstantin Kudryashov + */ +class ClassCreator +{ + private $generator; + + /** + * Initializes creator. + * + * @param ClassCodeGenerator $generator + */ + public function __construct(ClassCodeGenerator $generator = null) + { + $this->generator = $generator ?: new ClassCodeGenerator; + } + + /** + * Creates class. + * + * @param string $classname + * @param Node\ClassNode $class + * + * @return mixed + * + * @throws \Prophecy\Exception\Doubler\ClassCreatorException + */ + public function create($classname, Node\ClassNode $class) + { + $code = $this->generator->generate($classname, $class); + $return = eval($code); + + if (!class_exists($classname, false)) { + if (count($class->getInterfaces())) { + throw new ClassCreatorException(sprintf( + 'Could not double `%s` and implement interfaces: [%s].', + $class->getParentClass(), implode(', ', $class->getInterfaces()) + ), $class); + } + + throw new ClassCreatorException( + sprintf('Could not double `%s`.', $class->getParentClass()), + $class + ); + } + + return $return; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php new file mode 100644 index 0000000..acdb2c1 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php @@ -0,0 +1,254 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\Generator; + +use Prophecy\Exception\InvalidArgumentException; +use Prophecy\Exception\Doubler\ClassMirrorException; +use ReflectionClass; +use ReflectionMethod; +use ReflectionParameter; + +/** + * Class mirror. + * Core doubler class. Mirrors specific class and/or interfaces into class node tree. + * + * @author Konstantin Kudryashov + */ +class ClassMirror +{ + private static $reflectableMethods = array( + '__construct', + '__destruct', + '__sleep', + '__wakeup', + '__toString', + '__call', + '__invoke' + ); + + /** + * Reflects provided arguments into class node. + * + * @param ReflectionClass $class + * @param ReflectionClass[] $interfaces + * + * @return Node\ClassNode + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function reflect(ReflectionClass $class = null, array $interfaces) + { + $node = new Node\ClassNode; + + if (null !== $class) { + if (true === $class->isInterface()) { + throw new InvalidArgumentException(sprintf( + "Could not reflect %s as a class, because it\n". + "is interface - use the second argument instead.", + $class->getName() + )); + } + + $this->reflectClassToNode($class, $node); + } + + foreach ($interfaces as $interface) { + if (!$interface instanceof ReflectionClass) { + throw new InvalidArgumentException(sprintf( + "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n". + "a second argument to `ClassMirror::reflect(...)`, but got %s.", + is_object($interface) ? get_class($interface).' class' : gettype($interface) + )); + } + if (false === $interface->isInterface()) { + throw new InvalidArgumentException(sprintf( + "Could not reflect %s as an interface, because it\n". + "is class - use the first argument instead.", + $interface->getName() + )); + } + + $this->reflectInterfaceToNode($interface, $node); + } + + $node->addInterface('Prophecy\Doubler\Generator\ReflectionInterface'); + + return $node; + } + + private function reflectClassToNode(ReflectionClass $class, Node\ClassNode $node) + { + if (true === $class->isFinal()) { + throw new ClassMirrorException(sprintf( + 'Could not reflect class %s as it is marked final.', $class->getName() + ), $class); + } + + $node->setParentClass($class->getName()); + + foreach ($class->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) { + if (false === $method->isProtected()) { + continue; + } + + $this->reflectMethodToNode($method, $node); + } + + foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { + if (0 === strpos($method->getName(), '_') + && !in_array($method->getName(), self::$reflectableMethods)) { + continue; + } + + if (true === $method->isFinal()) { + $node->addUnextendableMethod($method->getName()); + continue; + } + + $this->reflectMethodToNode($method, $node); + } + } + + private function reflectInterfaceToNode(ReflectionClass $interface, Node\ClassNode $node) + { + $node->addInterface($interface->getName()); + + foreach ($interface->getMethods() as $method) { + $this->reflectMethodToNode($method, $node); + } + } + + private function reflectMethodToNode(ReflectionMethod $method, Node\ClassNode $classNode) + { + $node = new Node\MethodNode($method->getName()); + + if (true === $method->isProtected()) { + $node->setVisibility('protected'); + } + + if (true === $method->isStatic()) { + $node->setStatic(); + } + + if (true === $method->returnsReference()) { + $node->setReturnsReference(); + } + + if (version_compare(PHP_VERSION, '7.0', '>=') && true === $method->hasReturnType()) { + $returnType = (string) $method->getReturnType(); + $returnTypeLower = strtolower($returnType); + + if ('self' === $returnTypeLower) { + $returnType = $method->getDeclaringClass()->getName(); + } + if ('parent' === $returnTypeLower) { + $returnType = $method->getDeclaringClass()->getParentClass()->getName(); + } + + $node->setReturnType($returnType); + } + + if (is_array($params = $method->getParameters()) && count($params)) { + foreach ($params as $param) { + $this->reflectArgumentToNode($param, $node); + } + } + + $classNode->addMethod($node); + } + + private function reflectArgumentToNode(ReflectionParameter $parameter, Node\MethodNode $methodNode) + { + $name = $parameter->getName() == '...' ? '__dot_dot_dot__' : $parameter->getName(); + $node = new Node\ArgumentNode($name); + + $node->setTypeHint($this->getTypeHint($parameter)); + + if ($this->isVariadic($parameter)) { + $node->setAsVariadic(); + } + + if ($this->hasDefaultValue($parameter)) { + $node->setDefault($this->getDefaultValue($parameter)); + } + + if ($parameter->isPassedByReference()) { + $node->setAsPassedByReference(); + } + + $methodNode->addArgument($node); + } + + private function hasDefaultValue(ReflectionParameter $parameter) + { + if ($this->isVariadic($parameter)) { + return false; + } + + if ($parameter->isDefaultValueAvailable()) { + return true; + } + + return $parameter->isOptional() || $this->isNullable($parameter); + } + + private function getDefaultValue(ReflectionParameter $parameter) + { + if (!$parameter->isDefaultValueAvailable()) { + return null; + } + + return $parameter->getDefaultValue(); + } + + private function getTypeHint(ReflectionParameter $parameter) + { + if (null !== $className = $this->getParameterClassName($parameter)) { + return $className; + } + + if (true === $parameter->isArray()) { + return 'array'; + } + + if (version_compare(PHP_VERSION, '5.4', '>=') && true === $parameter->isCallable()) { + return 'callable'; + } + + if (version_compare(PHP_VERSION, '7.0', '>=') && true === $parameter->hasType()) { + return (string) $parameter->getType(); + } + + return null; + } + + private function isVariadic(ReflectionParameter $parameter) + { + return PHP_VERSION_ID >= 50600 && $parameter->isVariadic(); + } + + private function isNullable(ReflectionParameter $parameter) + { + return $parameter->allowsNull() && null !== $this->getTypeHint($parameter); + } + + private function getParameterClassName(ReflectionParameter $parameter) + { + try { + return $parameter->getClass() ? $parameter->getClass()->getName() : null; + } catch (\ReflectionException $e) { + preg_match('/\[\s\<\w+?>\s([\w,\\\]+)/s', $parameter, $matches); + + return isset($matches[1]) ? $matches[1] : null; + } + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php new file mode 100644 index 0000000..cf6fd73 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php @@ -0,0 +1,91 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\Generator\Node; + +/** + * Argument node. + * + * @author Konstantin Kudryashov + */ +class ArgumentNode +{ + private $name; + private $typeHint; + private $default; + private $optional = false; + private $byReference = false; + private $isVariadic = false; + + /** + * @param string $name + */ + public function __construct($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function getTypeHint() + { + return $this->typeHint; + } + + public function setTypeHint($typeHint = null) + { + $this->typeHint = $typeHint; + } + + public function hasDefault() + { + return $this->isOptional() && !$this->isVariadic(); + } + + public function getDefault() + { + return $this->default; + } + + public function setDefault($default = null) + { + $this->optional = true; + $this->default = $default; + } + + public function isOptional() + { + return $this->optional; + } + + public function setAsPassedByReference($byReference = true) + { + $this->byReference = $byReference; + } + + public function isPassedByReference() + { + return $this->byReference; + } + + public function setAsVariadic($isVariadic = true) + { + $this->isVariadic = $isVariadic; + } + + public function isVariadic() + { + return $this->isVariadic; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php new file mode 100644 index 0000000..1499a1d --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php @@ -0,0 +1,166 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\Generator\Node; + +use Prophecy\Exception\Doubler\MethodNotExtendableException; +use Prophecy\Exception\InvalidArgumentException; + +/** + * Class node. + * + * @author Konstantin Kudryashov + */ +class ClassNode +{ + private $parentClass = 'stdClass'; + private $interfaces = array(); + private $properties = array(); + private $unextendableMethods = array(); + + /** + * @var MethodNode[] + */ + private $methods = array(); + + public function getParentClass() + { + return $this->parentClass; + } + + /** + * @param string $class + */ + public function setParentClass($class) + { + $this->parentClass = $class ?: 'stdClass'; + } + + /** + * @return string[] + */ + public function getInterfaces() + { + return $this->interfaces; + } + + /** + * @param string $interface + */ + public function addInterface($interface) + { + if ($this->hasInterface($interface)) { + return; + } + + array_unshift($this->interfaces, $interface); + } + + /** + * @param string $interface + * + * @return bool + */ + public function hasInterface($interface) + { + return in_array($interface, $this->interfaces); + } + + public function getProperties() + { + return $this->properties; + } + + public function addProperty($name, $visibility = 'public') + { + $visibility = strtolower($visibility); + + if (!in_array($visibility, array('public', 'private', 'protected'))) { + throw new InvalidArgumentException(sprintf( + '`%s` property visibility is not supported.', $visibility + )); + } + + $this->properties[$name] = $visibility; + } + + /** + * @return MethodNode[] + */ + public function getMethods() + { + return $this->methods; + } + + public function addMethod(MethodNode $method) + { + if (!$this->isExtendable($method->getName())){ + $message = sprintf( + 'Method `%s` is not extendable, so can not be added.', $method->getName() + ); + throw new MethodNotExtendableException($message, $this->getParentClass(), $method->getName()); + } + $this->methods[$method->getName()] = $method; + } + + public function removeMethod($name) + { + unset($this->methods[$name]); + } + + /** + * @param string $name + * + * @return MethodNode|null + */ + public function getMethod($name) + { + return $this->hasMethod($name) ? $this->methods[$name] : null; + } + + /** + * @param string $name + * + * @return bool + */ + public function hasMethod($name) + { + return isset($this->methods[$name]); + } + + /** + * @return string[] + */ + public function getUnextendableMethods() + { + return $this->unextendableMethods; + } + + /** + * @param string $unextendableMethod + */ + public function addUnextendableMethod($unextendableMethod) + { + if (!$this->isExtendable($unextendableMethod)){ + return; + } + $this->unextendableMethods[] = $unextendableMethod; + } + + /** + * @param string $method + * @return bool + */ + public function isExtendable($method) + { + return !in_array($method, $this->unextendableMethods); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php new file mode 100644 index 0000000..8402ab8 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php @@ -0,0 +1,188 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\Generator\Node; + +use Prophecy\Exception\InvalidArgumentException; + +/** + * Method node. + * + * @author Konstantin Kudryashov + */ +class MethodNode +{ + private $name; + private $code; + private $visibility = 'public'; + private $static = false; + private $returnsReference = false; + private $returnType; + + /** + * @var ArgumentNode[] + */ + private $arguments = array(); + + /** + * @param string $name + * @param string $code + */ + public function __construct($name, $code = null) + { + $this->name = $name; + $this->code = $code; + } + + public function getVisibility() + { + return $this->visibility; + } + + /** + * @param string $visibility + */ + public function setVisibility($visibility) + { + $visibility = strtolower($visibility); + + if (!in_array($visibility, array('public', 'private', 'protected'))) { + throw new InvalidArgumentException(sprintf( + '`%s` method visibility is not supported.', $visibility + )); + } + + $this->visibility = $visibility; + } + + public function isStatic() + { + return $this->static; + } + + public function setStatic($static = true) + { + $this->static = (bool) $static; + } + + public function returnsReference() + { + return $this->returnsReference; + } + + public function setReturnsReference() + { + $this->returnsReference = true; + } + + public function getName() + { + return $this->name; + } + + public function addArgument(ArgumentNode $argument) + { + $this->arguments[] = $argument; + } + + /** + * @return ArgumentNode[] + */ + public function getArguments() + { + return $this->arguments; + } + + public function hasReturnType() + { + return null !== $this->returnType; + } + + /** + * @param string $type + */ + public function setReturnType($type = null) + { + switch ($type) { + case '': + $this->returnType = null; + break; + + case 'string'; + case 'float': + case 'int': + case 'bool': + case 'array': + case 'callable': + $this->returnType = $type; + break; + + case 'double': + case 'real': + $this->returnType = 'float'; + break; + + case 'boolean': + $this->returnType = 'bool'; + break; + + case 'integer': + $this->returnType = 'int'; + break; + + default: + $this->returnType = '\\' . ltrim($type, '\\'); + } + } + + public function getReturnType() + { + return $this->returnType; + } + + /** + * @param string $code + */ + public function setCode($code) + { + $this->code = $code; + } + + public function getCode() + { + if ($this->returnsReference) + { + return "throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), '{$this->name}');"; + } + + return (string) $this->code; + } + + public function useParentCode() + { + $this->code = sprintf( + 'return parent::%s(%s);', $this->getName(), implode(', ', + array_map(array($this, 'generateArgument'), $this->arguments) + ) + ); + } + + private function generateArgument(ArgumentNode $arg) + { + $argument = '$'.$arg->getName(); + + if ($arg->isVariadic()) { + $argument = '...'.$argument; + } + + return $argument; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php new file mode 100644 index 0000000..d720b15 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php @@ -0,0 +1,22 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler\Generator; + +/** + * Reflection interface. + * All reflected classes implement this interface. + * + * @author Konstantin Kudryashov + */ +interface ReflectionInterface +{ +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php new file mode 100644 index 0000000..8a99c4c --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php @@ -0,0 +1,127 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler; + +use Prophecy\Exception\Doubler\DoubleException; +use Prophecy\Exception\Doubler\ClassNotFoundException; +use Prophecy\Exception\Doubler\InterfaceNotFoundException; +use ReflectionClass; + +/** + * Lazy double. + * Gives simple interface to describe double before creating it. + * + * @author Konstantin Kudryashov + */ +class LazyDouble +{ + private $doubler; + private $class; + private $interfaces = array(); + private $arguments = null; + private $double; + + /** + * Initializes lazy double. + * + * @param Doubler $doubler + */ + public function __construct(Doubler $doubler) + { + $this->doubler = $doubler; + } + + /** + * Tells doubler to use specific class as parent one for double. + * + * @param string|ReflectionClass $class + * + * @throws \Prophecy\Exception\Doubler\ClassNotFoundException + * @throws \Prophecy\Exception\Doubler\DoubleException + */ + public function setParentClass($class) + { + if (null !== $this->double) { + throw new DoubleException('Can not extend class with already instantiated double.'); + } + + if (!$class instanceof ReflectionClass) { + if (!class_exists($class)) { + throw new ClassNotFoundException(sprintf('Class %s not found.', $class), $class); + } + + $class = new ReflectionClass($class); + } + + $this->class = $class; + } + + /** + * Tells doubler to implement specific interface with double. + * + * @param string|ReflectionClass $interface + * + * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException + * @throws \Prophecy\Exception\Doubler\DoubleException + */ + public function addInterface($interface) + { + if (null !== $this->double) { + throw new DoubleException( + 'Can not implement interface with already instantiated double.' + ); + } + + if (!$interface instanceof ReflectionClass) { + if (!interface_exists($interface)) { + throw new InterfaceNotFoundException( + sprintf('Interface %s not found.', $interface), + $interface + ); + } + + $interface = new ReflectionClass($interface); + } + + $this->interfaces[] = $interface; + } + + /** + * Sets constructor arguments. + * + * @param array $arguments + */ + public function setArguments(array $arguments = null) + { + $this->arguments = $arguments; + } + + /** + * Creates double instance or returns already created one. + * + * @return DoubleInterface + */ + public function getInstance() + { + if (null === $this->double) { + if (null !== $this->arguments) { + return $this->double = $this->doubler->double( + $this->class, $this->interfaces, $this->arguments + ); + } + + $this->double = $this->doubler->double($this->class, $this->interfaces); + } + + return $this->double; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php new file mode 100644 index 0000000..d67ec6a --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php @@ -0,0 +1,52 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Doubler; + +use ReflectionClass; + +/** + * Name generator. + * Generates classname for double. + * + * @author Konstantin Kudryashov + */ +class NameGenerator +{ + private static $counter = 1; + + /** + * Generates name. + * + * @param ReflectionClass $class + * @param ReflectionClass[] $interfaces + * + * @return string + */ + public function name(ReflectionClass $class = null, array $interfaces) + { + $parts = array(); + + if (null !== $class) { + $parts[] = $class->getName(); + } else { + foreach ($interfaces as $interface) { + $parts[] = $interface->getShortName(); + } + } + + if (!count($parts)) { + $parts[] = 'stdClass'; + } + + return sprintf('Double\%s\P%d', implode('\\', $parts), self::$counter++); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php new file mode 100644 index 0000000..48ed225 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php @@ -0,0 +1,40 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Call; + +use Prophecy\Exception\Prophecy\ObjectProphecyException; +use Prophecy\Prophecy\ObjectProphecy; + +class UnexpectedCallException extends ObjectProphecyException +{ + private $methodName; + private $arguments; + + public function __construct($message, ObjectProphecy $objectProphecy, + $methodName, array $arguments) + { + parent::__construct($message, $objectProphecy); + + $this->methodName = $methodName; + $this->arguments = $arguments; + } + + public function getMethodName() + { + return $this->methodName; + } + + public function getArguments() + { + return $this->arguments; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php new file mode 100644 index 0000000..822918a --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php @@ -0,0 +1,31 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Doubler; + +use Prophecy\Doubler\Generator\Node\ClassNode; + +class ClassCreatorException extends \RuntimeException implements DoublerException +{ + private $node; + + public function __construct($message, ClassNode $node) + { + parent::__construct($message); + + $this->node = $node; + } + + public function getClassNode() + { + return $this->node; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php new file mode 100644 index 0000000..8fc53b8 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php @@ -0,0 +1,31 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Doubler; + +use ReflectionClass; + +class ClassMirrorException extends \RuntimeException implements DoublerException +{ + private $class; + + public function __construct($message, ReflectionClass $class) + { + parent::__construct($message); + + $this->class = $class; + } + + public function getReflectedClass() + { + return $this->class; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php new file mode 100644 index 0000000..5bc826d --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php @@ -0,0 +1,33 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Doubler; + +class ClassNotFoundException extends DoubleException +{ + private $classname; + + /** + * @param string $message + * @param string $classname + */ + public function __construct($message, $classname) + { + parent::__construct($message); + + $this->classname = $classname; + } + + public function getClassname() + { + return $this->classname; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php new file mode 100644 index 0000000..6642a58 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php @@ -0,0 +1,18 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Doubler; + +use RuntimeException; + +class DoubleException extends RuntimeException implements DoublerException +{ +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php new file mode 100644 index 0000000..9d6be17 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php @@ -0,0 +1,18 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Doubler; + +use Prophecy\Exception\Exception; + +interface DoublerException extends Exception +{ +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php new file mode 100644 index 0000000..e344dea --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php @@ -0,0 +1,20 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Doubler; + +class InterfaceNotFoundException extends ClassNotFoundException +{ + public function getInterfaceName() + { + return $this->getClassname(); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php new file mode 100644 index 0000000..8437dc2 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php @@ -0,0 +1,47 @@ +methodName = $methodName; + $this->className = $className; + } + + + /** + * @return string + */ + public function getMethodName() + { + return $this->methodName; + } + + /** + * @return string + */ + public function getClassName() + { + return $this->className; + } + + } diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php new file mode 100644 index 0000000..b113941 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php @@ -0,0 +1,60 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Doubler; + +class MethodNotFoundException extends DoubleException +{ + /** + * @var string + */ + private $classname; + + /** + * @var string + */ + private $methodName; + + /** + * @var array + */ + private $arguments; + + /** + * @param string $message + * @param string $classname + * @param string $methodName + * @param null|Argument\ArgumentsWildcard|array $arguments + */ + public function __construct($message, $classname, $methodName, $arguments = null) + { + parent::__construct($message); + + $this->classname = $classname; + $this->methodName = $methodName; + $this->arguments = $arguments; + } + + public function getClassname() + { + return $this->classname; + } + + public function getMethodName() + { + return $this->methodName; + } + + public function getArguments() + { + return $this->arguments; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php new file mode 100644 index 0000000..6303049 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php @@ -0,0 +1,41 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Doubler; + +class ReturnByReferenceException extends DoubleException +{ + private $classname; + private $methodName; + + /** + * @param string $message + * @param string $classname + * @param string $methodName + */ + public function __construct($message, $classname, $methodName) + { + parent::__construct($message); + + $this->classname = $classname; + $this->methodName = $methodName; + } + + public function getClassname() + { + return $this->classname; + } + + public function getMethodName() + { + return $this->methodName; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php new file mode 100644 index 0000000..ac9fe4d --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php @@ -0,0 +1,26 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception; + +/** + * Core Prophecy exception interface. + * All Prophecy exceptions implement it. + * + * @author Konstantin Kudryashov + */ +interface Exception +{ + /** + * @return string + */ + public function getMessage(); +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..bc91c69 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php @@ -0,0 +1,16 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception; + +class InvalidArgumentException extends \InvalidArgumentException implements Exception +{ +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php new file mode 100644 index 0000000..44b598a --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php @@ -0,0 +1,50 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Prediction; + +use Prophecy\Prophecy\ObjectProphecy; + +class AggregateException extends \RuntimeException implements PredictionException +{ + private $exceptions = array(); + private $objectProphecy; + + public function append(PredictionException $exception) + { + $message = $exception->getMessage(); + $message = ' '.strtr($message, array("\n" => "\n "))."\n"; + + $this->message = rtrim($this->message.$message); + $this->exceptions[] = $exception; + } + + /** + * @return PredictionException[] + */ + public function getExceptions() + { + return $this->exceptions; + } + + public function setObjectProphecy(ObjectProphecy $objectProphecy) + { + $this->objectProphecy = $objectProphecy; + } + + /** + * @return ObjectProphecy + */ + public function getObjectProphecy() + { + return $this->objectProphecy; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php new file mode 100644 index 0000000..bbbbc3d --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php @@ -0,0 +1,24 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Prediction; + +use RuntimeException; + +/** + * Basic failed prediction exception. + * Use it for custom prediction failures. + * + * @author Konstantin Kudryashov + */ +class FailedPredictionException extends RuntimeException implements PredictionException +{ +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php new file mode 100644 index 0000000..05ea4aa --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php @@ -0,0 +1,18 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Prediction; + +use Prophecy\Exception\Prophecy\MethodProphecyException; + +class NoCallsException extends MethodProphecyException implements PredictionException +{ +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php new file mode 100644 index 0000000..2596b1e --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php @@ -0,0 +1,18 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Prediction; + +use Prophecy\Exception\Exception; + +interface PredictionException extends Exception +{ +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php new file mode 100644 index 0000000..9d90543 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php @@ -0,0 +1,31 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Prediction; + +use Prophecy\Prophecy\MethodProphecy; + +class UnexpectedCallsCountException extends UnexpectedCallsException +{ + private $expectedCount; + + public function __construct($message, MethodProphecy $methodProphecy, $count, array $calls) + { + parent::__construct($message, $methodProphecy, $calls); + + $this->expectedCount = intval($count); + } + + public function getExpectedCount() + { + return $this->expectedCount; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php new file mode 100644 index 0000000..7a99c2d --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php @@ -0,0 +1,32 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Prediction; + +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Exception\Prophecy\MethodProphecyException; + +class UnexpectedCallsException extends MethodProphecyException implements PredictionException +{ + private $calls = array(); + + public function __construct($message, MethodProphecy $methodProphecy, array $calls) + { + parent::__construct($message, $methodProphecy); + + $this->calls = $calls; + } + + public function getCalls() + { + return $this->calls; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php new file mode 100644 index 0000000..1b03eaf --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php @@ -0,0 +1,34 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Prophecy; + +use Prophecy\Prophecy\MethodProphecy; + +class MethodProphecyException extends ObjectProphecyException +{ + private $methodProphecy; + + public function __construct($message, MethodProphecy $methodProphecy) + { + parent::__construct($message, $methodProphecy->getObjectProphecy()); + + $this->methodProphecy = $methodProphecy; + } + + /** + * @return MethodProphecy + */ + public function getMethodProphecy() + { + return $this->methodProphecy; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php new file mode 100644 index 0000000..e345402 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php @@ -0,0 +1,34 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Prophecy; + +use Prophecy\Prophecy\ObjectProphecy; + +class ObjectProphecyException extends \RuntimeException implements ProphecyException +{ + private $objectProphecy; + + public function __construct($message, ObjectProphecy $objectProphecy) + { + parent::__construct($message); + + $this->objectProphecy = $objectProphecy; + } + + /** + * @return ObjectProphecy + */ + public function getObjectProphecy() + { + return $this->objectProphecy; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php new file mode 100644 index 0000000..9157332 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php @@ -0,0 +1,18 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Exception\Prophecy; + +use Prophecy\Exception\Exception; + +interface ProphecyException extends Exception +{ +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php new file mode 100644 index 0000000..b478736 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php @@ -0,0 +1,86 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prediction; + +use Prophecy\Call\Call; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Argument\ArgumentsWildcard; +use Prophecy\Argument\Token\AnyValuesToken; +use Prophecy\Util\StringUtil; +use Prophecy\Exception\Prediction\NoCallsException; + +/** + * Call prediction. + * + * @author Konstantin Kudryashov + */ +class CallPrediction implements PredictionInterface +{ + private $util; + + /** + * Initializes prediction. + * + * @param StringUtil $util + */ + public function __construct(StringUtil $util = null) + { + $this->util = $util ?: new StringUtil; + } + + /** + * Tests that there was at least one call. + * + * @param Call[] $calls + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @throws \Prophecy\Exception\Prediction\NoCallsException + */ + public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) + { + if (count($calls)) { + return; + } + + $methodCalls = $object->findProphecyMethodCalls( + $method->getMethodName(), + new ArgumentsWildcard(array(new AnyValuesToken)) + ); + + if (count($methodCalls)) { + throw new NoCallsException(sprintf( + "No calls have been made that match:\n". + " %s->%s(%s)\n". + "but expected at least one.\n". + "Recorded `%s(...)` calls:\n%s", + + get_class($object->reveal()), + $method->getMethodName(), + $method->getArgumentsWildcard(), + $method->getMethodName(), + $this->util->stringifyCalls($methodCalls) + ), $method); + } + + throw new NoCallsException(sprintf( + "No calls have been made that match:\n". + " %s->%s(%s)\n". + "but expected at least one.", + + get_class($object->reveal()), + $method->getMethodName(), + $method->getArgumentsWildcard() + ), $method); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php new file mode 100644 index 0000000..31c6c57 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php @@ -0,0 +1,107 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prediction; + +use Prophecy\Call\Call; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Argument\ArgumentsWildcard; +use Prophecy\Argument\Token\AnyValuesToken; +use Prophecy\Util\StringUtil; +use Prophecy\Exception\Prediction\UnexpectedCallsCountException; + +/** + * Prediction interface. + * Predictions are logical test blocks, tied to `should...` keyword. + * + * @author Konstantin Kudryashov + */ +class CallTimesPrediction implements PredictionInterface +{ + private $times; + private $util; + + /** + * Initializes prediction. + * + * @param int $times + * @param StringUtil $util + */ + public function __construct($times, StringUtil $util = null) + { + $this->times = intval($times); + $this->util = $util ?: new StringUtil; + } + + /** + * Tests that there was exact amount of calls made. + * + * @param Call[] $calls + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @throws \Prophecy\Exception\Prediction\UnexpectedCallsCountException + */ + public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) + { + if ($this->times == count($calls)) { + return; + } + + $methodCalls = $object->findProphecyMethodCalls( + $method->getMethodName(), + new ArgumentsWildcard(array(new AnyValuesToken)) + ); + + if (count($calls)) { + $message = sprintf( + "Expected exactly %d calls that match:\n". + " %s->%s(%s)\n". + "but %d were made:\n%s", + + $this->times, + get_class($object->reveal()), + $method->getMethodName(), + $method->getArgumentsWildcard(), + count($calls), + $this->util->stringifyCalls($calls) + ); + } elseif (count($methodCalls)) { + $message = sprintf( + "Expected exactly %d calls that match:\n". + " %s->%s(%s)\n". + "but none were made.\n". + "Recorded `%s(...)` calls:\n%s", + + $this->times, + get_class($object->reveal()), + $method->getMethodName(), + $method->getArgumentsWildcard(), + $method->getMethodName(), + $this->util->stringifyCalls($methodCalls) + ); + } else { + $message = sprintf( + "Expected exactly %d calls that match:\n". + " %s->%s(%s)\n". + "but none were made.", + + $this->times, + get_class($object->reveal()), + $method->getMethodName(), + $method->getArgumentsWildcard() + ); + } + + throw new UnexpectedCallsCountException($message, $method, $this->times, $calls); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php new file mode 100644 index 0000000..44bc782 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php @@ -0,0 +1,65 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prediction; + +use Prophecy\Call\Call; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Exception\InvalidArgumentException; +use Closure; + +/** + * Callback prediction. + * + * @author Konstantin Kudryashov + */ +class CallbackPrediction implements PredictionInterface +{ + private $callback; + + /** + * Initializes callback prediction. + * + * @param callable $callback Custom callback + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function __construct($callback) + { + if (!is_callable($callback)) { + throw new InvalidArgumentException(sprintf( + 'Callable expected as an argument to CallbackPrediction, but got %s.', + gettype($callback) + )); + } + + $this->callback = $callback; + } + + /** + * Executes preset callback. + * + * @param Call[] $calls + * @param ObjectProphecy $object + * @param MethodProphecy $method + */ + public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) + { + $callback = $this->callback; + + if ($callback instanceof Closure && method_exists('Closure', 'bind')) { + $callback = Closure::bind($callback, $object); + } + + call_user_func($callback, $calls, $object, $method); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php new file mode 100644 index 0000000..46ac5bf --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php @@ -0,0 +1,68 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prediction; + +use Prophecy\Call\Call; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Util\StringUtil; +use Prophecy\Exception\Prediction\UnexpectedCallsException; + +/** + * No calls prediction. + * + * @author Konstantin Kudryashov + */ +class NoCallsPrediction implements PredictionInterface +{ + private $util; + + /** + * Initializes prediction. + * + * @param null|StringUtil $util + */ + public function __construct(StringUtil $util = null) + { + $this->util = $util ?: new StringUtil; + } + + /** + * Tests that there were no calls made. + * + * @param Call[] $calls + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @throws \Prophecy\Exception\Prediction\UnexpectedCallsException + */ + public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) + { + if (!count($calls)) { + return; + } + + $verb = count($calls) === 1 ? 'was' : 'were'; + + throw new UnexpectedCallsException(sprintf( + "No calls expected that match:\n". + " %s->%s(%s)\n". + "but %d %s made:\n%s", + get_class($object->reveal()), + $method->getMethodName(), + $method->getArgumentsWildcard(), + count($calls), + $verb, + $this->util->stringifyCalls($calls) + ), $method, $calls); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php new file mode 100644 index 0000000..f7fb06a --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php @@ -0,0 +1,37 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prediction; + +use Prophecy\Call\Call; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; + +/** + * Prediction interface. + * Predictions are logical test blocks, tied to `should...` keyword. + * + * @author Konstantin Kudryashov + */ +interface PredictionInterface +{ + /** + * Tests that double fulfilled prediction. + * + * @param Call[] $calls + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @throws object + * @return void + */ + public function check(array $calls, ObjectProphecy $object, MethodProphecy $method); +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php new file mode 100644 index 0000000..5f406bf --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php @@ -0,0 +1,66 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Promise; + +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Exception\InvalidArgumentException; +use Closure; + +/** + * Callback promise. + * + * @author Konstantin Kudryashov + */ +class CallbackPromise implements PromiseInterface +{ + private $callback; + + /** + * Initializes callback promise. + * + * @param callable $callback Custom callback + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function __construct($callback) + { + if (!is_callable($callback)) { + throw new InvalidArgumentException(sprintf( + 'Callable expected as an argument to CallbackPromise, but got %s.', + gettype($callback) + )); + } + + $this->callback = $callback; + } + + /** + * Evaluates promise callback. + * + * @param array $args + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @return mixed + */ + public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) + { + $callback = $this->callback; + + if ($callback instanceof Closure && method_exists('Closure', 'bind')) { + $callback = Closure::bind($callback, $object); + } + + return call_user_func($callback, $args, $object, $method); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php new file mode 100644 index 0000000..382537b --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php @@ -0,0 +1,35 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Promise; + +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; + +/** + * Promise interface. + * Promises are logical blocks, tied to `will...` keyword. + * + * @author Konstantin Kudryashov + */ +interface PromiseInterface +{ + /** + * Evaluates promise. + * + * @param array $args + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @return mixed + */ + public function execute(array $args, ObjectProphecy $object, MethodProphecy $method); +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php new file mode 100644 index 0000000..39bfeea --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php @@ -0,0 +1,61 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Promise; + +use Prophecy\Exception\InvalidArgumentException; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; + +/** + * Return argument promise. + * + * @author Konstantin Kudryashov + */ +class ReturnArgumentPromise implements PromiseInterface +{ + /** + * @var int + */ + private $index; + + /** + * Initializes callback promise. + * + * @param int $index The zero-indexed number of the argument to return + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function __construct($index = 0) + { + if (!is_int($index) || $index < 0) { + throw new InvalidArgumentException(sprintf( + 'Zero-based index expected as argument to ReturnArgumentPromise, but got %s.', + $index + )); + } + $this->index = $index; + } + + /** + * Returns nth argument if has one, null otherwise. + * + * @param array $args + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @return null|mixed + */ + public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) + { + return count($args) > $this->index ? $args[$this->index] : null; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php new file mode 100644 index 0000000..c7d5ac5 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php @@ -0,0 +1,55 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Promise; + +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; + +/** + * Return promise. + * + * @author Konstantin Kudryashov + */ +class ReturnPromise implements PromiseInterface +{ + private $returnValues = array(); + + /** + * Initializes promise. + * + * @param array $returnValues Array of values + */ + public function __construct(array $returnValues) + { + $this->returnValues = $returnValues; + } + + /** + * Returns saved values one by one until last one, then continuously returns last value. + * + * @param array $args + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @return mixed + */ + public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) + { + $value = array_shift($this->returnValues); + + if (!count($this->returnValues)) { + $this->returnValues[] = $value; + } + + return $value; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php new file mode 100644 index 0000000..68a8b47 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php @@ -0,0 +1,91 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Promise; + +use Doctrine\Instantiator\Instantiator; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Exception\InvalidArgumentException; +use ReflectionClass; + +/** + * Throw promise. + * + * @author Konstantin Kudryashov + */ +class ThrowPromise implements PromiseInterface +{ + private $exception; + + /** + * @var \Doctrine\Instantiator\Instantiator + */ + private $instantiator; + + /** + * Initializes promise. + * + * @param string|\Exception $exception Exception class name or instance + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function __construct($exception) + { + if (is_string($exception)) { + if (!class_exists($exception) + && 'Exception' !== $exception + && !is_subclass_of($exception, 'Exception')) { + throw new InvalidArgumentException(sprintf( + 'Exception class or instance expected as argument to ThrowPromise, but got %s.', + $exception + )); + } + } elseif (!$exception instanceof \Exception) { + throw new InvalidArgumentException(sprintf( + 'Exception class or instance expected as argument to ThrowPromise, but got %s.', + is_object($exception) ? get_class($exception) : gettype($exception) + )); + } + + $this->exception = $exception; + } + + /** + * Throws predefined exception. + * + * @param array $args + * @param ObjectProphecy $object + * @param MethodProphecy $method + * + * @throws object + */ + public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) + { + if (is_string($this->exception)) { + $classname = $this->exception; + $reflection = new ReflectionClass($classname); + $constructor = $reflection->getConstructor(); + + if ($constructor->isPublic() && 0 == $constructor->getNumberOfRequiredParameters()) { + throw $reflection->newInstance(); + } + + if (!$this->instantiator) { + $this->instantiator = new Instantiator(); + } + + throw $this->instantiator->instantiate($classname); + } + + throw $this->exception; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php new file mode 100644 index 0000000..426df32 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php @@ -0,0 +1,437 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prophecy; + +use Prophecy\Argument; +use Prophecy\Prophet; +use Prophecy\Promise; +use Prophecy\Prediction; +use Prophecy\Exception\Doubler\MethodNotFoundException; +use Prophecy\Exception\InvalidArgumentException; +use Prophecy\Exception\Prophecy\MethodProphecyException; + +/** + * Method prophecy. + * + * @author Konstantin Kudryashov + */ +class MethodProphecy +{ + private $objectProphecy; + private $methodName; + private $argumentsWildcard; + private $promise; + private $prediction; + private $checkedPredictions = array(); + private $bound = false; + + /** + * Initializes method prophecy. + * + * @param ObjectProphecy $objectProphecy + * @param string $methodName + * @param null|Argument\ArgumentsWildcard|array $arguments + * + * @throws \Prophecy\Exception\Doubler\MethodNotFoundException If method not found + */ + public function __construct(ObjectProphecy $objectProphecy, $methodName, $arguments = null) + { + $double = $objectProphecy->reveal(); + if (!method_exists($double, $methodName)) { + throw new MethodNotFoundException(sprintf( + 'Method `%s::%s()` is not defined.', get_class($double), $methodName + ), get_class($double), $methodName, $arguments); + } + + $this->objectProphecy = $objectProphecy; + $this->methodName = $methodName; + + $reflectedMethod = new \ReflectionMethod($double, $methodName); + if ($reflectedMethod->isFinal()) { + throw new MethodProphecyException(sprintf( + "Can not add prophecy for a method `%s::%s()`\n". + "as it is a final method.", + get_class($double), + $methodName + ), $this); + } + + if (null !== $arguments) { + $this->withArguments($arguments); + } + + if (version_compare(PHP_VERSION, '7.0', '>=') && true === $reflectedMethod->hasReturnType()) { + $type = (string) $reflectedMethod->getReturnType(); + $this->will(function () use ($type) { + switch ($type) { + case 'string': return ''; + case 'float': return 0.0; + case 'int': return 0; + case 'bool': return false; + case 'array': return array(); + + case 'callable': + case 'Closure': + return function () {}; + + case 'Traversable': + case 'Generator': + // Remove eval() when minimum version >=5.5 + $generator = eval('return function () { yield; };'); + return $generator(); + + default: + $prophet = new Prophet; + return $prophet->prophesize($type)->reveal(); + } + }); + } + } + + /** + * Sets argument wildcard. + * + * @param array|Argument\ArgumentsWildcard $arguments + * + * @return $this + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function withArguments($arguments) + { + if (is_array($arguments)) { + $arguments = new Argument\ArgumentsWildcard($arguments); + } + + if (!$arguments instanceof Argument\ArgumentsWildcard) { + throw new InvalidArgumentException(sprintf( + "Either an array or an instance of ArgumentsWildcard expected as\n". + 'a `MethodProphecy::withArguments()` argument, but got %s.', + gettype($arguments) + )); + } + + $this->argumentsWildcard = $arguments; + + return $this; + } + + /** + * Sets custom promise to the prophecy. + * + * @param callable|Promise\PromiseInterface $promise + * + * @return $this + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function will($promise) + { + if (is_callable($promise)) { + $promise = new Promise\CallbackPromise($promise); + } + + if (!$promise instanceof Promise\PromiseInterface) { + throw new InvalidArgumentException(sprintf( + 'Expected callable or instance of PromiseInterface, but got %s.', + gettype($promise) + )); + } + + $this->bindToObjectProphecy(); + $this->promise = $promise; + + return $this; + } + + /** + * Sets return promise to the prophecy. + * + * @see Prophecy\Promise\ReturnPromise + * + * @return $this + */ + public function willReturn() + { + return $this->will(new Promise\ReturnPromise(func_get_args())); + } + + /** + * Sets return argument promise to the prophecy. + * + * @param int $index The zero-indexed number of the argument to return + * + * @see Prophecy\Promise\ReturnArgumentPromise + * + * @return $this + */ + public function willReturnArgument($index = 0) + { + return $this->will(new Promise\ReturnArgumentPromise($index)); + } + + /** + * Sets throw promise to the prophecy. + * + * @see Prophecy\Promise\ThrowPromise + * + * @param string|\Exception $exception Exception class or instance + * + * @return $this + */ + public function willThrow($exception) + { + return $this->will(new Promise\ThrowPromise($exception)); + } + + /** + * Sets custom prediction to the prophecy. + * + * @param callable|Prediction\PredictionInterface $prediction + * + * @return $this + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function should($prediction) + { + if (is_callable($prediction)) { + $prediction = new Prediction\CallbackPrediction($prediction); + } + + if (!$prediction instanceof Prediction\PredictionInterface) { + throw new InvalidArgumentException(sprintf( + 'Expected callable or instance of PredictionInterface, but got %s.', + gettype($prediction) + )); + } + + $this->bindToObjectProphecy(); + $this->prediction = $prediction; + + return $this; + } + + /** + * Sets call prediction to the prophecy. + * + * @see Prophecy\Prediction\CallPrediction + * + * @return $this + */ + public function shouldBeCalled() + { + return $this->should(new Prediction\CallPrediction); + } + + /** + * Sets no calls prediction to the prophecy. + * + * @see Prophecy\Prediction\NoCallsPrediction + * + * @return $this + */ + public function shouldNotBeCalled() + { + return $this->should(new Prediction\NoCallsPrediction); + } + + /** + * Sets call times prediction to the prophecy. + * + * @see Prophecy\Prediction\CallTimesPrediction + * + * @param $count + * + * @return $this + */ + public function shouldBeCalledTimes($count) + { + return $this->should(new Prediction\CallTimesPrediction($count)); + } + + /** + * Checks provided prediction immediately. + * + * @param callable|Prediction\PredictionInterface $prediction + * + * @return $this + * + * @throws \Prophecy\Exception\InvalidArgumentException + */ + public function shouldHave($prediction) + { + if (is_callable($prediction)) { + $prediction = new Prediction\CallbackPrediction($prediction); + } + + if (!$prediction instanceof Prediction\PredictionInterface) { + throw new InvalidArgumentException(sprintf( + 'Expected callable or instance of PredictionInterface, but got %s.', + gettype($prediction) + )); + } + + if (null === $this->promise) { + $this->willReturn(); + } + + $calls = $this->getObjectProphecy()->findProphecyMethodCalls( + $this->getMethodName(), + $this->getArgumentsWildcard() + ); + + try { + $prediction->check($calls, $this->getObjectProphecy(), $this); + $this->checkedPredictions[] = $prediction; + } catch (\Exception $e) { + $this->checkedPredictions[] = $prediction; + + throw $e; + } + + return $this; + } + + /** + * Checks call prediction. + * + * @see Prophecy\Prediction\CallPrediction + * + * @return $this + */ + public function shouldHaveBeenCalled() + { + return $this->shouldHave(new Prediction\CallPrediction); + } + + /** + * Checks no calls prediction. + * + * @see Prophecy\Prediction\NoCallsPrediction + * + * @return $this + */ + public function shouldNotHaveBeenCalled() + { + return $this->shouldHave(new Prediction\NoCallsPrediction); + } + + /** + * Checks no calls prediction. + * + * @see Prophecy\Prediction\NoCallsPrediction + * @deprecated + * + * @return $this + */ + public function shouldNotBeenCalled() + { + return $this->shouldNotHaveBeenCalled(); + } + + /** + * Checks call times prediction. + * + * @see Prophecy\Prediction\CallTimesPrediction + * + * @param int $count + * + * @return $this + */ + public function shouldHaveBeenCalledTimes($count) + { + return $this->shouldHave(new Prediction\CallTimesPrediction($count)); + } + + /** + * Checks currently registered [with should(...)] prediction. + */ + public function checkPrediction() + { + if (null === $this->prediction) { + return; + } + + $this->shouldHave($this->prediction); + } + + /** + * Returns currently registered promise. + * + * @return null|Promise\PromiseInterface + */ + public function getPromise() + { + return $this->promise; + } + + /** + * Returns currently registered prediction. + * + * @return null|Prediction\PredictionInterface + */ + public function getPrediction() + { + return $this->prediction; + } + + /** + * Returns predictions that were checked on this object. + * + * @return Prediction\PredictionInterface[] + */ + public function getCheckedPredictions() + { + return $this->checkedPredictions; + } + + /** + * Returns object prophecy this method prophecy is tied to. + * + * @return ObjectProphecy + */ + public function getObjectProphecy() + { + return $this->objectProphecy; + } + + /** + * Returns method name. + * + * @return string + */ + public function getMethodName() + { + return $this->methodName; + } + + /** + * Returns arguments wildcard. + * + * @return Argument\ArgumentsWildcard + */ + public function getArgumentsWildcard() + { + return $this->argumentsWildcard; + } + + private function bindToObjectProphecy() + { + if ($this->bound) { + return; + } + + $this->getObjectProphecy()->addMethodProphecy($this); + $this->bound = true; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php new file mode 100644 index 0000000..8d8f8a1 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php @@ -0,0 +1,281 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prophecy; + +use SebastianBergmann\Comparator\ComparisonFailure; +use Prophecy\Comparator\Factory as ComparatorFactory; +use Prophecy\Call\Call; +use Prophecy\Doubler\LazyDouble; +use Prophecy\Argument\ArgumentsWildcard; +use Prophecy\Call\CallCenter; +use Prophecy\Exception\Prophecy\ObjectProphecyException; +use Prophecy\Exception\Prophecy\MethodProphecyException; +use Prophecy\Exception\Prediction\AggregateException; +use Prophecy\Exception\Prediction\PredictionException; + +/** + * Object prophecy. + * + * @author Konstantin Kudryashov + */ +class ObjectProphecy implements ProphecyInterface +{ + private $lazyDouble; + private $callCenter; + private $revealer; + private $comparatorFactory; + + /** + * @var MethodProphecy[][] + */ + private $methodProphecies = array(); + + /** + * Initializes object prophecy. + * + * @param LazyDouble $lazyDouble + * @param CallCenter $callCenter + * @param RevealerInterface $revealer + * @param ComparatorFactory $comparatorFactory + */ + public function __construct( + LazyDouble $lazyDouble, + CallCenter $callCenter = null, + RevealerInterface $revealer = null, + ComparatorFactory $comparatorFactory = null + ) { + $this->lazyDouble = $lazyDouble; + $this->callCenter = $callCenter ?: new CallCenter; + $this->revealer = $revealer ?: new Revealer; + + $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); + } + + /** + * Forces double to extend specific class. + * + * @param string $class + * + * @return $this + */ + public function willExtend($class) + { + $this->lazyDouble->setParentClass($class); + + return $this; + } + + /** + * Forces double to implement specific interface. + * + * @param string $interface + * + * @return $this + */ + public function willImplement($interface) + { + $this->lazyDouble->addInterface($interface); + + return $this; + } + + /** + * Sets constructor arguments. + * + * @param array $arguments + * + * @return $this + */ + public function willBeConstructedWith(array $arguments = null) + { + $this->lazyDouble->setArguments($arguments); + + return $this; + } + + /** + * Reveals double. + * + * @return object + * + * @throws \Prophecy\Exception\Prophecy\ObjectProphecyException If double doesn't implement needed interface + */ + public function reveal() + { + $double = $this->lazyDouble->getInstance(); + + if (null === $double || !$double instanceof ProphecySubjectInterface) { + throw new ObjectProphecyException( + "Generated double must implement ProphecySubjectInterface, but it does not.\n". + 'It seems you have wrongly configured doubler without required ClassPatch.', + $this + ); + } + + $double->setProphecy($this); + + return $double; + } + + /** + * Adds method prophecy to object prophecy. + * + * @param MethodProphecy $methodProphecy + * + * @throws \Prophecy\Exception\Prophecy\MethodProphecyException If method prophecy doesn't + * have arguments wildcard + */ + public function addMethodProphecy(MethodProphecy $methodProphecy) + { + $argumentsWildcard = $methodProphecy->getArgumentsWildcard(); + if (null === $argumentsWildcard) { + throw new MethodProphecyException(sprintf( + "Can not add prophecy for a method `%s::%s()`\n". + "as you did not specify arguments wildcard for it.", + get_class($this->reveal()), + $methodProphecy->getMethodName() + ), $methodProphecy); + } + + $methodName = $methodProphecy->getMethodName(); + + if (!isset($this->methodProphecies[$methodName])) { + $this->methodProphecies[$methodName] = array(); + } + + $this->methodProphecies[$methodName][] = $methodProphecy; + } + + /** + * Returns either all or related to single method prophecies. + * + * @param null|string $methodName + * + * @return MethodProphecy[] + */ + public function getMethodProphecies($methodName = null) + { + if (null === $methodName) { + return $this->methodProphecies; + } + + if (!isset($this->methodProphecies[$methodName])) { + return array(); + } + + return $this->methodProphecies[$methodName]; + } + + /** + * Makes specific method call. + * + * @param string $methodName + * @param array $arguments + * + * @return mixed + */ + public function makeProphecyMethodCall($methodName, array $arguments) + { + $arguments = $this->revealer->reveal($arguments); + $return = $this->callCenter->makeCall($this, $methodName, $arguments); + + return $this->revealer->reveal($return); + } + + /** + * Finds calls by method name & arguments wildcard. + * + * @param string $methodName + * @param ArgumentsWildcard $wildcard + * + * @return Call[] + */ + public function findProphecyMethodCalls($methodName, ArgumentsWildcard $wildcard) + { + return $this->callCenter->findCalls($methodName, $wildcard); + } + + /** + * Checks that registered method predictions do not fail. + * + * @throws \Prophecy\Exception\Prediction\AggregateException If any of registered predictions fail + */ + public function checkProphecyMethodsPredictions() + { + $exception = new AggregateException(sprintf("%s:\n", get_class($this->reveal()))); + $exception->setObjectProphecy($this); + + foreach ($this->methodProphecies as $prophecies) { + foreach ($prophecies as $prophecy) { + try { + $prophecy->checkPrediction(); + } catch (PredictionException $e) { + $exception->append($e); + } + } + } + + if (count($exception->getExceptions())) { + throw $exception; + } + } + + /** + * Creates new method prophecy using specified method name and arguments. + * + * @param string $methodName + * @param array $arguments + * + * @return MethodProphecy + */ + public function __call($methodName, array $arguments) + { + $arguments = new ArgumentsWildcard($this->revealer->reveal($arguments)); + + foreach ($this->getMethodProphecies($methodName) as $prophecy) { + $argumentsWildcard = $prophecy->getArgumentsWildcard(); + $comparator = $this->comparatorFactory->getComparatorFor( + $argumentsWildcard, $arguments + ); + + try { + $comparator->assertEquals($argumentsWildcard, $arguments); + return $prophecy; + } catch (ComparisonFailure $failure) {} + } + + return new MethodProphecy($this, $methodName, $arguments); + } + + /** + * Tries to get property value from double. + * + * @param string $name + * + * @return mixed + */ + public function __get($name) + { + return $this->reveal()->$name; + } + + /** + * Tries to set property value to double. + * + * @param string $name + * @param mixed $value + */ + public function __set($name, $value) + { + $this->reveal()->$name = $this->revealer->reveal($value); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php new file mode 100644 index 0000000..462f15a --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php @@ -0,0 +1,27 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prophecy; + +/** + * Core Prophecy interface. + * + * @author Konstantin Kudryashov + */ +interface ProphecyInterface +{ + /** + * Reveals prophecy object (double) . + * + * @return object + */ + public function reveal(); +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php new file mode 100644 index 0000000..2d83958 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php @@ -0,0 +1,34 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prophecy; + +/** + * Controllable doubles interface. + * + * @author Konstantin Kudryashov + */ +interface ProphecySubjectInterface +{ + /** + * Sets subject prophecy. + * + * @param ProphecyInterface $prophecy + */ + public function setProphecy(ProphecyInterface $prophecy); + + /** + * Returns subject prophecy. + * + * @return ProphecyInterface + */ + public function getProphecy(); +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php new file mode 100644 index 0000000..60ecdac --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php @@ -0,0 +1,44 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prophecy; + +/** + * Basic prophecies revealer. + * + * @author Konstantin Kudryashov + */ +class Revealer implements RevealerInterface +{ + /** + * Unwraps value(s). + * + * @param mixed $value + * + * @return mixed + */ + public function reveal($value) + { + if (is_array($value)) { + return array_map(array($this, __FUNCTION__), $value); + } + + if (!is_object($value)) { + return $value; + } + + if ($value instanceof ProphecyInterface) { + $value = $value->reveal(); + } + + return $value; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php new file mode 100644 index 0000000..ffc82bb --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php @@ -0,0 +1,29 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Prophecy; + +/** + * Prophecies revealer interface. + * + * @author Konstantin Kudryashov + */ +interface RevealerInterface +{ + /** + * Unwraps value(s). + * + * @param mixed $value + * + * @return mixed + */ + public function reveal($value); +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophet.php b/vendor/phpspec/prophecy/src/Prophecy/Prophet.php new file mode 100644 index 0000000..ac64923 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Prophet.php @@ -0,0 +1,134 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy; + +use Prophecy\Doubler\Doubler; +use Prophecy\Doubler\LazyDouble; +use Prophecy\Doubler\ClassPatch; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophecy\RevealerInterface; +use Prophecy\Prophecy\Revealer; +use Prophecy\Call\CallCenter; +use Prophecy\Util\StringUtil; +use Prophecy\Exception\Prediction\PredictionException; +use Prophecy\Exception\Prediction\AggregateException; + +/** + * Prophet creates prophecies. + * + * @author Konstantin Kudryashov + */ +class Prophet +{ + private $doubler; + private $revealer; + private $util; + + /** + * @var ObjectProphecy[] + */ + private $prophecies = array(); + + /** + * Initializes Prophet. + * + * @param null|Doubler $doubler + * @param null|RevealerInterface $revealer + * @param null|StringUtil $util + */ + public function __construct(Doubler $doubler = null, RevealerInterface $revealer = null, + StringUtil $util = null) + { + if (null === $doubler) { + $doubler = new Doubler; + $doubler->registerClassPatch(new ClassPatch\SplFileInfoPatch); + $doubler->registerClassPatch(new ClassPatch\TraversablePatch); + $doubler->registerClassPatch(new ClassPatch\DisableConstructorPatch); + $doubler->registerClassPatch(new ClassPatch\ProphecySubjectPatch); + $doubler->registerClassPatch(new ClassPatch\ReflectionClassNewInstancePatch); + $doubler->registerClassPatch(new ClassPatch\HhvmExceptionPatch()); + $doubler->registerClassPatch(new ClassPatch\MagicCallPatch); + $doubler->registerClassPatch(new ClassPatch\KeywordPatch); + } + + $this->doubler = $doubler; + $this->revealer = $revealer ?: new Revealer; + $this->util = $util ?: new StringUtil; + } + + /** + * Creates new object prophecy. + * + * @param null|string $classOrInterface Class or interface name + * + * @return ObjectProphecy + */ + public function prophesize($classOrInterface = null) + { + $this->prophecies[] = $prophecy = new ObjectProphecy( + new LazyDouble($this->doubler), + new CallCenter($this->util), + $this->revealer + ); + + if ($classOrInterface && class_exists($classOrInterface)) { + return $prophecy->willExtend($classOrInterface); + } + + if ($classOrInterface && interface_exists($classOrInterface)) { + return $prophecy->willImplement($classOrInterface); + } + + return $prophecy; + } + + /** + * Returns all created object prophecies. + * + * @return ObjectProphecy[] + */ + public function getProphecies() + { + return $this->prophecies; + } + + /** + * Returns Doubler instance assigned to this Prophet. + * + * @return Doubler + */ + public function getDoubler() + { + return $this->doubler; + } + + /** + * Checks all predictions defined by prophecies of this Prophet. + * + * @throws Exception\Prediction\AggregateException If any prediction fails + */ + public function checkPredictions() + { + $exception = new AggregateException("Some predictions failed:\n"); + foreach ($this->prophecies as $prophecy) { + try { + $prophecy->checkProphecyMethodsPredictions(); + } catch (PredictionException $e) { + $exception->append($e); + } + } + + if (count($exception->getExceptions())) { + throw $exception; + } + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php b/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php new file mode 100644 index 0000000..49ed6a3 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php @@ -0,0 +1,211 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * This class is a modification from sebastianbergmann/exporter + * @see https://github.com/sebastianbergmann/exporter + */ +class ExportUtil +{ + /** + * Exports a value as a string + * + * The output of this method is similar to the output of print_r(), but + * improved in various aspects: + * + * - NULL is rendered as "null" (instead of "") + * - TRUE is rendered as "true" (instead of "1") + * - FALSE is rendered as "false" (instead of "") + * - Strings are always quoted with single quotes + * - Carriage returns and newlines are normalized to \n + * - Recursion and repeated rendering is treated properly + * + * @param mixed $value + * @param int $indentation The indentation level of the 2nd+ line + * @return string + */ + public static function export($value, $indentation = 0) + { + return self::recursiveExport($value, $indentation); + } + + /** + * Converts an object to an array containing all of its private, protected + * and public properties. + * + * @param mixed $value + * @return array + */ + public static function toArray($value) + { + if (!is_object($value)) { + return (array) $value; + } + + $array = array(); + + foreach ((array) $value as $key => $val) { + // properties are transformed to keys in the following way: + // private $property => "\0Classname\0property" + // protected $property => "\0*\0property" + // public $property => "property" + if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) { + $key = $matches[1]; + } + + // See https://github.com/php/php-src/commit/5721132 + if ($key === "\0gcdata") { + continue; + } + + $array[$key] = $val; + } + + // Some internal classes like SplObjectStorage don't work with the + // above (fast) mechanism nor with reflection in Zend. + // Format the output similarly to print_r() in this case + if ($value instanceof \SplObjectStorage) { + // However, the fast method does work in HHVM, and exposes the + // internal implementation. Hide it again. + if (property_exists('\SplObjectStorage', '__storage')) { + unset($array['__storage']); + } elseif (property_exists('\SplObjectStorage', 'storage')) { + unset($array['storage']); + } + + if (property_exists('\SplObjectStorage', '__key')) { + unset($array['__key']); + } + + foreach ($value as $key => $val) { + $array[spl_object_hash($val)] = array( + 'obj' => $val, + 'inf' => $value->getInfo(), + ); + } + } + + return $array; + } + + /** + * Recursive implementation of export + * + * @param mixed $value The value to export + * @param int $indentation The indentation level of the 2nd+ line + * @param \SebastianBergmann\RecursionContext\Context $processed Previously processed objects + * @return string + * @see SebastianBergmann\Exporter\Exporter::export + */ + protected static function recursiveExport(&$value, $indentation, $processed = null) + { + if ($value === null) { + return 'null'; + } + + if ($value === true) { + return 'true'; + } + + if ($value === false) { + return 'false'; + } + + if (is_float($value) && floatval(intval($value)) === $value) { + return "$value.0"; + } + + if (is_resource($value)) { + return sprintf( + 'resource(%d) of type (%s)', + $value, + get_resource_type($value) + ); + } + + if (is_string($value)) { + // Match for most non printable chars somewhat taking multibyte chars into account + if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) { + return 'Binary String: 0x' . bin2hex($value); + } + + return "'" . + str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) . + "'"; + } + + $whitespace = str_repeat(' ', 4 * $indentation); + + if (!$processed) { + $processed = new Context; + } + + if (is_array($value)) { + if (($key = $processed->contains($value)) !== false) { + return 'Array &' . $key; + } + + $key = $processed->add($value); + $values = ''; + + if (count($value) > 0) { + foreach ($value as $k => $v) { + $values .= sprintf( + '%s %s => %s' . "\n", + $whitespace, + self::recursiveExport($k, $indentation), + self::recursiveExport($value[$k], $indentation + 1, $processed) + ); + } + + $values = "\n" . $values . $whitespace; + } + + return sprintf('Array &%s (%s)', $key, $values); + } + + if (is_object($value)) { + $class = get_class($value); + + if ($value instanceof ProphecyInterface) { + return sprintf('%s Object (*Prophecy*)', $class); + } elseif ($hash = $processed->contains($value)) { + return sprintf('%s:%s Object', $class, $hash); + } + + $hash = $processed->add($value); + $values = ''; + $array = self::toArray($value); + + if (count($array) > 0) { + foreach ($array as $k => $v) { + $values .= sprintf( + '%s %s => %s' . "\n", + $whitespace, + self::recursiveExport($k, $indentation), + self::recursiveExport($v, $indentation + 1, $processed) + ); + } + + $values = "\n" . $values . $whitespace; + } + + return sprintf('%s:%s Object (%s)', $class, $hash, $values); + } + + return var_export($value, true); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php b/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php new file mode 100644 index 0000000..bb90156 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php @@ -0,0 +1,89 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\Util; + +use Prophecy\Call\Call; + +/** + * String utility. + * + * @author Konstantin Kudryashov + */ +class StringUtil +{ + /** + * Stringifies any provided value. + * + * @param mixed $value + * @param boolean $exportObject + * + * @return string + */ + public function stringify($value, $exportObject = true) + { + if (is_array($value)) { + if (range(0, count($value) - 1) === array_keys($value)) { + return '['.implode(', ', array_map(array($this, __FUNCTION__), $value)).']'; + } + + $stringify = array($this, __FUNCTION__); + + return '['.implode(', ', array_map(function ($item, $key) use ($stringify) { + return (is_integer($key) ? $key : '"'.$key.'"'). + ' => '.call_user_func($stringify, $item); + }, $value, array_keys($value))).']'; + } + if (is_resource($value)) { + return get_resource_type($value).':'.$value; + } + if (is_object($value)) { + return $exportObject ? ExportUtil::export($value) : sprintf('%s:%s', get_class($value), spl_object_hash($value)); + } + if (true === $value || false === $value) { + return $value ? 'true' : 'false'; + } + if (is_string($value)) { + $str = sprintf('"%s"', str_replace("\n", '\\n', $value)); + + if (50 <= strlen($str)) { + return substr($str, 0, 50).'"...'; + } + + return $str; + } + if (null === $value) { + return 'null'; + } + + return (string) $value; + } + + /** + * Stringifies provided array of calls. + * + * @param Call[] $calls Array of Call instances + * + * @return string + */ + public function stringifyCalls(array $calls) + { + $self = $this; + + return implode(PHP_EOL, array_map(function (Call $call) use ($self) { + return sprintf(' - %s(%s) @ %s', + $call->getMethodName(), + implode(', ', array_map(array($self, 'stringify'), $call->getArguments())), + str_replace(GETCWD().DIRECTORY_SEPARATOR, '', $call->getCallPlace()) + ); + }, $calls)); + } +} diff --git a/vendor/phpunit/php-code-coverage/.gitattributes b/vendor/phpunit/php-code-coverage/.gitattributes new file mode 100644 index 0000000..461090b --- /dev/null +++ b/vendor/phpunit/php-code-coverage/.gitattributes @@ -0,0 +1 @@ +*.php diff=php diff --git a/vendor/phpunit/php-code-coverage/.gitignore b/vendor/phpunit/php-code-coverage/.gitignore new file mode 100644 index 0000000..b386531 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/.gitignore @@ -0,0 +1,11 @@ +build/api +build/code-browser +build/coverage +build/logs +build/pdepend +cache.properties +phpunit.xml +/vendor +/composer.lock +/composer.phar +/.idea diff --git a/vendor/phpunit/php-code-coverage/.travis.yml b/vendor/phpunit/php-code-coverage/.travis.yml new file mode 100644 index 0000000..ad88a08 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/.travis.yml @@ -0,0 +1,20 @@ +language: php + +php: + - 5.3.3 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + +before_script: + - COMPOSER_ROOT_VERSION=dev-master composer install --prefer-source + +script: vendor/bin/phpunit --configuration ./build/travis-ci.xml + +notifications: + email: false + irc: + channels: + - "irc.freenode.org#phpunit" + use_notice: true diff --git a/vendor/phpunit/php-code-coverage/CONTRIBUTING.md b/vendor/phpunit/php-code-coverage/CONTRIBUTING.md new file mode 100644 index 0000000..40dbc25 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/CONTRIBUTING.md @@ -0,0 +1,5 @@ +Pull Requests for bug fixes should be made against the current release branch (2.0). + +Pull Requests for new features should be made against master. + +For further notes please refer to [https://github.com/sebastianbergmann/phpunit/blob/master/CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/master/CONTRIBUTING.md) diff --git a/vendor/phpunit/php-code-coverage/ChangeLog-2.2.md b/vendor/phpunit/php-code-coverage/ChangeLog-2.2.md new file mode 100644 index 0000000..353b6f6 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/ChangeLog-2.2.md @@ -0,0 +1,56 @@ +# Changes in PHP_CodeCoverage 2.2 + +All notable changes of the PHP_CodeCoverage 2.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [2.2.4] - 2015-10-06 + +### Fixed + +* Fixed [#391](https://github.com/sebastianbergmann/php-code-coverage/pull/391): Missing `` tag + +## [2.2.3] - 2015-09-14 + +### Fixed + +* Fixed [#368](https://github.com/sebastianbergmann/php-code-coverage/pull/368): Blacklists and whitelists are not merged when merging data sets +* Fixed [#370](https://github.com/sebastianbergmann/php-code-coverage/issues/370): Confusing statistics for source file that declares a class without methods +* Fixed [#372](https://github.com/sebastianbergmann/php-code-coverage/pull/372): Nested classes and functions are not handled correctly +* Fixed [#382](https://github.com/sebastianbergmann/php-code-coverage/issues/382): Crap4J report generates incorrect XML logfile + +## [2.2.2] - 2015-08-04 + +### Added + +* Reintroduced the `PHP_CodeCoverage_Driver_HHVM` driver as an extension of `PHP_CodeCoverage_Driver_Xdebug` that does not use `xdebug_start_code_coverage()` with options not supported by HHVM + +### Changed + +* Bumped required version of `sebastian/environment` to 1.3.2 for [#365](https://github.com/sebastianbergmann/php-code-coverage/issues/365) + +## [2.2.1] - 2015-08-02 + +### Changed + +* Bumped required version of `sebastian/environment` to 1.3.1 for [#365](https://github.com/sebastianbergmann/php-code-coverage/issues/365) + +## [2.2.0] - 2015-08-01 + +### Added + +* Added a driver for PHPDBG (requires PHP 7) +* Added `PHP_CodeCoverage::setDisableIgnoredLines()` to disable the ignoring of lines using annotations such as `@codeCoverageIgnore` + +### Changed + +* Annotating a method with `@deprecated` now has the same effect as annotating it with `@codeCoverageIgnore` + +### Removed + +* The dedicated driver for HHVM, `PHP_CodeCoverage_Driver_HHVM` has been removed + +[2.2.4]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.3...2.2.4 +[2.2.3]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.2...2.2.3 +[2.2.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.1...2.2.2 +[2.2.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.0...2.2.1 +[2.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.1...2.2.0 + diff --git a/vendor/phpunit/php-code-coverage/LICENSE b/vendor/phpunit/php-code-coverage/LICENSE new file mode 100644 index 0000000..fcfa37e --- /dev/null +++ b/vendor/phpunit/php-code-coverage/LICENSE @@ -0,0 +1,33 @@ +PHP_CodeCoverage + +Copyright (c) 2009-2015, Sebastian Bergmann . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of Sebastian Bergmann nor the names of his + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-code-coverage/README.md b/vendor/phpunit/php-code-coverage/README.md new file mode 100644 index 0000000..4411d7f --- /dev/null +++ b/vendor/phpunit/php-code-coverage/README.md @@ -0,0 +1,50 @@ +[![Latest Stable Version](https://poser.pugx.org/phpunit/php-code-coverage/v/stable.png)](https://packagist.org/packages/phpunit/php-code-coverage) +[![Build Status](https://travis-ci.org/sebastianbergmann/php-code-coverage.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-code-coverage) + +# PHP_CodeCoverage + +**PHP_CodeCoverage** is a library that provides collection, processing, and rendering functionality for PHP code coverage information. + +## Requirements + +PHP 5.3.3 is required but using the latest version of PHP is highly recommended + +### PHP 5 + +[Xdebug](http://xdebug.org/) is the only source of raw code coverage data supported for PHP 5. Version 2.1.3 of Xdebug is required but using the latest version is highly recommended. + +### PHP 7 + +[phpdbg](http://phpdbg.com/docs) is currently the only source of raw code coverage data supported for PHP 7. Once Xdebug has been updated for PHP 7 it, too, will be supported. + +### HHVM + +A version of HHVM that implements the Xdebug API for code coverage (`xdebug_*_code_coverage()`) is required. + +## Installation + +To add PHP_CodeCoverage as a local, per-project dependency to your project, simply add a dependency on `phpunit/php-code-coverage` to your project's `composer.json` file. Here is a minimal example of a `composer.json` file that just defines a dependency on PHP_CodeCoverage 2.0: + + { + "require": { + "phpunit/php-code-coverage": "^2" + } + } + +## Using the PHP_CodeCoverage API + +```php +start(''); + +// ... + +$coverage->stop(); + +$writer = new PHP_CodeCoverage_Report_Clover; +$writer->process($coverage, '/tmp/clover.xml'); + +$writer = new PHP_CodeCoverage_Report_HTML; +$writer->process($coverage, '/tmp/code-coverage-report'); +``` diff --git a/vendor/phpunit/php-code-coverage/build.xml b/vendor/phpunit/php-code-coverage/build.xml new file mode 100644 index 0000000..c335d15 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/build.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/phpunit/php-code-coverage/build/travis-ci.xml b/vendor/phpunit/php-code-coverage/build/travis-ci.xml new file mode 100644 index 0000000..15e879f --- /dev/null +++ b/vendor/phpunit/php-code-coverage/build/travis-ci.xml @@ -0,0 +1,21 @@ + + + + + + ../tests/PHP + + + + + + + + + + ../src + + + diff --git a/vendor/phpunit/php-code-coverage/composer.json b/vendor/phpunit/php-code-coverage/composer.json new file mode 100644 index 0000000..55f9fd0 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/composer.json @@ -0,0 +1,50 @@ +{ + "name": "phpunit/php-code-coverage", + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "type": "library", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "irc": "irc://irc.freenode.net/phpunit" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-token-stream": "~1.3", + "phpunit/php-text-template": "~1.2", + "sebastian/environment": "^1.3.2", + "sebastian/version": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4", + "ext-xdebug": ">=2.1.4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + } +} diff --git a/vendor/phpunit/php-code-coverage/phpunit.xml.dist b/vendor/phpunit/php-code-coverage/phpunit.xml.dist new file mode 100644 index 0000000..f5fa606 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/phpunit.xml.dist @@ -0,0 +1,23 @@ + + + + + tests/PHP + + + + + + + + + + + + src + + + + diff --git a/vendor/phpunit/php-code-coverage/scripts/auto_append.php b/vendor/phpunit/php-code-coverage/scripts/auto_append.php new file mode 100644 index 0000000..6cd768d --- /dev/null +++ b/vendor/phpunit/php-code-coverage/scripts/auto_append.php @@ -0,0 +1,5 @@ +stop(); + +$writer = new PHP_CodeCoverage_Report_HTML; +$writer->process($coverage, '/tmp/coverage'); diff --git a/vendor/phpunit/php-code-coverage/scripts/auto_prepend.php b/vendor/phpunit/php-code-coverage/scripts/auto_prepend.php new file mode 100644 index 0000000..7a8887a --- /dev/null +++ b/vendor/phpunit/php-code-coverage/scripts/auto_prepend.php @@ -0,0 +1,10 @@ +filter(); + +$filter->addFileToBlacklist(__FILE__); +$filter->addFileToBlacklist(dirname(__FILE__) . '/auto_append.php'); + +$coverage->start($_SERVER['SCRIPT_FILENAME']); diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage.php new file mode 100644 index 0000000..88326f0 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage.php @@ -0,0 +1,920 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use SebastianBergmann\Environment\Runtime; + +/** + * Provides collection functionality for PHP code coverage information. + * + * @since Class available since Release 1.0.0 + */ +class PHP_CodeCoverage +{ + /** + * @var PHP_CodeCoverage_Driver + */ + private $driver; + + /** + * @var PHP_CodeCoverage_Filter + */ + private $filter; + + /** + * @var bool + */ + private $cacheTokens = false; + + /** + * @var bool + */ + private $checkForUnintentionallyCoveredCode = false; + + /** + * @var bool + */ + private $forceCoversAnnotation = false; + + /** + * @var bool + */ + private $mapTestClassNameToCoveredClassName = false; + + /** + * @var bool + */ + private $addUncoveredFilesFromWhitelist = true; + + /** + * @var bool + */ + private $processUncoveredFilesFromWhitelist = false; + + /** + * @var mixed + */ + private $currentId; + + /** + * Code coverage data. + * + * @var array + */ + private $data = array(); + + /** + * @var array + */ + private $ignoredLines = array(); + + /** + * @var bool + */ + private $disableIgnoredLines = false; + + /** + * Test data. + * + * @var array + */ + private $tests = array(); + + /** + * Constructor. + * + * @param PHP_CodeCoverage_Driver $driver + * @param PHP_CodeCoverage_Filter $filter + * @throws PHP_CodeCoverage_Exception + */ + public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCoverage_Filter $filter = null) + { + if ($driver === null) { + $driver = $this->selectDriver(); + } + + if ($filter === null) { + $filter = new PHP_CodeCoverage_Filter; + } + + $this->driver = $driver; + $this->filter = $filter; + } + + /** + * Returns the PHP_CodeCoverage_Report_Node_* object graph + * for this PHP_CodeCoverage object. + * + * @return PHP_CodeCoverage_Report_Node_Directory + * @since Method available since Release 1.1.0 + */ + public function getReport() + { + $factory = new PHP_CodeCoverage_Report_Factory; + + return $factory->create($this); + } + + /** + * Clears collected code coverage data. + */ + public function clear() + { + $this->currentId = null; + $this->data = array(); + $this->tests = array(); + } + + /** + * Returns the PHP_CodeCoverage_Filter used. + * + * @return PHP_CodeCoverage_Filter + */ + public function filter() + { + return $this->filter; + } + + /** + * Returns the collected code coverage data. + * Set $raw = true to bypass all filters. + * + * @param bool $raw + * @return array + * @since Method available since Release 1.1.0 + */ + public function getData($raw = false) + { + if (!$raw && $this->addUncoveredFilesFromWhitelist) { + $this->addUncoveredFilesFromWhitelist(); + } + + // We need to apply the blacklist filter a second time + // when no whitelist is used. + if (!$raw && !$this->filter->hasWhitelist()) { + $this->applyListsFilter($this->data); + } + + return $this->data; + } + + /** + * Sets the coverage data. + * + * @param array $data + * @since Method available since Release 2.0.0 + */ + public function setData(array $data) + { + $this->data = $data; + } + + /** + * Returns the test data. + * + * @return array + * @since Method available since Release 1.1.0 + */ + public function getTests() + { + return $this->tests; + } + + /** + * Sets the test data. + * + * @param array $tests + * @since Method available since Release 2.0.0 + */ + public function setTests(array $tests) + { + $this->tests = $tests; + } + + /** + * Start collection of code coverage information. + * + * @param mixed $id + * @param bool $clear + * @throws PHP_CodeCoverage_Exception + */ + public function start($id, $clear = false) + { + if (!is_bool($clear)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'boolean' + ); + } + + if ($clear) { + $this->clear(); + } + + $this->currentId = $id; + + $this->driver->start(); + } + + /** + * Stop collection of code coverage information. + * + * @param bool $append + * @param mixed $linesToBeCovered + * @param array $linesToBeUsed + * @return array + * @throws PHP_CodeCoverage_Exception + */ + public function stop($append = true, $linesToBeCovered = array(), array $linesToBeUsed = array()) + { + if (!is_bool($append)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'boolean' + ); + } + + if (!is_array($linesToBeCovered) && $linesToBeCovered !== false) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 2, + 'array or false' + ); + } + + $data = $this->driver->stop(); + $this->append($data, null, $append, $linesToBeCovered, $linesToBeUsed); + + $this->currentId = null; + + return $data; + } + + /** + * Appends code coverage data. + * + * @param array $data + * @param mixed $id + * @param bool $append + * @param mixed $linesToBeCovered + * @param array $linesToBeUsed + * @throws PHP_CodeCoverage_Exception + */ + public function append(array $data, $id = null, $append = true, $linesToBeCovered = array(), array $linesToBeUsed = array()) + { + if ($id === null) { + $id = $this->currentId; + } + + if ($id === null) { + throw new PHP_CodeCoverage_Exception; + } + + $this->applyListsFilter($data); + $this->applyIgnoredLinesFilter($data); + $this->initializeFilesThatAreSeenTheFirstTime($data); + + if (!$append) { + return; + } + + if ($id != 'UNCOVERED_FILES_FROM_WHITELIST') { + $this->applyCoversAnnotationFilter( + $data, + $linesToBeCovered, + $linesToBeUsed + ); + } + + if (empty($data)) { + return; + } + + $size = 'unknown'; + $status = null; + + if ($id instanceof PHPUnit_Framework_TestCase) { + $_size = $id->getSize(); + + if ($_size == PHPUnit_Util_Test::SMALL) { + $size = 'small'; + } elseif ($_size == PHPUnit_Util_Test::MEDIUM) { + $size = 'medium'; + } elseif ($_size == PHPUnit_Util_Test::LARGE) { + $size = 'large'; + } + + $status = $id->getStatus(); + $id = get_class($id) . '::' . $id->getName(); + } elseif ($id instanceof PHPUnit_Extensions_PhptTestCase) { + $size = 'large'; + $id = $id->getName(); + } + + $this->tests[$id] = array('size' => $size, 'status' => $status); + + foreach ($data as $file => $lines) { + if (!$this->filter->isFile($file)) { + continue; + } + + foreach ($lines as $k => $v) { + if ($v == PHP_CodeCoverage_Driver::LINE_EXECUTED) { + if (empty($this->data[$file][$k]) || !in_array($id, $this->data[$file][$k])) { + $this->data[$file][$k][] = $id; + } + } + } + } + } + + /** + * Merges the data from another instance of PHP_CodeCoverage. + * + * @param PHP_CodeCoverage $that + */ + public function merge(PHP_CodeCoverage $that) + { + $this->filter->setBlacklistedFiles( + array_merge($this->filter->getBlacklistedFiles(), $that->filter()->getBlacklistedFiles()) + ); + + $this->filter->setWhitelistedFiles( + array_merge($this->filter->getWhitelistedFiles(), $that->filter()->getWhitelistedFiles()) + ); + + foreach ($that->data as $file => $lines) { + if (!isset($this->data[$file])) { + if (!$this->filter->isFiltered($file)) { + $this->data[$file] = $lines; + } + + continue; + } + + foreach ($lines as $line => $data) { + if ($data !== null) { + if (!isset($this->data[$file][$line])) { + $this->data[$file][$line] = $data; + } else { + $this->data[$file][$line] = array_unique( + array_merge($this->data[$file][$line], $data) + ); + } + } + } + } + + $this->tests = array_merge($this->tests, $that->getTests()); + + } + + /** + * @param bool $flag + * @throws PHP_CodeCoverage_Exception + * @since Method available since Release 1.1.0 + */ + public function setCacheTokens($flag) + { + if (!is_bool($flag)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'boolean' + ); + } + + $this->cacheTokens = $flag; + } + + /** + * @since Method available since Release 1.1.0 + */ + public function getCacheTokens() + { + return $this->cacheTokens; + } + + /** + * @param bool $flag + * @throws PHP_CodeCoverage_Exception + * @since Method available since Release 2.0.0 + */ + public function setCheckForUnintentionallyCoveredCode($flag) + { + if (!is_bool($flag)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'boolean' + ); + } + + $this->checkForUnintentionallyCoveredCode = $flag; + } + + /** + * @param bool $flag + * @throws PHP_CodeCoverage_Exception + */ + public function setForceCoversAnnotation($flag) + { + if (!is_bool($flag)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'boolean' + ); + } + + $this->forceCoversAnnotation = $flag; + } + + /** + * @param bool $flag + * @throws PHP_CodeCoverage_Exception + */ + public function setMapTestClassNameToCoveredClassName($flag) + { + if (!is_bool($flag)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'boolean' + ); + } + + $this->mapTestClassNameToCoveredClassName = $flag; + } + + /** + * @param bool $flag + * @throws PHP_CodeCoverage_Exception + */ + public function setAddUncoveredFilesFromWhitelist($flag) + { + if (!is_bool($flag)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'boolean' + ); + } + + $this->addUncoveredFilesFromWhitelist = $flag; + } + + /** + * @param bool $flag + * @throws PHP_CodeCoverage_Exception + */ + public function setProcessUncoveredFilesFromWhitelist($flag) + { + if (!is_bool($flag)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'boolean' + ); + } + + $this->processUncoveredFilesFromWhitelist = $flag; + } + + /** + * @param bool $flag + * @throws PHP_CodeCoverage_Exception + */ + public function setDisableIgnoredLines($flag) + { + if (!is_bool($flag)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'boolean' + ); + } + + $this->disableIgnoredLines = $flag; + } + + /** + * Applies the @covers annotation filtering. + * + * @param array $data + * @param mixed $linesToBeCovered + * @param array $linesToBeUsed + * @throws PHP_CodeCoverage_Exception_UnintentionallyCoveredCode + */ + private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, array $linesToBeUsed) + { + if ($linesToBeCovered === false || + ($this->forceCoversAnnotation && empty($linesToBeCovered))) { + $data = array(); + + return; + } + + if (empty($linesToBeCovered)) { + return; + } + + if ($this->checkForUnintentionallyCoveredCode) { + $this->performUnintentionallyCoveredCodeCheck( + $data, + $linesToBeCovered, + $linesToBeUsed + ); + } + + $data = array_intersect_key($data, $linesToBeCovered); + + foreach (array_keys($data) as $filename) { + $_linesToBeCovered = array_flip($linesToBeCovered[$filename]); + + $data[$filename] = array_intersect_key( + $data[$filename], + $_linesToBeCovered + ); + } + } + + /** + * Applies the blacklist/whitelist filtering. + * + * @param array $data + */ + private function applyListsFilter(array &$data) + { + foreach (array_keys($data) as $filename) { + if ($this->filter->isFiltered($filename)) { + unset($data[$filename]); + } + } + } + + /** + * Applies the "ignored lines" filtering. + * + * @param array $data + */ + private function applyIgnoredLinesFilter(array &$data) + { + foreach (array_keys($data) as $filename) { + if (!$this->filter->isFile($filename)) { + continue; + } + + foreach ($this->getLinesToBeIgnored($filename) as $line) { + unset($data[$filename][$line]); + } + } + } + + /** + * @param array $data + * @since Method available since Release 1.1.0 + */ + private function initializeFilesThatAreSeenTheFirstTime(array $data) + { + foreach ($data as $file => $lines) { + if ($this->filter->isFile($file) && !isset($this->data[$file])) { + $this->data[$file] = array(); + + foreach ($lines as $k => $v) { + $this->data[$file][$k] = $v == -2 ? null : array(); + } + } + } + } + + /** + * Processes whitelisted files that are not covered. + */ + private function addUncoveredFilesFromWhitelist() + { + $data = array(); + $uncoveredFiles = array_diff( + $this->filter->getWhitelist(), + array_keys($this->data) + ); + + foreach ($uncoveredFiles as $uncoveredFile) { + if (!file_exists($uncoveredFile)) { + continue; + } + + if ($this->processUncoveredFilesFromWhitelist) { + $this->processUncoveredFileFromWhitelist( + $uncoveredFile, + $data, + $uncoveredFiles + ); + } else { + $data[$uncoveredFile] = array(); + + $lines = count(file($uncoveredFile)); + + for ($i = 1; $i <= $lines; $i++) { + $data[$uncoveredFile][$i] = PHP_CodeCoverage_Driver::LINE_NOT_EXECUTED; + } + } + } + + $this->append($data, 'UNCOVERED_FILES_FROM_WHITELIST'); + } + + /** + * @param string $uncoveredFile + * @param array $data + * @param array $uncoveredFiles + */ + private function processUncoveredFileFromWhitelist($uncoveredFile, array &$data, array $uncoveredFiles) + { + $this->driver->start(); + include_once $uncoveredFile; + $coverage = $this->driver->stop(); + + foreach ($coverage as $file => $fileCoverage) { + if (!isset($data[$file]) && + in_array($file, $uncoveredFiles)) { + foreach (array_keys($fileCoverage) as $key) { + if ($fileCoverage[$key] == PHP_CodeCoverage_Driver::LINE_EXECUTED) { + $fileCoverage[$key] = PHP_CodeCoverage_Driver::LINE_NOT_EXECUTED; + } + } + + $data[$file] = $fileCoverage; + } + } + } + + /** + * Returns the lines of a source file that should be ignored. + * + * @param string $filename + * @return array + * @throws PHP_CodeCoverage_Exception + * @since Method available since Release 2.0.0 + */ + private function getLinesToBeIgnored($filename) + { + if (!is_string($filename)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'string' + ); + } + + if (!isset($this->ignoredLines[$filename])) { + $this->ignoredLines[$filename] = array(); + + if ($this->disableIgnoredLines) { + return $this->ignoredLines[$filename]; + } + + $ignore = false; + $stop = false; + $lines = file($filename); + $numLines = count($lines); + + foreach ($lines as $index => $line) { + if (!trim($line)) { + $this->ignoredLines[$filename][] = $index + 1; + } + } + + if ($this->cacheTokens) { + $tokens = PHP_Token_Stream_CachingFactory::get($filename); + } else { + $tokens = new PHP_Token_Stream($filename); + } + + $classes = array_merge($tokens->getClasses(), $tokens->getTraits()); + $tokens = $tokens->tokens(); + + foreach ($tokens as $token) { + switch (get_class($token)) { + case 'PHP_Token_COMMENT': + case 'PHP_Token_DOC_COMMENT': + $_token = trim($token); + $_line = trim($lines[$token->getLine() - 1]); + + if ($_token == '// @codeCoverageIgnore' || + $_token == '//@codeCoverageIgnore') { + $ignore = true; + $stop = true; + } elseif ($_token == '// @codeCoverageIgnoreStart' || + $_token == '//@codeCoverageIgnoreStart') { + $ignore = true; + } elseif ($_token == '// @codeCoverageIgnoreEnd' || + $_token == '//@codeCoverageIgnoreEnd') { + $stop = true; + } + + if (!$ignore) { + $start = $token->getLine(); + $end = $start + substr_count($token, "\n"); + + // Do not ignore the first line when there is a token + // before the comment + if (0 !== strpos($_token, $_line)) { + $start++; + } + + for ($i = $start; $i < $end; $i++) { + $this->ignoredLines[$filename][] = $i; + } + + // A DOC_COMMENT token or a COMMENT token starting with "/*" + // does not contain the final \n character in its text + if (isset($lines[$i-1]) && 0 === strpos($_token, '/*') && '*/' === substr(trim($lines[$i-1]), -2)) { + $this->ignoredLines[$filename][] = $i; + } + } + break; + + case 'PHP_Token_INTERFACE': + case 'PHP_Token_TRAIT': + case 'PHP_Token_CLASS': + case 'PHP_Token_FUNCTION': + $docblock = $token->getDocblock(); + + $this->ignoredLines[$filename][] = $token->getLine(); + + if (strpos($docblock, '@codeCoverageIgnore') || strpos($docblock, '@deprecated')) { + $endLine = $token->getEndLine(); + + for ($i = $token->getLine(); $i <= $endLine; $i++) { + $this->ignoredLines[$filename][] = $i; + } + } elseif ($token instanceof PHP_Token_INTERFACE || + $token instanceof PHP_Token_TRAIT || + $token instanceof PHP_Token_CLASS) { + if (empty($classes[$token->getName()]['methods'])) { + for ($i = $token->getLine(); + $i <= $token->getEndLine(); + $i++) { + $this->ignoredLines[$filename][] = $i; + } + } else { + $firstMethod = array_shift( + $classes[$token->getName()]['methods'] + ); + + do { + $lastMethod = array_pop( + $classes[$token->getName()]['methods'] + ); + } while ($lastMethod !== null && + substr($lastMethod['signature'], 0, 18) == 'anonymous function'); + + if ($lastMethod === null) { + $lastMethod = $firstMethod; + } + + for ($i = $token->getLine(); + $i < $firstMethod['startLine']; + $i++) { + $this->ignoredLines[$filename][] = $i; + } + + for ($i = $token->getEndLine(); + $i > $lastMethod['endLine']; + $i--) { + $this->ignoredLines[$filename][] = $i; + } + } + } + break; + + case 'PHP_Token_NAMESPACE': + $this->ignoredLines[$filename][] = $token->getEndLine(); + + // Intentional fallthrough + case 'PHP_Token_OPEN_TAG': + case 'PHP_Token_CLOSE_TAG': + case 'PHP_Token_USE': + $this->ignoredLines[$filename][] = $token->getLine(); + break; + } + + if ($ignore) { + $this->ignoredLines[$filename][] = $token->getLine(); + + if ($stop) { + $ignore = false; + $stop = false; + } + } + } + + $this->ignoredLines[$filename][] = $numLines + 1; + + $this->ignoredLines[$filename] = array_unique( + $this->ignoredLines[$filename] + ); + + sort($this->ignoredLines[$filename]); + } + + return $this->ignoredLines[$filename]; + } + + /** + * @param array $data + * @param array $linesToBeCovered + * @param array $linesToBeUsed + * @throws PHP_CodeCoverage_Exception_UnintentionallyCoveredCode + * @since Method available since Release 2.0.0 + */ + private function performUnintentionallyCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed) + { + $allowedLines = $this->getAllowedLines( + $linesToBeCovered, + $linesToBeUsed + ); + + $message = ''; + + foreach ($data as $file => $_data) { + foreach ($_data as $line => $flag) { + if ($flag == 1 && + (!isset($allowedLines[$file]) || + !isset($allowedLines[$file][$line]))) { + $message .= sprintf( + '- %s:%d' . PHP_EOL, + $file, + $line + ); + } + } + } + + if (!empty($message)) { + throw new PHP_CodeCoverage_Exception_UnintentionallyCoveredCode( + $message + ); + } + } + + /** + * @param array $linesToBeCovered + * @param array $linesToBeUsed + * @return array + * @since Method available since Release 2.0.0 + */ + private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) + { + $allowedLines = array(); + + foreach (array_keys($linesToBeCovered) as $file) { + if (!isset($allowedLines[$file])) { + $allowedLines[$file] = array(); + } + + $allowedLines[$file] = array_merge( + $allowedLines[$file], + $linesToBeCovered[$file] + ); + } + + foreach (array_keys($linesToBeUsed) as $file) { + if (!isset($allowedLines[$file])) { + $allowedLines[$file] = array(); + } + + $allowedLines[$file] = array_merge( + $allowedLines[$file], + $linesToBeUsed[$file] + ); + } + + foreach (array_keys($allowedLines) as $file) { + $allowedLines[$file] = array_flip( + array_unique($allowedLines[$file]) + ); + } + + return $allowedLines; + } + + /** + * @return PHP_CodeCoverage_Driver + * @throws PHP_CodeCoverage_Exception + */ + private function selectDriver() + { + $runtime = new Runtime; + + if (!$runtime->canCollectCodeCoverage()) { + throw new PHP_CodeCoverage_Exception('No code coverage driver available'); + } + + if ($runtime->isHHVM()) { + return new PHP_CodeCoverage_Driver_HHVM; + } elseif ($runtime->isPHPDBG()) { + return new PHP_CodeCoverage_Driver_PHPDBG; + } else { + return new PHP_CodeCoverage_Driver_Xdebug; + } + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver.php new file mode 100644 index 0000000..8635ace --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Interface for code coverage drivers. + * + * @since Class available since Release 1.0.0 + */ +interface PHP_CodeCoverage_Driver +{ + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ + const LINE_EXECUTED = 1; + + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ + const LINE_NOT_EXECUTED = -1; + + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ + const LINE_NOT_EXECUTABLE = -2; + + /** + * Start collection of code coverage information. + */ + public function start(); + + /** + * Stop collection of code coverage information. + * + * @return array + */ + public function stop(); +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/HHVM.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/HHVM.php new file mode 100644 index 0000000..a9d8f0c --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/HHVM.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Driver for HHVM's code coverage functionality. + * + * @since Class available since Release 2.2.2 + * @codeCoverageIgnore + */ +class PHP_CodeCoverage_Driver_HHVM extends PHP_CodeCoverage_Driver_Xdebug +{ + /** + * Start collection of code coverage information. + */ + public function start() + { + xdebug_start_code_coverage(); + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php new file mode 100644 index 0000000..f3eb621 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php @@ -0,0 +1,105 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Driver for PHPDBG's code coverage functionality. + * + * @since Class available since Release 2.2.0 + * @codeCoverageIgnore + */ +class PHP_CodeCoverage_Driver_PHPDBG implements PHP_CodeCoverage_Driver +{ + /** + * Constructor. + */ + public function __construct() + { + if (PHP_SAPI !== 'phpdbg') { + throw new PHP_CodeCoverage_Exception( + 'This driver requires the PHPDBG SAPI' + ); + } + + if (!function_exists('phpdbg_start_oplog')) { + throw new PHP_CodeCoverage_Exception( + 'This build of PHPDBG does not support code coverage' + ); + } + } + + /** + * Start collection of code coverage information. + */ + public function start() + { + phpdbg_start_oplog(); + } + + /** + * Stop collection of code coverage information. + * + * @return array + */ + public function stop() + { + static $fetchedLines = array(); + + $dbgData = phpdbg_end_oplog(); + + if ($fetchedLines == array()) { + $sourceLines = phpdbg_get_executable(); + } else { + $newFiles = array_diff( + get_included_files(), + array_keys($fetchedLines) + ); + + if ($newFiles) { + $sourceLines = phpdbg_get_executable( + array('files' => $newFiles) + ); + } else { + $sourceLines = array(); + } + } + + foreach ($sourceLines as $file => $lines) { + foreach ($lines as $lineNo => $numExecuted) { + $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED; + } + } + + $fetchedLines = array_merge($fetchedLines, $sourceLines); + + return $this->detectExecutedLines($fetchedLines, $dbgData); + } + + /** + * Convert phpdbg based data into the format CodeCoverage expects + * + * @param array $sourceLines + * @param array $dbgData + * @return array + */ + private function detectExecutedLines(array $sourceLines, array $dbgData) + { + foreach ($dbgData as $file => $coveredLines) { + foreach ($coveredLines as $lineNo => $numExecuted) { + // phpdbg also reports $lineNo=0 when e.g. exceptions get thrown. + // make sure we only mark lines executed which are actually executable. + if (isset($sourceLines[$file][$lineNo])) { + $sourceLines[$file][$lineNo] = self::LINE_EXECUTED; + } + } + } + + return $sourceLines; + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/Xdebug.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/Xdebug.php new file mode 100644 index 0000000..0cd7b9a --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/Xdebug.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Driver for Xdebug's code coverage functionality. + * + * @since Class available since Release 1.0.0 + * @codeCoverageIgnore + */ +class PHP_CodeCoverage_Driver_Xdebug implements PHP_CodeCoverage_Driver +{ + /** + * Constructor. + */ + public function __construct() + { + if (!extension_loaded('xdebug')) { + throw new PHP_CodeCoverage_Exception('This driver requires Xdebug'); + } + + if (version_compare(phpversion('xdebug'), '2.2.0-dev', '>=') && + !ini_get('xdebug.coverage_enable')) { + throw new PHP_CodeCoverage_Exception( + 'xdebug.coverage_enable=On has to be set in php.ini' + ); + } + } + + /** + * Start collection of code coverage information. + */ + public function start() + { + xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); + } + + /** + * Stop collection of code coverage information. + * + * @return array + */ + public function stop() + { + $data = xdebug_get_code_coverage(); + xdebug_stop_code_coverage(); + + return $this->cleanup($data); + } + + /** + * @param array $data + * @return array + * @since Method available since Release 2.0.0 + */ + private function cleanup(array $data) + { + foreach (array_keys($data) as $file) { + unset($data[$file][0]); + + if ($file != 'xdebug://debug-eval' && file_exists($file)) { + $numLines = $this->getNumberOfLinesInFile($file); + + foreach (array_keys($data[$file]) as $line) { + if (isset($data[$file][$line]) && $line > $numLines) { + unset($data[$file][$line]); + } + } + } + } + + return $data; + } + + /** + * @param string $file + * @return int + * @since Method available since Release 2.0.0 + */ + private function getNumberOfLinesInFile($file) + { + $buffer = file_get_contents($file); + $lines = substr_count($buffer, "\n"); + + if (substr($buffer, -1) !== "\n") { + $lines++; + } + + return $lines; + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Exception.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Exception.php new file mode 100644 index 0000000..bded3c0 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Exception.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Exception class for PHP_CodeCoverage component. + * + * @since Class available since Release 1.1.0 + */ +class PHP_CodeCoverage_Exception extends RuntimeException +{ +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php new file mode 100644 index 0000000..463785e --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Exception that is raised when code is unintentionally covered. + * + * @since Class available since Release 2.0.0 + */ +class PHP_CodeCoverage_Exception_UnintentionallyCoveredCode extends PHP_CodeCoverage_Exception +{ +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Filter.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Filter.php new file mode 100644 index 0000000..bb4a251 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Filter.php @@ -0,0 +1,293 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Filter for blacklisting and whitelisting of code coverage information. + * + * @since Class available since Release 1.0.0 + */ +class PHP_CodeCoverage_Filter +{ + /** + * Source files that are blacklisted. + * + * @var array + */ + private $blacklistedFiles = array(); + + /** + * Source files that are whitelisted. + * + * @var array + */ + private $whitelistedFiles = array(); + + /** + * Adds a directory to the blacklist (recursively). + * + * @param string $directory + * @param string $suffix + * @param string $prefix + */ + public function addDirectoryToBlacklist($directory, $suffix = '.php', $prefix = '') + { + $facade = new File_Iterator_Facade; + $files = $facade->getFilesAsArray($directory, $suffix, $prefix); + + foreach ($files as $file) { + $this->addFileToBlacklist($file); + } + } + + /** + * Adds a file to the blacklist. + * + * @param string $filename + */ + public function addFileToBlacklist($filename) + { + $this->blacklistedFiles[realpath($filename)] = true; + } + + /** + * Adds files to the blacklist. + * + * @param array $files + */ + public function addFilesToBlacklist(array $files) + { + foreach ($files as $file) { + $this->addFileToBlacklist($file); + } + } + + /** + * Removes a directory from the blacklist (recursively). + * + * @param string $directory + * @param string $suffix + * @param string $prefix + */ + public function removeDirectoryFromBlacklist($directory, $suffix = '.php', $prefix = '') + { + $facade = new File_Iterator_Facade; + $files = $facade->getFilesAsArray($directory, $suffix, $prefix); + + foreach ($files as $file) { + $this->removeFileFromBlacklist($file); + } + } + + /** + * Removes a file from the blacklist. + * + * @param string $filename + */ + public function removeFileFromBlacklist($filename) + { + $filename = realpath($filename); + + if (isset($this->blacklistedFiles[$filename])) { + unset($this->blacklistedFiles[$filename]); + } + } + + /** + * Adds a directory to the whitelist (recursively). + * + * @param string $directory + * @param string $suffix + * @param string $prefix + */ + public function addDirectoryToWhitelist($directory, $suffix = '.php', $prefix = '') + { + $facade = new File_Iterator_Facade; + $files = $facade->getFilesAsArray($directory, $suffix, $prefix); + + foreach ($files as $file) { + $this->addFileToWhitelist($file); + } + } + + /** + * Adds a file to the whitelist. + * + * @param string $filename + */ + public function addFileToWhitelist($filename) + { + $this->whitelistedFiles[realpath($filename)] = true; + } + + /** + * Adds files to the whitelist. + * + * @param array $files + */ + public function addFilesToWhitelist(array $files) + { + foreach ($files as $file) { + $this->addFileToWhitelist($file); + } + } + + /** + * Removes a directory from the whitelist (recursively). + * + * @param string $directory + * @param string $suffix + * @param string $prefix + */ + public function removeDirectoryFromWhitelist($directory, $suffix = '.php', $prefix = '') + { + $facade = new File_Iterator_Facade; + $files = $facade->getFilesAsArray($directory, $suffix, $prefix); + + foreach ($files as $file) { + $this->removeFileFromWhitelist($file); + } + } + + /** + * Removes a file from the whitelist. + * + * @param string $filename + */ + public function removeFileFromWhitelist($filename) + { + $filename = realpath($filename); + + if (isset($this->whitelistedFiles[$filename])) { + unset($this->whitelistedFiles[$filename]); + } + } + + /** + * Checks whether a filename is a real filename. + * + * @param string $filename + * @return bool + */ + public function isFile($filename) + { + if ($filename == '-' || + strpos($filename, 'vfs://') === 0 || + strpos($filename, 'xdebug://debug-eval') !== false || + strpos($filename, 'eval()\'d code') !== false || + strpos($filename, 'runtime-created function') !== false || + strpos($filename, 'runkit created function') !== false || + strpos($filename, 'assert code') !== false || + strpos($filename, 'regexp code') !== false) { + return false; + } + + return file_exists($filename); + } + + /** + * Checks whether or not a file is filtered. + * + * When the whitelist is empty (default), blacklisting is used. + * When the whitelist is not empty, whitelisting is used. + * + * @param string $filename + * @return bool + * @throws PHP_CodeCoverage_Exception + */ + public function isFiltered($filename) + { + if (!$this->isFile($filename)) { + return true; + } + + $filename = realpath($filename); + + if (!empty($this->whitelistedFiles)) { + return !isset($this->whitelistedFiles[$filename]); + } + + return isset($this->blacklistedFiles[$filename]); + } + + /** + * Returns the list of blacklisted files. + * + * @return array + */ + public function getBlacklist() + { + return array_keys($this->blacklistedFiles); + } + + /** + * Returns the list of whitelisted files. + * + * @return array + */ + public function getWhitelist() + { + return array_keys($this->whitelistedFiles); + } + + /** + * Returns whether this filter has a whitelist. + * + * @return bool + * @since Method available since Release 1.1.0 + */ + public function hasWhitelist() + { + return !empty($this->whitelistedFiles); + } + + /** + * Returns the blacklisted files. + * + * @return array + * @since Method available since Release 2.0.0 + */ + public function getBlacklistedFiles() + { + return $this->blacklistedFiles; + } + + /** + * Sets the blacklisted files. + * + * @param array $blacklistedFiles + * @since Method available since Release 2.0.0 + */ + public function setBlacklistedFiles($blacklistedFiles) + { + $this->blacklistedFiles = $blacklistedFiles; + } + + /** + * Returns the whitelisted files. + * + * @return array + * @since Method available since Release 2.0.0 + */ + public function getWhitelistedFiles() + { + return $this->whitelistedFiles; + } + + /** + * Sets the whitelisted files. + * + * @param array $whitelistedFiles + * @since Method available since Release 2.0.0 + */ + public function setWhitelistedFiles($whitelistedFiles) + { + $this->whitelistedFiles = $whitelistedFiles; + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Clover.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Clover.php new file mode 100644 index 0000000..c0ea8d8 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Clover.php @@ -0,0 +1,284 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Generates a Clover XML logfile from an PHP_CodeCoverage object. + * + * @since Class available since Release 1.0.0 + */ +class PHP_CodeCoverage_Report_Clover +{ + /** + * @param PHP_CodeCoverage $coverage + * @param string $target + * @param string $name + * @return string + */ + public function process(PHP_CodeCoverage $coverage, $target = null, $name = null) + { + $xmlDocument = new DOMDocument('1.0', 'UTF-8'); + $xmlDocument->formatOutput = true; + + $xmlCoverage = $xmlDocument->createElement('coverage'); + $xmlCoverage->setAttribute('generated', (int) $_SERVER['REQUEST_TIME']); + $xmlDocument->appendChild($xmlCoverage); + + $xmlProject = $xmlDocument->createElement('project'); + $xmlProject->setAttribute('timestamp', (int) $_SERVER['REQUEST_TIME']); + + if (is_string($name)) { + $xmlProject->setAttribute('name', $name); + } + + $xmlCoverage->appendChild($xmlProject); + + $packages = array(); + $report = $coverage->getReport(); + unset($coverage); + + foreach ($report as $item) { + $namespace = 'global'; + + if (!$item instanceof PHP_CodeCoverage_Report_Node_File) { + continue; + } + + $xmlFile = $xmlDocument->createElement('file'); + $xmlFile->setAttribute('name', $item->getPath()); + + $classes = $item->getClassesAndTraits(); + $coverage = $item->getCoverageData(); + $lines = array(); + + foreach ($classes as $className => $class) { + $classStatements = 0; + $coveredClassStatements = 0; + $coveredMethods = 0; + $classMethods = 0; + + foreach ($class['methods'] as $methodName => $method) { + if ($method['executableLines'] == 0) { + continue; + } + + $classMethods++; + $classStatements += $method['executableLines']; + $coveredClassStatements += $method['executedLines']; + if ($method['coverage'] == 100) { + $coveredMethods++; + } + + $methodCount = 0; + for ($i = $method['startLine']; + $i <= $method['endLine']; + $i++) { + if (isset($coverage[$i]) && ($coverage[$i] !== null)) { + $methodCount = max($methodCount, count($coverage[$i])); + } + } + + $lines[$method['startLine']] = array( + 'count' => $methodCount, + 'crap' => $method['crap'], + 'type' => 'method', + 'name' => $methodName + ); + } + + if (!empty($class['package']['namespace'])) { + $namespace = $class['package']['namespace']; + } + + $xmlClass = $xmlDocument->createElement('class'); + $xmlClass->setAttribute('name', $className); + $xmlClass->setAttribute('namespace', $namespace); + + if (!empty($class['package']['fullPackage'])) { + $xmlClass->setAttribute( + 'fullPackage', + $class['package']['fullPackage'] + ); + } + + if (!empty($class['package']['category'])) { + $xmlClass->setAttribute( + 'category', + $class['package']['category'] + ); + } + + if (!empty($class['package']['package'])) { + $xmlClass->setAttribute( + 'package', + $class['package']['package'] + ); + } + + if (!empty($class['package']['subpackage'])) { + $xmlClass->setAttribute( + 'subpackage', + $class['package']['subpackage'] + ); + } + + $xmlFile->appendChild($xmlClass); + + $xmlMetrics = $xmlDocument->createElement('metrics'); + $xmlMetrics->setAttribute('methods', $classMethods); + $xmlMetrics->setAttribute('coveredmethods', $coveredMethods); + $xmlMetrics->setAttribute('conditionals', 0); + $xmlMetrics->setAttribute('coveredconditionals', 0); + $xmlMetrics->setAttribute('statements', $classStatements); + $xmlMetrics->setAttribute( + 'coveredstatements', + $coveredClassStatements + ); + $xmlMetrics->setAttribute( + 'elements', + $classMethods + + $classStatements + /* + conditionals */ + ); + $xmlMetrics->setAttribute( + 'coveredelements', + $coveredMethods + + $coveredClassStatements + /* + coveredconditionals */ + ); + $xmlClass->appendChild($xmlMetrics); + } + + foreach ($coverage as $line => $data) { + if ($data === null || isset($lines[$line])) { + continue; + } + + $lines[$line] = array( + 'count' => count($data), 'type' => 'stmt' + ); + } + + ksort($lines); + + foreach ($lines as $line => $data) { + $xmlLine = $xmlDocument->createElement('line'); + $xmlLine->setAttribute('num', $line); + $xmlLine->setAttribute('type', $data['type']); + + if (isset($data['name'])) { + $xmlLine->setAttribute('name', $data['name']); + } + + if (isset($data['crap'])) { + $xmlLine->setAttribute('crap', $data['crap']); + } + + $xmlLine->setAttribute('count', $data['count']); + $xmlFile->appendChild($xmlLine); + } + + $linesOfCode = $item->getLinesOfCode(); + + $xmlMetrics = $xmlDocument->createElement('metrics'); + $xmlMetrics->setAttribute('loc', $linesOfCode['loc']); + $xmlMetrics->setAttribute('ncloc', $linesOfCode['ncloc']); + $xmlMetrics->setAttribute('classes', $item->getNumClassesAndTraits()); + $xmlMetrics->setAttribute('methods', $item->getNumMethods()); + $xmlMetrics->setAttribute( + 'coveredmethods', + $item->getNumTestedMethods() + ); + $xmlMetrics->setAttribute('conditionals', 0); + $xmlMetrics->setAttribute('coveredconditionals', 0); + $xmlMetrics->setAttribute( + 'statements', + $item->getNumExecutableLines() + ); + $xmlMetrics->setAttribute( + 'coveredstatements', + $item->getNumExecutedLines() + ); + $xmlMetrics->setAttribute( + 'elements', + $item->getNumMethods() + $item->getNumExecutableLines() + /* + conditionals */ + ); + $xmlMetrics->setAttribute( + 'coveredelements', + $item->getNumTestedMethods() + $item->getNumExecutedLines() + /* + coveredconditionals */ + ); + $xmlFile->appendChild($xmlMetrics); + + if ($namespace == 'global') { + $xmlProject->appendChild($xmlFile); + } else { + if (!isset($packages[$namespace])) { + $packages[$namespace] = $xmlDocument->createElement( + 'package' + ); + + $packages[$namespace]->setAttribute('name', $namespace); + $xmlProject->appendChild($packages[$namespace]); + } + + $packages[$namespace]->appendChild($xmlFile); + } + } + + $linesOfCode = $report->getLinesOfCode(); + + $xmlMetrics = $xmlDocument->createElement('metrics'); + $xmlMetrics->setAttribute('files', count($report)); + $xmlMetrics->setAttribute('loc', $linesOfCode['loc']); + $xmlMetrics->setAttribute('ncloc', $linesOfCode['ncloc']); + $xmlMetrics->setAttribute( + 'classes', + $report->getNumClassesAndTraits() + ); + $xmlMetrics->setAttribute('methods', $report->getNumMethods()); + $xmlMetrics->setAttribute( + 'coveredmethods', + $report->getNumTestedMethods() + ); + $xmlMetrics->setAttribute('conditionals', 0); + $xmlMetrics->setAttribute('coveredconditionals', 0); + $xmlMetrics->setAttribute( + 'statements', + $report->getNumExecutableLines() + ); + $xmlMetrics->setAttribute( + 'coveredstatements', + $report->getNumExecutedLines() + ); + $xmlMetrics->setAttribute( + 'elements', + $report->getNumMethods() + $report->getNumExecutableLines() + /* + conditionals */ + ); + $xmlMetrics->setAttribute( + 'coveredelements', + $report->getNumTestedMethods() + $report->getNumExecutedLines() + /* + coveredconditionals */ + ); + + $xmlProject->appendChild($xmlMetrics); + + if ($target !== null) { + if (!is_dir(dirname($target))) { + mkdir(dirname($target), 0777, true); + } + + return $xmlDocument->save($target); + } else { + return $xmlDocument->saveXML(); + } + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Crap4j.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Crap4j.php new file mode 100644 index 0000000..c006ea6 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Crap4j.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @since Class available since Release 2.0.0 + */ +class PHP_CodeCoverage_Report_Crap4j +{ + /** + * @var int + */ + private $threshold; + + /** + * @param int $threshold + */ + public function __construct($threshold = 30) + { + if (!is_int($threshold)) { + throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + 1, + 'integer' + ); + } + + $this->threshold = $threshold; + } + + /** + * @param PHP_CodeCoverage $coverage + * @param string $target + * @param string $name + * @return string + */ + public function process(PHP_CodeCoverage $coverage, $target = null, $name = null) + { + $document = new DOMDocument('1.0', 'UTF-8'); + $document->formatOutput = true; + + $root = $document->createElement('crap_result'); + $document->appendChild($root); + + $project = $document->createElement('project', is_string($name) ? $name : ''); + $root->appendChild($project); + $root->appendChild($document->createElement('timestamp', date('Y-m-d H:i:s', (int) $_SERVER['REQUEST_TIME']))); + + $stats = $document->createElement('stats'); + $methodsNode = $document->createElement('methods'); + + $report = $coverage->getReport(); + unset($coverage); + + $fullMethodCount = 0; + $fullCrapMethodCount = 0; + $fullCrapLoad = 0; + $fullCrap = 0; + + foreach ($report as $item) { + $namespace = 'global'; + + if (!$item instanceof PHP_CodeCoverage_Report_Node_File) { + continue; + } + + $file = $document->createElement('file'); + $file->setAttribute('name', $item->getPath()); + + $classes = $item->getClassesAndTraits(); + + foreach ($classes as $className => $class) { + foreach ($class['methods'] as $methodName => $method) { + $crapLoad = $this->getCrapLoad($method['crap'], $method['ccn'], $method['coverage']); + + $fullCrap += $method['crap']; + $fullCrapLoad += $crapLoad; + $fullMethodCount++; + + if ($method['crap'] >= $this->threshold) { + $fullCrapMethodCount++; + } + + $methodNode = $document->createElement('method'); + + if (!empty($class['package']['namespace'])) { + $namespace = $class['package']['namespace']; + } + + $methodNode->appendChild($document->createElement('package', $namespace)); + $methodNode->appendChild($document->createElement('className', $className)); + $methodNode->appendChild($document->createElement('methodName', $methodName)); + $methodNode->appendChild($document->createElement('methodSignature', htmlspecialchars($method['signature']))); + $methodNode->appendChild($document->createElement('fullMethod', htmlspecialchars($method['signature']))); + $methodNode->appendChild($document->createElement('crap', $this->roundValue($method['crap']))); + $methodNode->appendChild($document->createElement('complexity', $method['ccn'])); + $methodNode->appendChild($document->createElement('coverage', $this->roundValue($method['coverage']))); + $methodNode->appendChild($document->createElement('crapLoad', round($crapLoad))); + + $methodsNode->appendChild($methodNode); + } + } + } + + $stats->appendChild($document->createElement('name', 'Method Crap Stats')); + $stats->appendChild($document->createElement('methodCount', $fullMethodCount)); + $stats->appendChild($document->createElement('crapMethodCount', $fullCrapMethodCount)); + $stats->appendChild($document->createElement('crapLoad', round($fullCrapLoad))); + $stats->appendChild($document->createElement('totalCrap', $fullCrap)); + + if ($fullMethodCount > 0) { + $crapMethodPercent = $this->roundValue((100 * $fullCrapMethodCount) / $fullMethodCount); + } else { + $crapMethodPercent = 0; + } + + $stats->appendChild($document->createElement('crapMethodPercent', $crapMethodPercent)); + + $root->appendChild($stats); + $root->appendChild($methodsNode); + + if ($target !== null) { + if (!is_dir(dirname($target))) { + mkdir(dirname($target), 0777, true); + } + + return $document->save($target); + } else { + return $document->saveXML(); + } + } + + /** + * @param float $crapValue + * @param int $cyclomaticComplexity + * @param float $coveragePercent + * @return float + */ + private function getCrapLoad($crapValue, $cyclomaticComplexity, $coveragePercent) + { + $crapLoad = 0; + + if ($crapValue >= $this->threshold) { + $crapLoad += $cyclomaticComplexity * (1.0 - $coveragePercent / 100); + $crapLoad += $cyclomaticComplexity / $this->threshold; + } + + return $crapLoad; + } + + /** + * @param float $value + * @return float + */ + private function roundValue($value) + { + return round($value, 2); + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php new file mode 100644 index 0000000..b28964e --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php @@ -0,0 +1,242 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Factory for PHP_CodeCoverage_Report_Node_* object graphs. + * + * @since Class available since Release 1.1.0 + */ +class PHP_CodeCoverage_Report_Factory +{ + /** + * @param PHP_CodeCoverage $coverage + * @return PHP_CodeCoverage_Report_Node_Directory + */ + public function create(PHP_CodeCoverage $coverage) + { + $files = $coverage->getData(); + $commonPath = $this->reducePaths($files); + $root = new PHP_CodeCoverage_Report_Node_Directory( + $commonPath, + null + ); + + $this->addItems( + $root, + $this->buildDirectoryStructure($files), + $coverage->getTests(), + $coverage->getCacheTokens() + ); + + return $root; + } + + /** + * @param PHP_CodeCoverage_Report_Node_Directory $root + * @param array $items + * @param array $tests + * @param bool $cacheTokens + */ + private function addItems(PHP_CodeCoverage_Report_Node_Directory $root, array $items, array $tests, $cacheTokens) + { + foreach ($items as $key => $value) { + if (substr($key, -2) == '/f') { + $key = substr($key, 0, -2); + + if (file_exists($root->getPath() . DIRECTORY_SEPARATOR . $key)) { + $root->addFile($key, $value, $tests, $cacheTokens); + } + } else { + $child = $root->addDirectory($key); + $this->addItems($child, $value, $tests, $cacheTokens); + } + } + } + + /** + * Builds an array representation of the directory structure. + * + * For instance, + * + * + * Array + * ( + * [Money.php] => Array + * ( + * ... + * ) + * + * [MoneyBag.php] => Array + * ( + * ... + * ) + * ) + * + * + * is transformed into + * + * + * Array + * ( + * [.] => Array + * ( + * [Money.php] => Array + * ( + * ... + * ) + * + * [MoneyBag.php] => Array + * ( + * ... + * ) + * ) + * ) + * + * + * @param array $files + * @return array + */ + private function buildDirectoryStructure($files) + { + $result = array(); + + foreach ($files as $path => $file) { + $path = explode('/', $path); + $pointer = &$result; + $max = count($path); + + for ($i = 0; $i < $max; $i++) { + if ($i == ($max - 1)) { + $type = '/f'; + } else { + $type = ''; + } + + $pointer = &$pointer[$path[$i] . $type]; + } + + $pointer = $file; + } + + return $result; + } + + /** + * Reduces the paths by cutting the longest common start path. + * + * For instance, + * + * + * Array + * ( + * [/home/sb/Money/Money.php] => Array + * ( + * ... + * ) + * + * [/home/sb/Money/MoneyBag.php] => Array + * ( + * ... + * ) + * ) + * + * + * is reduced to + * + * + * Array + * ( + * [Money.php] => Array + * ( + * ... + * ) + * + * [MoneyBag.php] => Array + * ( + * ... + * ) + * ) + * + * + * @param array $files + * @return string + */ + private function reducePaths(&$files) + { + if (empty($files)) { + return '.'; + } + + $commonPath = ''; + $paths = array_keys($files); + + if (count($files) == 1) { + $commonPath = dirname($paths[0]) . '/'; + $files[basename($paths[0])] = $files[$paths[0]]; + + unset($files[$paths[0]]); + + return $commonPath; + } + + $max = count($paths); + + for ($i = 0; $i < $max; $i++) { + // strip phar:// prefixes + if (strpos($paths[$i], 'phar://') === 0) { + $paths[$i] = substr($paths[$i], 7); + $paths[$i] = strtr($paths[$i], '/', DIRECTORY_SEPARATOR); + } + $paths[$i] = explode(DIRECTORY_SEPARATOR, $paths[$i]); + + if (empty($paths[$i][0])) { + $paths[$i][0] = DIRECTORY_SEPARATOR; + } + } + + $done = false; + $max = count($paths); + + while (!$done) { + for ($i = 0; $i < $max - 1; $i++) { + if (!isset($paths[$i][0]) || + !isset($paths[$i+1][0]) || + $paths[$i][0] != $paths[$i+1][0]) { + $done = true; + break; + } + } + + if (!$done) { + $commonPath .= $paths[0][0]; + + if ($paths[0][0] != DIRECTORY_SEPARATOR) { + $commonPath .= DIRECTORY_SEPARATOR; + } + + for ($i = 0; $i < $max; $i++) { + array_shift($paths[$i]); + } + } + } + + $original = array_keys($files); + $max = count($original); + + for ($i = 0; $i < $max; $i++) { + $files[implode('/', $paths[$i])] = $files[$original[$i]]; + unset($files[$original[$i]]); + } + + ksort($files); + + return substr($commonPath, 0, -1); + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php new file mode 100644 index 0000000..80916ef --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php @@ -0,0 +1,182 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Generates an HTML report from an PHP_CodeCoverage object. + * + * @since Class available since Release 1.0.0 + */ +class PHP_CodeCoverage_Report_HTML +{ + /** + * @var string + */ + private $templatePath; + + /** + * @var string + */ + private $generator; + + /** + * @var int + */ + private $lowUpperBound; + + /** + * @var int + */ + private $highLowerBound; + + /** + * Constructor. + * + * @param int $lowUpperBound + * @param int $highLowerBound + * @param string $generator + */ + public function __construct($lowUpperBound = 50, $highLowerBound = 90, $generator = '') + { + $this->generator = $generator; + $this->highLowerBound = $highLowerBound; + $this->lowUpperBound = $lowUpperBound; + + $this->templatePath = sprintf( + '%s%sHTML%sRenderer%sTemplate%s', + dirname(__FILE__), + DIRECTORY_SEPARATOR, + DIRECTORY_SEPARATOR, + DIRECTORY_SEPARATOR, + DIRECTORY_SEPARATOR + ); + } + + /** + * @param PHP_CodeCoverage $coverage + * @param string $target + */ + public function process(PHP_CodeCoverage $coverage, $target) + { + $target = $this->getDirectory($target); + $report = $coverage->getReport(); + unset($coverage); + + if (!isset($_SERVER['REQUEST_TIME'])) { + $_SERVER['REQUEST_TIME'] = time(); + } + + $date = date('D M j G:i:s T Y', $_SERVER['REQUEST_TIME']); + + $dashboard = new PHP_CodeCoverage_Report_HTML_Renderer_Dashboard( + $this->templatePath, + $this->generator, + $date, + $this->lowUpperBound, + $this->highLowerBound + ); + + $directory = new PHP_CodeCoverage_Report_HTML_Renderer_Directory( + $this->templatePath, + $this->generator, + $date, + $this->lowUpperBound, + $this->highLowerBound + ); + + $file = new PHP_CodeCoverage_Report_HTML_Renderer_File( + $this->templatePath, + $this->generator, + $date, + $this->lowUpperBound, + $this->highLowerBound + ); + + $directory->render($report, $target . 'index.html'); + $dashboard->render($report, $target . 'dashboard.html'); + + foreach ($report as $node) { + $id = $node->getId(); + + if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) { + if (!file_exists($target . $id)) { + mkdir($target . $id, 0777, true); + } + + $directory->render($node, $target . $id . '/index.html'); + $dashboard->render($node, $target . $id . '/dashboard.html'); + } else { + $dir = dirname($target . $id); + + if (!file_exists($dir)) { + mkdir($dir, 0777, true); + } + + $file->render($node, $target . $id . '.html'); + } + } + + $this->copyFiles($target); + } + + /** + * @param string $target + */ + private function copyFiles($target) + { + $dir = $this->getDirectory($target . 'css'); + copy($this->templatePath . 'css/bootstrap.min.css', $dir . 'bootstrap.min.css'); + copy($this->templatePath . 'css/nv.d3.min.css', $dir . 'nv.d3.min.css'); + copy($this->templatePath . 'css/style.css', $dir . 'style.css'); + + $dir = $this->getDirectory($target . 'fonts'); + copy($this->templatePath . 'fonts/glyphicons-halflings-regular.eot', $dir . 'glyphicons-halflings-regular.eot'); + copy($this->templatePath . 'fonts/glyphicons-halflings-regular.svg', $dir . 'glyphicons-halflings-regular.svg'); + copy($this->templatePath . 'fonts/glyphicons-halflings-regular.ttf', $dir . 'glyphicons-halflings-regular.ttf'); + copy($this->templatePath . 'fonts/glyphicons-halflings-regular.woff', $dir . 'glyphicons-halflings-regular.woff'); + copy($this->templatePath . 'fonts/glyphicons-halflings-regular.woff2', $dir . 'glyphicons-halflings-regular.woff2'); + + $dir = $this->getDirectory($target . 'js'); + copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js'); + copy($this->templatePath . 'js/d3.min.js', $dir . 'd3.min.js'); + copy($this->templatePath . 'js/holder.min.js', $dir . 'holder.min.js'); + copy($this->templatePath . 'js/html5shiv.min.js', $dir . 'html5shiv.min.js'); + copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js'); + copy($this->templatePath . 'js/nv.d3.min.js', $dir . 'nv.d3.min.js'); + copy($this->templatePath . 'js/respond.min.js', $dir . 'respond.min.js'); + } + + /** + * @param string $directory + * @return string + * @throws PHP_CodeCoverage_Exception + * @since Method available since Release 1.2.0 + */ + private function getDirectory($directory) + { + if (substr($directory, -1, 1) != DIRECTORY_SEPARATOR) { + $directory .= DIRECTORY_SEPARATOR; + } + + if (is_dir($directory)) { + return $directory; + } + + if (@mkdir($directory, 0777, true)) { + return $directory; + } + + throw new PHP_CodeCoverage_Exception( + sprintf( + 'Directory "%s" does not exist.', + $directory + ) + ); + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer.php new file mode 100644 index 0000000..51aa15e --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer.php @@ -0,0 +1,271 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use SebastianBergmann\Environment\Runtime; + +/** + * Base class for PHP_CodeCoverage_Report_Node renderers. + * + * @since Class available since Release 1.1.0 + */ +abstract class PHP_CodeCoverage_Report_HTML_Renderer +{ + /** + * @var string + */ + protected $templatePath; + + /** + * @var string + */ + protected $generator; + + /** + * @var string + */ + protected $date; + + /** + * @var int + */ + protected $lowUpperBound; + + /** + * @var int + */ + protected $highLowerBound; + + /** + * @var string + */ + protected $version; + + /** + * Constructor. + * + * @param string $templatePath + * @param string $generator + * @param string $date + * @param int $lowUpperBound + * @param int $highLowerBound + */ + public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) + { + $version = new SebastianBergmann\Version('2.2.4', dirname(dirname(dirname(dirname(__DIR__))))); + + $this->templatePath = $templatePath; + $this->generator = $generator; + $this->date = $date; + $this->lowUpperBound = $lowUpperBound; + $this->highLowerBound = $highLowerBound; + $this->version = $version->getVersion(); + } + + /** + * @param Text_Template $template + * @param array $data + * @return string + */ + protected function renderItemTemplate(Text_Template $template, array $data) + { + $numSeparator = ' / '; + + if (isset($data['numClasses']) && $data['numClasses'] > 0) { + $classesLevel = $this->getColorLevel($data['testedClassesPercent']); + + $classesNumber = $data['numTestedClasses'] . $numSeparator . + $data['numClasses']; + + $classesBar = $this->getCoverageBar( + $data['testedClassesPercent'] + ); + } else { + $classesLevel = 'success'; + $classesNumber = '0' . $numSeparator . '0'; + $classesBar = $this->getCoverageBar(100); + } + + if ($data['numMethods'] > 0) { + $methodsLevel = $this->getColorLevel($data['testedMethodsPercent']); + + $methodsNumber = $data['numTestedMethods'] . $numSeparator . + $data['numMethods']; + + $methodsBar = $this->getCoverageBar( + $data['testedMethodsPercent'] + ); + } else { + $methodsLevel = 'success'; + $methodsNumber = '0' . $numSeparator . '0'; + $methodsBar = $this->getCoverageBar(100); + $data['testedMethodsPercentAsString'] = '100.00%'; + } + + if ($data['numExecutableLines'] > 0) { + $linesLevel = $this->getColorLevel($data['linesExecutedPercent']); + + $linesNumber = $data['numExecutedLines'] . $numSeparator . + $data['numExecutableLines']; + + $linesBar = $this->getCoverageBar( + $data['linesExecutedPercent'] + ); + } else { + $linesLevel = 'success'; + $linesNumber = '0' . $numSeparator . '0'; + $linesBar = $this->getCoverageBar(100); + $data['linesExecutedPercentAsString'] = '100.00%'; + } + + $template->setVar( + array( + 'icon' => isset($data['icon']) ? $data['icon'] : '', + 'crap' => isset($data['crap']) ? $data['crap'] : '', + 'name' => $data['name'], + 'lines_bar' => $linesBar, + 'lines_executed_percent' => $data['linesExecutedPercentAsString'], + 'lines_level' => $linesLevel, + 'lines_number' => $linesNumber, + 'methods_bar' => $methodsBar, + 'methods_tested_percent' => $data['testedMethodsPercentAsString'], + 'methods_level' => $methodsLevel, + 'methods_number' => $methodsNumber, + 'classes_bar' => $classesBar, + 'classes_tested_percent' => isset($data['testedClassesPercentAsString']) ? $data['testedClassesPercentAsString'] : '', + 'classes_level' => $classesLevel, + 'classes_number' => $classesNumber + ) + ); + + return $template->render(); + } + + /** + * @param Text_Template $template + * @param PHP_CodeCoverage_Report_Node $node + */ + protected function setCommonTemplateVariables(Text_Template $template, PHP_CodeCoverage_Report_Node $node) + { + $runtime = new Runtime; + + $template->setVar( + array( + 'id' => $node->getId(), + 'full_path' => $node->getPath(), + 'path_to_root' => $this->getPathToRoot($node), + 'breadcrumbs' => $this->getBreadcrumbs($node), + 'date' => $this->date, + 'version' => $this->version, + 'runtime_name' => $runtime->getName(), + 'runtime_version' => $runtime->getVersion(), + 'runtime_link' => $runtime->getVendorUrl(), + 'generator' => $this->generator, + 'low_upper_bound' => $this->lowUpperBound, + 'high_lower_bound' => $this->highLowerBound + ) + ); + } + + protected function getBreadcrumbs(PHP_CodeCoverage_Report_Node $node) + { + $breadcrumbs = ''; + $path = $node->getPathAsArray(); + $pathToRoot = array(); + $max = count($path); + + if ($node instanceof PHP_CodeCoverage_Report_Node_File) { + $max--; + } + + for ($i = 0; $i < $max; $i++) { + $pathToRoot[] = str_repeat('../', $i); + } + + foreach ($path as $step) { + if ($step !== $node) { + $breadcrumbs .= $this->getInactiveBreadcrumb( + $step, + array_pop($pathToRoot) + ); + } else { + $breadcrumbs .= $this->getActiveBreadcrumb($step); + } + } + + return $breadcrumbs; + } + + protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node) + { + $buffer = sprintf( + '
  • %s
  • ' . "\n", + $node->getName() + ); + + if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) { + $buffer .= '
  • (Dashboard)
  • ' . "\n"; + } + + return $buffer; + } + + protected function getInactiveBreadcrumb(PHP_CodeCoverage_Report_Node $node, $pathToRoot) + { + return sprintf( + '
  • %s
  • ' . "\n", + $pathToRoot, + $node->getName() + ); + } + + protected function getPathToRoot(PHP_CodeCoverage_Report_Node $node) + { + $id = $node->getId(); + $depth = substr_count($id, '/'); + + if ($id != 'index' && + $node instanceof PHP_CodeCoverage_Report_Node_Directory) { + $depth++; + } + + return str_repeat('../', $depth); + } + + protected function getCoverageBar($percent) + { + $level = $this->getColorLevel($percent); + + $template = new Text_Template( + $this->templatePath . 'coverage_bar.html', + '{{', + '}}' + ); + + $template->setVar(array('level' => $level, 'percent' => sprintf('%.2F', $percent))); + + return $template->render(); + } + + /** + * @param int $percent + * @return string + */ + protected function getColorLevel($percent) + { + if ($percent <= $this->lowUpperBound) { + return 'danger'; + } elseif ($percent > $this->lowUpperBound && + $percent < $this->highLowerBound) { + return 'warning'; + } else { + return 'success'; + } + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php new file mode 100644 index 0000000..f648097 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php @@ -0,0 +1,295 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Renders the dashboard for a PHP_CodeCoverage_Report_Node_Directory node. + * + * @since Class available since Release 1.1.0 + */ +class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard extends PHP_CodeCoverage_Report_HTML_Renderer +{ + /** + * @param PHP_CodeCoverage_Report_Node_Directory $node + * @param string $file + */ + public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) + { + $classes = $node->getClassesAndTraits(); + $template = new Text_Template( + $this->templatePath . 'dashboard.html', + '{{', + '}}' + ); + + $this->setCommonTemplateVariables($template, $node); + + $baseLink = $node->getId() . '/'; + $complexity = $this->complexity($classes, $baseLink); + $coverageDistribution = $this->coverageDistribution($classes); + $insufficientCoverage = $this->insufficientCoverage($classes, $baseLink); + $projectRisks = $this->projectRisks($classes, $baseLink); + + $template->setVar( + array( + 'insufficient_coverage_classes' => $insufficientCoverage['class'], + 'insufficient_coverage_methods' => $insufficientCoverage['method'], + 'project_risks_classes' => $projectRisks['class'], + 'project_risks_methods' => $projectRisks['method'], + 'complexity_class' => $complexity['class'], + 'complexity_method' => $complexity['method'], + 'class_coverage_distribution' => $coverageDistribution['class'], + 'method_coverage_distribution' => $coverageDistribution['method'] + ) + ); + + $template->renderTo($file); + } + + /** + * Returns the data for the Class/Method Complexity charts. + * + * @param array $classes + * @param string $baseLink + * @return array + */ + protected function complexity(array $classes, $baseLink) + { + $result = array('class' => array(), 'method' => array()); + + foreach ($classes as $className => $class) { + foreach ($class['methods'] as $methodName => $method) { + if ($className != '*') { + $methodName = $className . '::' . $methodName; + } + + $result['method'][] = array( + $method['coverage'], + $method['ccn'], + sprintf( + '%s', + str_replace($baseLink, '', $method['link']), + $methodName + ) + ); + } + + $result['class'][] = array( + $class['coverage'], + $class['ccn'], + sprintf( + '%s', + str_replace($baseLink, '', $class['link']), + $className + ) + ); + } + + return array( + 'class' => json_encode($result['class']), + 'method' => json_encode($result['method']) + ); + } + + /** + * Returns the data for the Class / Method Coverage Distribution chart. + * + * @param array $classes + * @return array + */ + protected function coverageDistribution(array $classes) + { + $result = array( + 'class' => array( + '0%' => 0, + '0-10%' => 0, + '10-20%' => 0, + '20-30%' => 0, + '30-40%' => 0, + '40-50%' => 0, + '50-60%' => 0, + '60-70%' => 0, + '70-80%' => 0, + '80-90%' => 0, + '90-100%' => 0, + '100%' => 0 + ), + 'method' => array( + '0%' => 0, + '0-10%' => 0, + '10-20%' => 0, + '20-30%' => 0, + '30-40%' => 0, + '40-50%' => 0, + '50-60%' => 0, + '60-70%' => 0, + '70-80%' => 0, + '80-90%' => 0, + '90-100%' => 0, + '100%' => 0 + ) + ); + + foreach ($classes as $class) { + foreach ($class['methods'] as $methodName => $method) { + if ($method['coverage'] == 0) { + $result['method']['0%']++; + } elseif ($method['coverage'] == 100) { + $result['method']['100%']++; + } else { + $key = floor($method['coverage'] / 10) * 10; + $key = $key . '-' . ($key + 10) . '%'; + $result['method'][$key]++; + } + } + + if ($class['coverage'] == 0) { + $result['class']['0%']++; + } elseif ($class['coverage'] == 100) { + $result['class']['100%']++; + } else { + $key = floor($class['coverage'] / 10) * 10; + $key = $key . '-' . ($key + 10) . '%'; + $result['class'][$key]++; + } + } + + return array( + 'class' => json_encode(array_values($result['class'])), + 'method' => json_encode(array_values($result['method'])) + ); + } + + /** + * Returns the classes / methods with insufficient coverage. + * + * @param array $classes + * @param string $baseLink + * @return array + */ + protected function insufficientCoverage(array $classes, $baseLink) + { + $leastTestedClasses = array(); + $leastTestedMethods = array(); + $result = array('class' => '', 'method' => ''); + + foreach ($classes as $className => $class) { + foreach ($class['methods'] as $methodName => $method) { + if ($method['coverage'] < $this->highLowerBound) { + if ($className != '*') { + $key = $className . '::' . $methodName; + } else { + $key = $methodName; + } + + $leastTestedMethods[$key] = $method['coverage']; + } + } + + if ($class['coverage'] < $this->highLowerBound) { + $leastTestedClasses[$className] = $class['coverage']; + } + } + + asort($leastTestedClasses); + asort($leastTestedMethods); + + foreach ($leastTestedClasses as $className => $coverage) { + $result['class'] .= sprintf( + ' %s%d%%' . "\n", + str_replace($baseLink, '', $classes[$className]['link']), + $className, + $coverage + ); + } + + foreach ($leastTestedMethods as $methodName => $coverage) { + list($class, $method) = explode('::', $methodName); + + $result['method'] .= sprintf( + ' %s%d%%' . "\n", + str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), + $methodName, + $method, + $coverage + ); + } + + return $result; + } + + /** + * Returns the project risks according to the CRAP index. + * + * @param array $classes + * @param string $baseLink + * @return array + */ + protected function projectRisks(array $classes, $baseLink) + { + $classRisks = array(); + $methodRisks = array(); + $result = array('class' => '', 'method' => ''); + + foreach ($classes as $className => $class) { + foreach ($class['methods'] as $methodName => $method) { + if ($method['coverage'] < $this->highLowerBound && + $method['ccn'] > 1) { + if ($className != '*') { + $key = $className . '::' . $methodName; + } else { + $key = $methodName; + } + + $methodRisks[$key] = $method['crap']; + } + } + + if ($class['coverage'] < $this->highLowerBound && + $class['ccn'] > count($class['methods'])) { + $classRisks[$className] = $class['crap']; + } + } + + arsort($classRisks); + arsort($methodRisks); + + foreach ($classRisks as $className => $crap) { + $result['class'] .= sprintf( + ' %s%d' . "\n", + str_replace($baseLink, '', $classes[$className]['link']), + $className, + $crap + ); + } + + foreach ($methodRisks as $methodName => $crap) { + list($class, $method) = explode('::', $methodName); + + $result['method'] .= sprintf( + ' %s%d' . "\n", + str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), + $methodName, + $method, + $crap + ); + } + + return $result; + } + + protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node) + { + return sprintf( + '
  • %s
  • ' . "\n" . + '
  • (Dashboard)
  • ' . "\n", + $node->getName() + ); + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Directory.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Directory.php new file mode 100644 index 0000000..4415c52 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Directory.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Renders a PHP_CodeCoverage_Report_Node_Directory node. + * + * @since Class available since Release 1.1.0 + */ +class PHP_CodeCoverage_Report_HTML_Renderer_Directory extends PHP_CodeCoverage_Report_HTML_Renderer +{ + /** + * @param PHP_CodeCoverage_Report_Node_Directory $node + * @param string $file + */ + public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) + { + $template = new Text_Template($this->templatePath . 'directory.html', '{{', '}}'); + + $this->setCommonTemplateVariables($template, $node); + + $items = $this->renderItem($node, true); + + foreach ($node->getDirectories() as $item) { + $items .= $this->renderItem($item); + } + + foreach ($node->getFiles() as $item) { + $items .= $this->renderItem($item); + } + + $template->setVar( + array( + 'id' => $node->getId(), + 'items' => $items + ) + ); + + $template->renderTo($file); + } + + /** + * @param PHP_CodeCoverage_Report_Node $item + * @param bool $total + * @return string + */ + protected function renderItem(PHP_CodeCoverage_Report_Node $item, $total = false) + { + $data = array( + 'numClasses' => $item->getNumClassesAndTraits(), + 'numTestedClasses' => $item->getNumTestedClassesAndTraits(), + 'numMethods' => $item->getNumMethods(), + 'numTestedMethods' => $item->getNumTestedMethods(), + 'linesExecutedPercent' => $item->getLineExecutedPercent(false), + 'linesExecutedPercentAsString' => $item->getLineExecutedPercent(), + 'numExecutedLines' => $item->getNumExecutedLines(), + 'numExecutableLines' => $item->getNumExecutableLines(), + 'testedMethodsPercent' => $item->getTestedMethodsPercent(false), + 'testedMethodsPercentAsString' => $item->getTestedMethodsPercent(), + 'testedClassesPercent' => $item->getTestedClassesAndTraitsPercent(false), + 'testedClassesPercentAsString' => $item->getTestedClassesAndTraitsPercent() + ); + + if ($total) { + $data['name'] = 'Total'; + } else { + if ($item instanceof PHP_CodeCoverage_Report_Node_Directory) { + $data['name'] = sprintf( + '%s', + $item->getName(), + $item->getName() + ); + + $data['icon'] = ' '; + } else { + $data['name'] = sprintf( + '%s', + $item->getName(), + $item->getName() + ); + + $data['icon'] = ' '; + } + } + + return $this->renderItemTemplate( + new Text_Template($this->templatePath . 'directory_item.html', '{{', '}}'), + $data + ); + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/File.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/File.php new file mode 100644 index 0000000..d52345d --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/File.php @@ -0,0 +1,556 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +// @codeCoverageIgnoreStart +if (!defined('T_TRAIT')) { + define('T_TRAIT', 1001); +} + +if (!defined('T_INSTEADOF')) { + define('T_INSTEADOF', 1002); +} + +if (!defined('T_CALLABLE')) { + define('T_CALLABLE', 1003); +} + +if (!defined('T_FINALLY')) { + define('T_FINALLY', 1004); +} + +if (!defined('T_YIELD')) { + define('T_YIELD', 1005); +} +// @codeCoverageIgnoreEnd + +/** + * Renders a PHP_CodeCoverage_Report_Node_File node. + * + * @since Class available since Release 1.1.0 + */ +class PHP_CodeCoverage_Report_HTML_Renderer_File extends PHP_CodeCoverage_Report_HTML_Renderer +{ + /** + * @var int + */ + private $htmlspecialcharsFlags; + + /** + * Constructor. + * + * @param string $templatePath + * @param string $generator + * @param string $date + * @param int $lowUpperBound + * @param int $highLowerBound + */ + public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) + { + parent::__construct( + $templatePath, + $generator, + $date, + $lowUpperBound, + $highLowerBound + ); + + $this->htmlspecialcharsFlags = ENT_COMPAT; + + if (PHP_VERSION_ID >= 50400 && defined('ENT_SUBSTITUTE')) { + $this->htmlspecialcharsFlags = $this->htmlspecialcharsFlags | ENT_HTML401 | ENT_SUBSTITUTE; + } + } + + /** + * @param PHP_CodeCoverage_Report_Node_File $node + * @param string $file + */ + public function render(PHP_CodeCoverage_Report_Node_File $node, $file) + { + $template = new Text_Template($this->templatePath . 'file.html', '{{', '}}'); + + $template->setVar( + array( + 'items' => $this->renderItems($node), + 'lines' => $this->renderSource($node) + ) + ); + + $this->setCommonTemplateVariables($template, $node); + + $template->renderTo($file); + } + + /** + * @param PHP_CodeCoverage_Report_Node_File $node + * @return string + */ + protected function renderItems(PHP_CodeCoverage_Report_Node_File $node) + { + $template = new Text_Template($this->templatePath . 'file_item.html', '{{', '}}'); + + $methodItemTemplate = new Text_Template( + $this->templatePath . 'method_item.html', + '{{', + '}}' + ); + + $items = $this->renderItemTemplate( + $template, + array( + 'name' => 'Total', + 'numClasses' => $node->getNumClassesAndTraits(), + 'numTestedClasses' => $node->getNumTestedClassesAndTraits(), + 'numMethods' => $node->getNumMethods(), + 'numTestedMethods' => $node->getNumTestedMethods(), + 'linesExecutedPercent' => $node->getLineExecutedPercent(false), + 'linesExecutedPercentAsString' => $node->getLineExecutedPercent(), + 'numExecutedLines' => $node->getNumExecutedLines(), + 'numExecutableLines' => $node->getNumExecutableLines(), + 'testedMethodsPercent' => $node->getTestedMethodsPercent(false), + 'testedMethodsPercentAsString' => $node->getTestedMethodsPercent(), + 'testedClassesPercent' => $node->getTestedClassesAndTraitsPercent(false), + 'testedClassesPercentAsString' => $node->getTestedClassesAndTraitsPercent(), + 'crap' => 'CRAP' + ) + ); + + $items .= $this->renderFunctionItems( + $node->getFunctions(), + $methodItemTemplate + ); + + $items .= $this->renderTraitOrClassItems( + $node->getTraits(), + $template, + $methodItemTemplate + ); + + $items .= $this->renderTraitOrClassItems( + $node->getClasses(), + $template, + $methodItemTemplate + ); + + return $items; + } + + /** + * @param array $items + * @param Text_Template $template + * @param Text_Template $methodItemTemplate + * @return string + */ + protected function renderTraitOrClassItems(array $items, Text_Template $template, Text_Template $methodItemTemplate) + { + if (empty($items)) { + return ''; + } + + $buffer = ''; + + foreach ($items as $name => $item) { + $numMethods = count($item['methods']); + $numTestedMethods = 0; + + foreach ($item['methods'] as $method) { + if ($method['executedLines'] == $method['executableLines']) { + $numTestedMethods++; + } + } + + $buffer .= $this->renderItemTemplate( + $template, + array( + 'name' => $name, + 'numClasses' => 1, + 'numTestedClasses' => $numTestedMethods == $numMethods ? 1 : 0, + 'numMethods' => $numMethods, + 'numTestedMethods' => $numTestedMethods, + 'linesExecutedPercent' => PHP_CodeCoverage_Util::percent( + $item['executedLines'], + $item['executableLines'], + false + ), + 'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent( + $item['executedLines'], + $item['executableLines'], + true + ), + 'numExecutedLines' => $item['executedLines'], + 'numExecutableLines' => $item['executableLines'], + 'testedMethodsPercent' => PHP_CodeCoverage_Util::percent( + $numTestedMethods, + $numMethods, + false + ), + 'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent( + $numTestedMethods, + $numMethods, + true + ), + 'testedClassesPercent' => PHP_CodeCoverage_Util::percent( + $numTestedMethods == $numMethods ? 1 : 0, + 1, + false + ), + 'testedClassesPercentAsString' => PHP_CodeCoverage_Util::percent( + $numTestedMethods == $numMethods ? 1 : 0, + 1, + true + ), + 'crap' => $item['crap'] + ) + ); + + foreach ($item['methods'] as $method) { + $buffer .= $this->renderFunctionOrMethodItem( + $methodItemTemplate, + $method, + ' ' + ); + } + } + + return $buffer; + } + + /** + * @param array $functions + * @param Text_Template $template + * @return string + */ + protected function renderFunctionItems(array $functions, Text_Template $template) + { + if (empty($functions)) { + return ''; + } + + $buffer = ''; + + foreach ($functions as $function) { + $buffer .= $this->renderFunctionOrMethodItem( + $template, + $function + ); + } + + return $buffer; + } + + /** + * @param Text_Template $template + * @return string + */ + protected function renderFunctionOrMethodItem(Text_Template $template, array $item, $indent = '') + { + $numTestedItems = $item['executedLines'] == $item['executableLines'] ? 1 : 0; + + return $this->renderItemTemplate( + $template, + array( + 'name' => sprintf( + '%s%s', + $indent, + $item['startLine'], + htmlspecialchars($item['signature']), + isset($item['functionName']) ? $item['functionName'] : $item['methodName'] + ), + 'numMethods' => 1, + 'numTestedMethods' => $numTestedItems, + 'linesExecutedPercent' => PHP_CodeCoverage_Util::percent( + $item['executedLines'], + $item['executableLines'], + false + ), + 'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent( + $item['executedLines'], + $item['executableLines'], + true + ), + 'numExecutedLines' => $item['executedLines'], + 'numExecutableLines' => $item['executableLines'], + 'testedMethodsPercent' => PHP_CodeCoverage_Util::percent( + $numTestedItems, + 1, + false + ), + 'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent( + $numTestedItems, + 1, + true + ), + 'crap' => $item['crap'] + ) + ); + } + + /** + * @param PHP_CodeCoverage_Report_Node_File $node + * @return string + */ + protected function renderSource(PHP_CodeCoverage_Report_Node_File $node) + { + $coverageData = $node->getCoverageData(); + $testData = $node->getTestData(); + $codeLines = $this->loadFile($node->getPath()); + $lines = ''; + $i = 1; + + foreach ($codeLines as $line) { + $trClass = ''; + $popoverContent = ''; + $popoverTitle = ''; + + if (array_key_exists($i, $coverageData)) { + $numTests = count($coverageData[$i]); + + if ($coverageData[$i] === null) { + $trClass = ' class="warning"'; + } elseif ($numTests == 0) { + $trClass = ' class="danger"'; + } else { + $lineCss = 'covered-by-large-tests'; + $popoverContent = '
      '; + + if ($numTests > 1) { + $popoverTitle = $numTests . ' tests cover line ' . $i; + } else { + $popoverTitle = '1 test covers line ' . $i; + } + + foreach ($coverageData[$i] as $test) { + if ($lineCss == 'covered-by-large-tests' && $testData[$test]['size'] == 'medium') { + $lineCss = 'covered-by-medium-tests'; + } elseif ($testData[$test]['size'] == 'small') { + $lineCss = 'covered-by-small-tests'; + } + + switch ($testData[$test]['status']) { + case 0: + switch ($testData[$test]['size']) { + case 'small': + $testCSS = ' class="covered-by-small-tests"'; + break; + + case 'medium': + $testCSS = ' class="covered-by-medium-tests"'; + break; + + default: + $testCSS = ' class="covered-by-large-tests"'; + break; + } + break; + + case 1: + case 2: + $testCSS = ' class="warning"'; + break; + + case 3: + $testCSS = ' class="danger"'; + break; + + case 4: + $testCSS = ' class="danger"'; + break; + + default: + $testCSS = ''; + } + + $popoverContent .= sprintf( + '%s', + $testCSS, + htmlspecialchars($test) + ); + } + + $popoverContent .= '
    '; + $trClass = ' class="' . $lineCss . ' popin"'; + } + } + + if (!empty($popoverTitle)) { + $popover = sprintf( + ' data-title="%s" data-content="%s" data-placement="bottom" data-html="true"', + $popoverTitle, + htmlspecialchars($popoverContent) + ); + } else { + $popover = ''; + } + + $lines .= sprintf( + ' %s' . "\n", + $trClass, + $popover, + $i, + $i, + $i, + $line + ); + + $i++; + } + + return $lines; + } + + /** + * @param string $file + * @return array + */ + protected function loadFile($file) + { + $buffer = file_get_contents($file); + $tokens = token_get_all($buffer); + $result = array(''); + $i = 0; + $stringFlag = false; + $fileEndsWithNewLine = substr($buffer, -1) == "\n"; + + unset($buffer); + + foreach ($tokens as $j => $token) { + if (is_string($token)) { + if ($token === '"' && $tokens[$j - 1] !== '\\') { + $result[$i] .= sprintf( + '%s', + htmlspecialchars($token) + ); + + $stringFlag = !$stringFlag; + } else { + $result[$i] .= sprintf( + '%s', + htmlspecialchars($token) + ); + } + + continue; + } + + list($token, $value) = $token; + + $value = str_replace( + array("\t", ' '), + array('    ', ' '), + htmlspecialchars($value, $this->htmlspecialcharsFlags) + ); + + if ($value === "\n") { + $result[++$i] = ''; + } else { + $lines = explode("\n", $value); + + foreach ($lines as $jj => $line) { + $line = trim($line); + + if ($line !== '') { + if ($stringFlag) { + $colour = 'string'; + } else { + switch ($token) { + case T_INLINE_HTML: + $colour = 'html'; + break; + + case T_COMMENT: + case T_DOC_COMMENT: + $colour = 'comment'; + break; + + case T_ABSTRACT: + case T_ARRAY: + case T_AS: + case T_BREAK: + case T_CALLABLE: + case T_CASE: + case T_CATCH: + case T_CLASS: + case T_CLONE: + case T_CONTINUE: + case T_DEFAULT: + case T_ECHO: + case T_ELSE: + case T_ELSEIF: + case T_EMPTY: + case T_ENDDECLARE: + case T_ENDFOR: + case T_ENDFOREACH: + case T_ENDIF: + case T_ENDSWITCH: + case T_ENDWHILE: + case T_EXIT: + case T_EXTENDS: + case T_FINAL: + case T_FINALLY: + case T_FOREACH: + case T_FUNCTION: + case T_GLOBAL: + case T_IF: + case T_IMPLEMENTS: + case T_INCLUDE: + case T_INCLUDE_ONCE: + case T_INSTANCEOF: + case T_INSTEADOF: + case T_INTERFACE: + case T_ISSET: + case T_LOGICAL_AND: + case T_LOGICAL_OR: + case T_LOGICAL_XOR: + case T_NAMESPACE: + case T_NEW: + case T_PRIVATE: + case T_PROTECTED: + case T_PUBLIC: + case T_REQUIRE: + case T_REQUIRE_ONCE: + case T_RETURN: + case T_STATIC: + case T_THROW: + case T_TRAIT: + case T_TRY: + case T_UNSET: + case T_USE: + case T_VAR: + case T_WHILE: + case T_YIELD: + $colour = 'keyword'; + break; + + default: + $colour = 'default'; + } + } + + $result[$i] .= sprintf( + '%s', + $colour, + $line + ); + } + + if (isset($lines[$jj + 1])) { + $result[++$i] = ''; + } + } + } + } + + if ($fileEndsWithNewLine) { + unset($result[count($result)-1]); + } + + return $result; + } +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist new file mode 100644 index 0000000..5a09c35 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist @@ -0,0 +1,5 @@ +
    +
    + {{percent}}% covered ({{level}}) +
    +
    diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css new file mode 100644 index 0000000..cd1c616 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/nv.d3.min.css b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/nv.d3.min.css new file mode 100644 index 0000000..7a6f7fe --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/nv.d3.min.css @@ -0,0 +1 @@ +.nvd3 .nv-axis{pointer-events:none;opacity:1}.nvd3 .nv-axis path{fill:none;stroke:#000;stroke-opacity:.75;shape-rendering:crispEdges}.nvd3 .nv-axis path.domain{stroke-opacity:.75}.nvd3 .nv-axis.nv-x path.domain{stroke-opacity:0}.nvd3 .nv-axis line{fill:none;stroke:#e5e5e5;shape-rendering:crispEdges}.nvd3 .nv-axis .zero line,.nvd3 .nv-axis line.zero{stroke-opacity:.75}.nvd3 .nv-axis .nv-axisMaxMin text{font-weight:700}.nvd3 .x .nv-axis .nv-axisMaxMin text,.nvd3 .x2 .nv-axis .nv-axisMaxMin text,.nvd3 .x3 .nv-axis .nv-axisMaxMin text{text-anchor:middle}.nvd3 .nv-axis.nv-disabled{opacity:0}.nvd3 .nv-bars rect{fill-opacity:.75;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-bars rect.hover{fill-opacity:1}.nvd3 .nv-bars .hover rect{fill:#add8e6}.nvd3 .nv-bars text{fill:rgba(0,0,0,0)}.nvd3 .nv-bars .hover text{fill:rgba(0,0,0,1)}.nvd3 .nv-multibar .nv-groups rect,.nvd3 .nv-multibarHorizontal .nv-groups rect,.nvd3 .nv-discretebar .nv-groups rect{stroke-opacity:0;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-multibar .nv-groups rect:hover,.nvd3 .nv-multibarHorizontal .nv-groups rect:hover,.nvd3 .nv-candlestickBar .nv-ticks rect:hover,.nvd3 .nv-discretebar .nv-groups rect:hover{fill-opacity:1}.nvd3 .nv-discretebar .nv-groups text,.nvd3 .nv-multibarHorizontal .nv-groups text{font-weight:700;fill:rgba(0,0,0,1);stroke:rgba(0,0,0,0)}.nvd3 .nv-boxplot circle{fill-opacity:.5}.nvd3 .nv-boxplot circle:hover{fill-opacity:1}.nvd3 .nv-boxplot rect:hover{fill-opacity:1}.nvd3 line.nv-boxplot-median{stroke:#000}.nv-boxplot-tick:hover{stroke-width:2.5px}.nvd3.nv-bullet{font:10px sans-serif}.nvd3.nv-bullet .nv-measure{fill-opacity:.8}.nvd3.nv-bullet .nv-measure:hover{fill-opacity:1}.nvd3.nv-bullet .nv-marker{stroke:#000;stroke-width:2px}.nvd3.nv-bullet .nv-markerTriangle{stroke:#000;fill:#fff;stroke-width:1.5px}.nvd3.nv-bullet .nv-tick line{stroke:#666;stroke-width:.5px}.nvd3.nv-bullet .nv-range.nv-s0{fill:#eee}.nvd3.nv-bullet .nv-range.nv-s1{fill:#ddd}.nvd3.nv-bullet .nv-range.nv-s2{fill:#ccc}.nvd3.nv-bullet .nv-title{font-size:14px;font-weight:700}.nvd3.nv-bullet .nv-subtitle{fill:#999}.nvd3.nv-bullet .nv-range{fill:#bababa;fill-opacity:.4}.nvd3.nv-bullet .nv-range:hover{fill-opacity:.7}.nvd3.nv-candlestickBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.positive rect{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.negative rect{stroke:#d62728;fill:#d62728}.with-transitions .nv-candlestickBar .nv-ticks .nv-tick{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-candlestickBar .nv-ticks line{stroke:#333}.nvd3 .nv-legend .nv-disabled rect{}.nvd3 .nv-check-box .nv-box{fill-opacity:0;stroke-width:2}.nvd3 .nv-check-box .nv-check{fill-opacity:0;stroke-width:4}.nvd3 .nv-series.nv-disabled .nv-check-box .nv-check{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-controlsWrap .nv-legend .nv-check-box .nv-check{opacity:0}.nvd3.nv-linePlusBar .nv-bar rect{fill-opacity:.75}.nvd3.nv-linePlusBar .nv-bar rect:hover{fill-opacity:1}.nvd3 .nv-groups path.nv-line{fill:none}.nvd3 .nv-groups path.nv-area{stroke:none}.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{fill-opacity:0;stroke-opacity:0}.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point{fill-opacity:.5!important;stroke-opacity:.5!important}.with-transitions .nvd3 .nv-groups .nv-point{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-scatter .nv-groups .nv-point.hover,.nvd3 .nv-groups .nv-point.hover{stroke-width:7px;fill-opacity:.95!important;stroke-opacity:.95!important}.nvd3 .nv-point-paths path{stroke:#aaa;stroke-opacity:0;fill:#eee;fill-opacity:0}.nvd3 .nv-indexLine{cursor:ew-resize}svg.nvd3-svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none;display:block;width:100%;height:100%}.nvtooltip.with-3d-shadow,.with-3d-shadow .nvtooltip{-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nvd3 text{font:400 12px Arial}.nvd3 .title{font:700 14px Arial}.nvd3 .nv-background{fill:#fff;fill-opacity:0}.nvd3.nv-noData{font-size:18px;font-weight:700}.nv-brush .extent{fill-opacity:.125;shape-rendering:crispEdges}.nv-brush .resize path{fill:#eee;stroke:#666}.nvd3 .nv-legend .nv-series{cursor:pointer}.nvd3 .nv-legend .nv-disabled circle{fill-opacity:0}.nvd3 .nv-brush .extent{fill-opacity:0!important}.nvd3 .nv-brushBackground rect{stroke:#000;stroke-width:.4;fill:#fff;fill-opacity:.7}.nvd3.nv-ohlcBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive{stroke:#2ca02c}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative{stroke:#d62728}.nvd3 .background path{fill:none;stroke:#EEE;stroke-opacity:.4;shape-rendering:crispEdges}.nvd3 .foreground path{fill:none;stroke-opacity:.7}.nvd3 .nv-parallelCoordinates-brush .extent{fill:#fff;fill-opacity:.6;stroke:gray;shape-rendering:crispEdges}.nvd3 .nv-parallelCoordinates .hover{fill-opacity:1;stroke-width:3px}.nvd3 .missingValuesline line{fill:none;stroke:#000;stroke-width:1;stroke-opacity:1;stroke-dasharray:5,5}.nvd3.nv-pie path{stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-pie .nv-pie-title{font-size:24px;fill:rgba(19,196,249,.59)}.nvd3.nv-pie .nv-slice text{stroke:#000;stroke-width:0}.nvd3.nv-pie path{stroke:#fff;stroke-width:1px;stroke-opacity:1}.nvd3.nv-pie .hover path{fill-opacity:.7}.nvd3.nv-pie .nv-label{pointer-events:none}.nvd3.nv-pie .nv-label rect{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-groups .nv-point.hover{stroke-width:20px;stroke-opacity:.5}.nvd3 .nv-scatter .nv-point.hover{fill-opacity:1}.nv-noninteractive{pointer-events:none}.nv-distx,.nv-disty{pointer-events:none}.nvd3.nv-sparkline path{fill:none}.nvd3.nv-sparklineplus g.nv-hoverValue{pointer-events:none}.nvd3.nv-sparklineplus .nv-hoverValue line{stroke:#333;stroke-width:1.5px}.nvd3.nv-sparklineplus,.nvd3.nv-sparklineplus g{pointer-events:all}.nvd3 .nv-hoverArea{fill-opacity:0;stroke-opacity:0}.nvd3.nv-sparklineplus .nv-xValue,.nvd3.nv-sparklineplus .nv-yValue{stroke-width:0;font-size:.9em;font-weight:400}.nvd3.nv-sparklineplus .nv-yValue{stroke:#f66}.nvd3.nv-sparklineplus .nv-maxValue{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-sparklineplus .nv-minValue{stroke:#d62728;fill:#d62728}.nvd3.nv-sparklineplus .nv-currentValue{font-weight:700;font-size:1.1em}.nvd3.nv-stackedarea path.nv-area{fill-opacity:.7;stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-stackedarea path.nv-area.hover{fill-opacity:.9}.nvd3.nv-stackedarea .nv-groups .nv-point{stroke-opacity:0;fill-opacity:0}.nvtooltip{position:absolute;background-color:rgba(255,255,255,1);color:rgba(0,0,0,1);padding:1px;border:1px solid rgba(0,0,0,.2);z-index:10000;display:block;font-family:Arial;font-size:13px;text-align:left;pointer-events:none;white-space:nowrap;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.nvtooltip{background:rgba(255,255,255,.8);border:1px solid rgba(0,0,0,.5);border-radius:4px}.nvtooltip.with-transitions,.with-transitions .nvtooltip{transition:opacity 50ms linear;-moz-transition:opacity 50ms linear;-webkit-transition:opacity 50ms linear;transition-delay:200ms;-moz-transition-delay:200ms;-webkit-transition-delay:200ms}.nvtooltip.x-nvtooltip,.nvtooltip.y-nvtooltip{padding:8px}.nvtooltip h3{margin:0;padding:4px 14px;line-height:18px;font-weight:400;background-color:rgba(247,247,247,.75);color:rgba(0,0,0,1);text-align:center;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.nvtooltip p{margin:0;padding:5px 14px;text-align:center}.nvtooltip span{display:inline-block;margin:2px 0}.nvtooltip table{margin:6px;border-spacing:0}.nvtooltip table td{padding:2px 9px 2px 0;vertical-align:middle}.nvtooltip table td.key{font-weight:400}.nvtooltip table td.value{text-align:right;font-weight:700}.nvtooltip table tr.highlight td{padding:1px 9px 1px 0;border-bottom-style:solid;border-bottom-width:1px;border-top-style:solid;border-top-width:1px}.nvtooltip table td.legend-color-guide div{width:8px;height:8px;vertical-align:middle}.nvtooltip table td.legend-color-guide div{width:12px;height:12px;border:1px solid #999}.nvtooltip .footer{padding:3px;text-align:center}.nvtooltip-pending-removal{pointer-events:none;display:none}.nvd3 .nv-interactiveGuideLine{pointer-events:none}.nvd3 line.nv-guideline{stroke:#ccc} \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/style.css b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/style.css new file mode 100644 index 0000000..824fb31 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/css/style.css @@ -0,0 +1,122 @@ +body { + padding-top: 10px; +} + +.popover { + max-width: none; +} + +.glyphicon { + margin-right:.25em; +} + +.table-bordered>thead>tr>td { + border-bottom-width: 1px; +} + +.table tbody>tr>td, .table thead>tr>td { + padding-top: 3px; + padding-bottom: 3px; +} + +.table-condensed tbody>tr>td { + padding-top: 0; + padding-bottom: 0; +} + +.table .progress { + margin-bottom: inherit; +} + +.table-borderless th, .table-borderless td { + border: 0 !important; +} + +.table tbody tr.covered-by-large-tests, li.covered-by-large-tests, tr.success, td.success, li.success, span.success { + background-color: #dff0d8; +} + +.table tbody tr.covered-by-medium-tests, li.covered-by-medium-tests { + background-color: #c3e3b5; +} + +.table tbody tr.covered-by-small-tests, li.covered-by-small-tests { + background-color: #99cb84; +} + +.table tbody tr.danger, .table tbody td.danger, li.danger, span.danger { + background-color: #f2dede; +} + +.table tbody td.warning, li.warning, span.warning { + background-color: #fcf8e3; +} + +.table tbody td.info { + background-color: #d9edf7; +} + +td.big { + width: 117px; +} + +td.small { +} + +td.codeLine { + font-family: monospace; + white-space: pre; +} + +td span.comment { + color: #888a85; +} + +td span.default { + color: #2e3436; +} + +td span.html { + color: #888a85; +} + +td span.keyword { + color: #2e3436; + font-weight: bold; +} + +pre span.string { + color: #2e3436; +} + +span.success, span.warning, span.danger { + margin-right: 2px; + padding-left: 10px; + padding-right: 10px; + text-align: center; +} + +#classCoverageDistribution, #classComplexity { + height: 200px; + width: 475px; +} + +#toplink { + position: fixed; + left: 5px; + bottom: 5px; + outline: 0; +} + +svg text { + font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; + color: #666; + fill: #666; +} + +.scrollbox { + height:245px; + overflow-x:hidden; + overflow-y:scroll; +} diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist new file mode 100644 index 0000000..ed18988 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist @@ -0,0 +1,284 @@ + + + + + Dashboard for {{full_path}} + + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +

    Classes

    +
    +
    +
    +
    +

    Coverage Distribution

    +
    + +
    +
    +
    +

    Complexity

    +
    + +
    +
    +
    +
    +
    +

    Insufficient Coverage

    +
    + + + + + + + + +{{insufficient_coverage_classes}} + +
    ClassCoverage
    +
    +
    +
    +

    Project Risks

    +
    + + + + + + + + +{{project_risks_classes}} + +
    ClassCRAP
    +
    +
    +
    +
    +
    +

    Methods

    +
    +
    +
    +
    +

    Coverage Distribution

    +
    + +
    +
    +
    +

    Complexity

    +
    + +
    +
    +
    +
    +
    +

    Insufficient Coverage

    +
    + + + + + + + + +{{insufficient_coverage_methods}} + +
    MethodCoverage
    +
    +
    +
    +

    Project Risks

    +
    + + + + + + + + +{{project_risks_methods}} + +
    MethodCRAP
    +
    +
    +
    + +
    + + + + + + + + diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/directory.html.dist b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/directory.html.dist new file mode 100644 index 0000000..efe743f --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/directory.html.dist @@ -0,0 +1,61 @@ + + + + + Code Coverage for {{full_path}} + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + +{{items}} + +
     
    Code Coverage
     
    Lines
    Functions and Methods
    Classes and Traits
    + +
    + + + + + diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist new file mode 100644 index 0000000..78dbb35 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist @@ -0,0 +1,13 @@ + + {{icon}}{{name}} + {{lines_bar}} +
    {{lines_executed_percent}}
    +
    {{lines_number}}
    + {{methods_bar}} +
    {{methods_tested_percent}}
    +
    {{methods_number}}
    + {{classes_bar}} +
    {{classes_tested_percent}}
    +
    {{classes_number}}
    + + diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/file.html.dist b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/file.html.dist new file mode 100644 index 0000000..59a0684 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/file.html.dist @@ -0,0 +1,90 @@ + + + + + Code Coverage for {{full_path}} + + + + + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + +{{items}} + +
     
    Code Coverage
     
    Classes and Traits
    Functions and Methods
    Lines
    + + +{{lines}} + +
    + +
    + + + + + + diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.dist b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.dist new file mode 100644 index 0000000..756fdd6 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.dist @@ -0,0 +1,14 @@ + + {{name}} + {{classes_bar}} +
    {{classes_tested_percent}}
    +
    {{classes_number}}
    + {{methods_bar}} +
    {{methods_tested_percent}}
    +
    {{methods_number}}
    + {{crap}} + {{lines_bar}} +
    {{lines_executed_percent}}
    +
    {{lines_number}}
    + + diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.eot b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.ttf b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.js b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.js new file mode 100644 index 0000000..c8f82e5 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-mp.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/d3.min.js b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/d3.min.js new file mode 100644 index 0000000..34d5513 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/d3.min.js @@ -0,0 +1,5 @@ +!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function r(n){return null===n?0/0:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function c(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function l(){this._=Object.create(null)}function s(n){return(n+="")===pa||n[0]===va?va+n:n}function f(n){return(n+="")[0]===va?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=da.length;r>e;++e){var u=da[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function Z(n){return ya(n,Sa),n}function V(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var l=ka.get(n);return l&&(n=l,c=B),a?t?u:r:t?b:i}function $(n,t){return function(e){var r=ta.event;ta.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ta.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Aa,u="click"+r,i=ta.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ea&&(Ea="onselectstart"in e?!1:x(e.style,"userSelect")),Ea){var o=n(e).style,a=o[Ea];o[Ea]="none"}return function(n){if(i.on(r,null),Ea&&(o[Ea]=a),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Na){var i=t(n);if(i.scrollX||i.scrollY){r=ta.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Na=!(o.f||o.e),r.remove()}}return Na?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ta.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nt(n){return n>1?0:-1>n?qa:Math.acos(n)}function tt(n){return n>1?Ra:-1>n?-Ra:Math.asin(n)}function et(n){return((n=Math.exp(n))-1/n)/2}function rt(n){return((n=Math.exp(n))+1/n)/2}function ut(n){return((n=Math.exp(2*n))-1)/(n+1)}function it(n){return(n=Math.sin(n/2))*n}function ot(){}function at(n,t,e){return this instanceof at?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof at?new at(n.h,n.s,n.l):bt(""+n,_t,at):new at(n,t,e)}function ct(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,new mt(u(n+120),u(n),u(n-120))}function lt(n,t,e){return this instanceof lt?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof lt?new lt(n.h,n.c,n.l):n instanceof ft?gt(n.l,n.a,n.b):gt((n=wt((n=ta.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new lt(n,t,e)}function st(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new ft(e,Math.cos(n*=Da)*t,Math.sin(n)*t)}function ft(n,t,e){return this instanceof ft?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof ft?new ft(n.l,n.a,n.b):n instanceof lt?st(n.h,n.c,n.l):wt((n=mt(n)).r,n.g,n.b):new ft(n,t,e)}function ht(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=pt(u)*Xa,r=pt(r)*$a,i=pt(i)*Ba,new mt(dt(3.2404542*u-1.5371385*r-.4985314*i),dt(-.969266*u+1.8760108*r+.041556*i),dt(.0556434*u-.2040259*r+1.0572252*i))}function gt(n,t,e){return n>0?new lt(Math.atan2(e,t)*Pa,Math.sqrt(t*t+e*e),n):new lt(0/0,0/0,n)}function pt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function vt(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function dt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mt(n,t,e){return this instanceof mt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mt?new mt(n.r,n.g,n.b):bt(""+n,mt,ct):new mt(n,t,e)}function yt(n){return new mt(n>>16,n>>8&255,255&n)}function Mt(n){return yt(n)+""}function xt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function bt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(kt(u[0]),kt(u[1]),kt(u[2]))}return(i=Ga.get(n.toLowerCase()))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function _t(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),new at(r,u,c)}function wt(n,t,e){n=St(n),t=St(t),e=St(e);var r=vt((.4124564*n+.3575761*t+.1804375*e)/Xa),u=vt((.2126729*n+.7151522*t+.072175*e)/$a),i=vt((.0193339*n+.119192*t+.9503041*e)/Ba);return ft(116*u-16,500*(r-u),200*(u-i))}function St(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function kt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function Et(n){return"function"==typeof n?n:function(){return n}}function At(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Nt(t,e,n,r)}}function Nt(n,t,e,r){function u(){var n,t=c.status;if(!t&&zt(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return void o.error.call(i,r)}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=ta.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!this.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=ta.event;ta.event=n;try{o.progress.call(i,c)}finally{ta.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ra(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},ta.rebind(i,o,"on"),null==r?i:i.get(Ct(r))}function Ct(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function zt(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qt(){var n=Lt(),t=Tt()-n;t>24?(isFinite(t)&&(clearTimeout(tc),tc=setTimeout(qt,t)),nc=0):(nc=1,rc(qt))}function Lt(){var n=Date.now();for(ec=Ka;ec;)n>=ec.t&&(ec.f=ec.c(n-ec.t)),ec=ec.n;return n}function Tt(){for(var n,t=Ka,e=1/0;t;)t.f?t=n?n.n=t.n:Ka=t.n:(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Pt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],o=0,a=r[0],c=0;u>0&&a>0&&(c+a+1>t&&(a=Math.max(1,t-c)),i.push(n.substring(u-=a,u+a)),!((c+=a+1)>t));)a=r[o=(o+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=ic.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",c=e[4]||"",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===o)&&(l=r="0",o="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=oc.get(g)||Ut;var M=l&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>p){var c=ta.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!l&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===o?u+n+k:">"===o?k+u+n:"^"===o?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Ut(n){return n+""}function jt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Ft(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new cc(e-1)),1),e}function i(n,e){return t(n=new cc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{cc=jt;var r=new jt;return r._=n,o(r,t,e)}finally{cc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ht(n);return c.floor=c,c.round=Ht(r),c.ceil=Ht(u),c.offset=Ht(i),c.range=a,n}function Ht(n){return function(t,e){try{cc=jt;var r=new jt;return r._=t,n(r,e)._}finally{cc=Date}}}function Ot(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++aa;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=C[o in sc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.slice(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,N.c.toString(),t,r)}function c(n,t,r){return e(n,N.x.toString(),t,r)}function l(n,t,r){return e(n,N.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{cc=jt;var t=new cc;return t._=n,r(t)}finally{cc=Date}}var r=t(n);return e.parse=function(n){try{cc=jt;var t=r.parse(n);return t&&t._}finally{cc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ae;var M=ta.map(),x=Yt(v),b=Zt(v),_=Yt(d),w=Zt(d),S=Yt(m),k=Zt(m),E=Yt(y),A=Zt(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var N={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return It(n.getDate(),t,2)},e:function(n,t){return It(n.getDate(),t,2)},H:function(n,t){return It(n.getHours(),t,2)},I:function(n,t){return It(n.getHours()%12||12,t,2)},j:function(n,t){return It(1+ac.dayOfYear(n),t,3)},L:function(n,t){return It(n.getMilliseconds(),t,3)},m:function(n,t){return It(n.getMonth()+1,t,2)},M:function(n,t){return It(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return It(n.getSeconds(),t,2)},U:function(n,t){return It(ac.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return It(ac.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return It(n.getFullYear()%100,t,2)},Y:function(n,t){return It(n.getFullYear()%1e4,t,4)},Z:ie,"%":function(){return"%"}},C={a:r,A:u,b:i,B:o,c:a,d:Qt,e:Qt,H:te,I:te,j:ne,L:ue,m:Kt,M:ee,p:s,S:re,U:Xt,w:Vt,W:$t,x:c,X:l,y:Wt,Y:Bt,Z:Jt,"%":oe};return t}function It(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Yt(n){return new RegExp("^(?:"+n.map(ta.requote).join("|")+")","i")}function Zt(n){for(var t=new l,e=-1,r=n.length;++e68?1900:2e3)}function Kt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Qt(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function ne(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function te(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ee(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function re(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ue(n,t,e){fc.lastIndex=0;var r=fc.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ie(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=ga(t)/60|0,u=ga(t)%60;return e+It(r,"0",2)+It(u,"0",2)}function oe(n,t,e){hc.lastIndex=0;var r=hc.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ae(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(a),h=s*o*Math.sin(a);yc.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;Mc.point=function(o,a){Mc.point=n,r=(t=o)*Da,u=Math.cos(a=(e=a)*Da/2+qa/4),i=Math.sin(a)},Mc.lineEnd=function(){n(t,e)}}function pe(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function ve(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function de(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function me(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ye(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Me(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function xe(n){return[Math.atan2(n[1],n[0]),tt(n[2])]}function be(n,t){return ga(n[0]-t[0])a;++a)u.point((e=n[a])[0],e[1]);return void u.lineEnd()}var c=new qe(e,n,null,!0),l=new qe(e,null,c,!1);c.o=l,i.push(c),o.push(l),c=new qe(r,n,null,!1),l=new qe(r,null,c,!0),c.o=l,i.push(c),o.push(l)}}),o.sort(t),ze(i),ze(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,l=s.length;l>a;++a)u.point((f=s[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var a=s.length-1;a>=0;--a)u.point((f=s[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function ze(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r0){for(b||(i.polygonStart(),b=!0),i.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Te))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=ta.merge(g);var n=Fe(m,p);g.length?(b||(i.polygonStart(),b=!0),Ce(g,De,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Re(),x=t(M),b=!1;return y}}function Te(n){return n.length>1}function Re(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function De(n,t){return((n=n.x)[0]<0?n[1]-Ra-Ca:Ra-n[1])-((t=t.x)[0]<0?t[1]-Ra-Ca:Ra-t[1])}function Pe(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?qa:-qa,c=ga(i-e);ga(c-qa)0?Ra:-Ra),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=qa&&(ga(e-u)Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function je(n,t,e,r){var u;if(null==n)u=e*Ra,r.point(-qa,u),r.point(0,u),r.point(qa,u),r.point(qa,0),r.point(qa,-u),r.point(0,-u),r.point(-qa,-u),r.point(-qa,0),r.point(-qa,u);else if(ga(n[0]-t[0])>Ca){var i=n[0]a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+qa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+qa/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>qa,k=p*M;if(yc.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*La:b,S^h>=e^m>=e){var E=de(pe(f),pe(n));Me(E);var A=de(u,E);Me(A);var N=(S^b>=0?-1:1)*tt(A[2]);(r>N||r===N&&(E[0]||E[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Ca>i||Ca>i&&0>yc)^1&o}function He(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?qa:-qa),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(be(e,g)||be(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&be(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=pe(n),u=pe(t),o=[1,0,0],a=de(r,u),c=ve(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=de(o,a),p=ye(o,f),v=ye(a,h);me(p,v);var d=g,m=ve(p,d),y=ve(d,d),M=m*m-y*(ve(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=ye(d,(-m-x)/y);if(me(b,p),b=xe(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(_=w,w=S,S=_);var A=S-w,N=ga(A-qa)A;if(!N&&k>E&&(_=k,k=E,E=_),C?N?k+E>0^b[1]<(ga(b[0]-w)qa^(w<=b[0]&&b[0]<=S)){var z=ye(d,(-m+x)/y);return me(z,p),[b,xe(z)]}}}function u(t,e){var r=o?n:qa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=ga(i)>Ca,c=gr(n,6*Da);return Le(t,e,c,o?[0,-n]:[-qa,n-qa])}function Oe(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,l=o.y,s=a.x,f=a.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function Ie(n,t,e,r){function u(r,u){return ga(r[0]-n)0?0:3:ga(r[0]-e)0?2:1:ga(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&Q(l,i,n)>0&&++t:i[1]<=r&&Q(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&a.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=0/0}function g(){v&&(p(y,M),x&&w&&A.rejoin(),v.push(A.buffer())),C.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Tc,Math.min(Tc,n)),t=Math.max(-Tc,Math.min(Tc,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};N(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,E=a,A=Re(),N=Oe(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=ta.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Ce(v,i,t,l,a),a.polygonEnd()),v=d=m=null}};return C}}function Ye(n){var t=0,e=qa/3,r=ir(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*qa/180,e=n[1]*qa/180):[t/qa*180,e/qa*180]},u}function Ze(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,tt((i-(n*n+e*e)*u*u)/(2*u))]},e}function Ve(){function n(n,t){Dc+=u*n-r*t,r=n,u=t}var t,e,r,u;Hc.point=function(i,o){Hc.point=n,t=r=i,e=u=o},Hc.lineEnd=function(){n(t,e)}}function Xe(n,t){Pc>n&&(Pc=n),n>jc&&(jc=n),Uc>t&&(Uc=t),t>Fc&&(Fc=t)}function $e(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Be(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Be(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Be(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function We(n,t){_c+=n,wc+=t,++Sc}function Je(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);kc+=o*(t+n)/2,Ec+=o*(e+r)/2,Ac+=o,We(t=n,e=r)}var t,e;Ic.point=function(r,u){Ic.point=n,We(t=r,e=u)}}function Ge(){Ic.point=We}function Ke(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);kc+=o*(r+n)/2,Ec+=o*(u+t)/2,Ac+=o,o=u*n-r*t,Nc+=o*(r+n),Cc+=o*(u+t),zc+=3*o,We(r=n,u=t)}var t,e,r,u;Ic.point=function(i,o){Ic.point=n,We(t=r=i,e=u=o)},Ic.lineEnd=function(){n(t,e)}}function Qe(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,La)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function nr(n){function t(n){return(a?r:e)(n)}function e(t){return rr(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=0/0,S.point=i,t.lineStart()}function i(e,r){var i=pe([e,r]),o=n(e,r);u(M,x,y,b,_,w,M=o[0],x=o[1],y=e,b=i[0],_=i[1],w=i[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c +},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,l,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=a+g,_=c+p,w=l+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),E=ga(ga(w)-1)i||ga((y*z+M*q)/x-.5)>.3||o>a*g+c*p+l*v)&&(u(t,e,r,a,c,l,N,C,E,b/=S,_/=S,w,d,m),m.point(N,C),u(N,C,E,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Da),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function tr(n){var t=nr(function(t,e){return n([t*Pa,e*Pa])});return function(n){return or(t(n))}}function er(n){this.stream=n}function rr(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ur(n){return ir(function(){return n})()}function ir(n){function t(n){return n=a(n[0]*Da,n[1]*Da),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Pa,n[1]*Pa]}function r(){a=Ae(o=lr(m,M,x),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=nr(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Lc,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=or(b(o,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Lc):He((w=+n)*Da),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Ie(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Da,d=n[1]%360*Da,r()):[v*Pa,d*Pa]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Da,M=n[1]%360*Da,x=n.length>2?n[2]%360*Da:0,r()):[m*Pa,M*Pa,x*Pa]},ta.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function or(n){return rr(n,function(t,e){n.point(t*Da,e*Da)})}function ar(n,t){return[n,t]}function cr(n,t){return[n>qa?n-La:-qa>n?n+La:n,t]}function lr(n,t,e){return n?t||e?Ae(fr(n),hr(t,e)):fr(n):t||e?hr(t,e):cr}function sr(n){return function(t,e){return t+=n,[t>qa?t-La:-qa>t?t+La:t,e]}}function fr(n){var t=sr(n);return t.invert=sr(-n),t}function hr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),tt(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),tt(s*r-a*u)]},e}function gr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=pr(e,u),i=pr(e,i),(o>0?i>u:u>i)&&(u+=o*La)):(u=n+o*La,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=xe([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function pr(n,t){var e=pe(t);e[0]-=n,Me(e);var r=nt(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function vr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function dr(n,t,e){var r=ta.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function mr(n){return n.source}function yr(n){return n.target}function Mr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(it(r-t)+u*o*it(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Pa,Math.atan2(o,Math.sqrt(r*r+u*u))*Pa]}:function(){return[n*Pa,t*Pa]};return p.distance=h,p}function xr(){function n(n,u){var i=Math.sin(u*=Da),o=Math.cos(u),a=ga((n*=Da)-t),c=Math.cos(a);Yc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Zc.point=function(u,i){t=u*Da,e=Math.sin(i*=Da),r=Math.cos(i),Zc.point=n},Zc.lineEnd=function(){Zc.point=Zc.lineEnd=b}}function br(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function _r(n,t){function e(n,t){o>0?-Ra+Ca>t&&(t=-Ra+Ca):t>Ra-Ca&&(t=Ra-Ca);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(qa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Ra]},e):Sr}function wr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return ga(u)u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function zr(n,t){return n[0]-t[0]||n[1]-t[1]}function qr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Lr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function Tr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Rr(){tu(this),this.edge=this.site=this.circle=null}function Dr(n){var t=el.pop()||new Rr;return t.site=n,t}function Pr(n){Xr(n),Qc.remove(n),el.push(n),tu(n)}function Ur(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Pr(n);for(var c=i;c.circle&&ga(e-c.circle.x)s;++s)l=a[s],c=a[s-1],Kr(l.edge,c.site,l.site,u);c=a[0],l=a[f-1],l.edge=Jr(c.site,l.site,null,u),Vr(c),Vr(l)}function jr(n){for(var t,e,r,u,i=n.x,o=n.y,a=Qc._;a;)if(r=Fr(a,o)-i,r>Ca)a=a.L;else{if(u=i-Hr(a,o),!(u>Ca)){r>-Ca?(t=a.P,e=a):u>-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Dr(n);if(Qc.insert(t,c),t||e){if(t===e)return Xr(t),e=Dr(t.site),Qc.insert(c,e),c.edge=e.edge=Jr(t.site,c.site),Vr(t),void Vr(e);if(!e)return void(c.edge=Jr(t.site,c.site));Xr(t),Xr(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};Kr(e.edge,l,p,x),c.edge=Jr(l,n,null,x),e.edge=Jr(n,p,null,x),Vr(t),Vr(e)}}function Fr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,l=c-t;if(!l)return a;var s=a-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+a)/2}function Hr(n,t){var e=n.N;if(e)return Fr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Or(n){this.site=n,this.edges=[]}function Ir(n){for(var t,e,r,u,i,o,a,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Kc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)s=a[o].end(),r=s.x,u=s.y,l=a[++o%c].start(),t=l.x,e=l.y,(ga(r-t)>Ca||ga(u-e)>Ca)&&(a.splice(o,0,new Qr(Gr(i.site,s,ga(r-f)Ca?{x:f,y:ga(t-f)Ca?{x:ga(e-p)Ca?{x:h,y:ga(t-h)Ca?{x:ga(e-g)=-za)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+a,m=rl.pop()||new Zr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=tl._;M;)if(m.yd||d>=a)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.yg){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.xi||f>o||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(c>m){var y=Math.sqrt(c=m);r=t-y,u=e-y,i=t+y,o=e+y,a=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:l(n,s,f,x,b);break;case 1:l(n,x,f,h,b);break;case 2:l(n,s,b,x,g);break;case 3:l(n,x,b,h,g)}}}(n,r,u,i,o),a}function gu(n,t){n=ta.rgb(n),t=ta.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+xt(Math.round(e+i*n))+xt(Math.round(r+o*n))+xt(Math.round(u+a*n))}}function pu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=mu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function vu(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function du(n,t){var e,r,u,i=il.lastIndex=ol.lastIndex=0,o=-1,a=[],c=[];for(n+="",t+="";(e=il.exec(n))&&(r=ol.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:vu(e,r)})),i=ol.lastIndex;return ir;++r)a[(e=c[r]).i]=e.x(n);return a.join("")})}function mu(n,t){for(var e,r=ta.interpolators.length;--r>=0&&!(e=ta.interpolators[r](n,t)););return e}function yu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(mu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Mu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function xu(n){return function(t){return 1-n(1-t)}}function bu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function _u(n){return n*n}function wu(n){return n*n*n}function Su(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function ku(n){return function(t){return Math.pow(t,n)}}function Eu(n){return 1-Math.cos(n*Ra)}function Au(n){return Math.pow(2,10*(n-1))}function Nu(n){return 1-Math.sqrt(1-n*n)}function Cu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/La*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*La/t)}}function zu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function qu(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Lu(n,t){n=ta.hcl(n),t=ta.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return st(e+i*n,r+o*n,u+a*n)+""}}function Tu(n,t){n=ta.hsl(n),t=ta.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ct(e+i*n,r+o*n,u+a*n)+""}}function Ru(n,t){n=ta.lab(n),t=ta.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ht(e+i*n,r+o*n,u+a*n)+""}}function Du(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Pu(n){var t=[n.a,n.b],e=[n.c,n.d],r=ju(t),u=Uu(t,e),i=ju(Fu(e,t,-u))||0;t[0]*e[1]180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:vu(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:vu(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:vu(g[0],p[0])},{i:e-2,x:vu(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i=0;)e.push(u[r])}function Qu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,o=-1;++oe;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function si(n){return n.reduce(fi,0)}function fi(n,t){return n+t[1]}function hi(n,t){return gi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function gi(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function pi(n){return[ta.min(n),ta.max(n)]}function vi(n,t){return n.value-t.value}function di(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function mi(n,t){n._pack_next=t,t._pack_prev=n}function yi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Mi(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(xi),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],wi(r,u,i),t(i),di(r,i),r._pack_prev=i,di(i,u),u=r._pack_next,o=3;l>o;o++){wi(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(yi(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!yi(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.ro;o++)i=e[o],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(bi)}}function xi(n){n._pack_next=n._pack_prev=n}function bi(n){delete n._pack_next,delete n._pack_prev}function _i(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Ci(n,t,e){return n.a.parent===t.parent?n.a:e}function zi(n){return 1+ta.max(n,function(n){return n.y})}function qi(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Li(n){var t=n.children;return t&&t.length?Li(t[0]):n}function Ti(n){var t,e=n.children;return e&&(t=e.length)?Ti(e[t-1]):n}function Ri(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Di(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Pi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ui(n){return n.rangeExtent?n.rangeExtent():Pi(n.range())}function ji(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Fi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Hi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ml}function Oi(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?Oi:ji,c=r?Iu:Ou;return o=u(n,t,c,e),a=u(t,n,c,mu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Du)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Xi(n,t)},i.tickFormat=function(t,e){return $i(n,t,e)},i.nice=function(t){return Zi(n,t),u()},i.copy=function(){return Ii(n,t,e,r)},u()}function Yi(n,t){return ta.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Zi(n,t){return Fi(n,Hi(Vi(n,t)[2]))}function Vi(n,t){null==t&&(t=10);var e=Pi(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Xi(n,t){return ta.range.apply(ta,Vi(n,t))}function $i(n,t,e){var r=Vi(n,t);if(e){var u=ic.exec(e);if(u.shift(),"s"===u[8]){var i=ta.formatPrefix(Math.max(ga(r[0]),ga(r[1])));return u[7]||(u[7]="."+Bi(i.scale(r[2]))),u[8]="f",e=ta.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Wi(u[8],r)),e=u.join("")}else e=",."+Bi(r[2])+"f";return ta.format(e)}function Bi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Wi(n,t){var e=Bi(t[2]);return n in yl?Math.abs(e-Bi(Math.max(ga(t[0]),ga(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Ji(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Fi(r.map(u),e?Math:xl);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Pi(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++0;h--)o.push(i(l)*h);for(l=0;o[l]c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return Ml;arguments.length<2?t=Ml:"function"!=typeof t&&(t=ta.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Ji(n.copy(),t,e,r)},Yi(o,n)}function Gi(n,t,e){function r(t){return n(u(t))}var u=Ki(t),i=Ki(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Xi(e,n)},r.tickFormat=function(n,t){return $i(e,n,t)},r.nice=function(n){return r.domain(Zi(e,n))},r.exponent=function(o){return arguments.length?(u=Ki(t=o),i=Ki(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Gi(n.copy(),t,e)},Yi(r,n)}function Ki(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Qi(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return ta.range(n.length).map(function(n){return t+e*n})}var u,i,o;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new l;for(var i,o=-1,a=r.length;++oe?[0/0,0/0]:[e>0?a[e-1]:n[0],et?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return to(n,t,e)},u()}function eo(n,t){function e(e){return e>=e?t[ta.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return eo(n,t)},e}function ro(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Xi(n,t)},t.tickFormat=function(t,e){return $i(n,t,e)},t.copy=function(){return ro(n)},t}function uo(){return 0}function io(n){return n.innerRadius}function oo(n){return n.outerRadius}function ao(n){return n.startAngle}function co(n){return n.endAngle}function lo(n){return n&&n.padAngle}function so(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function fo(n,t,e,r,u){var i=n[0]-t[0],o=n[1]-t[1],a=(u?r:-r)/Math.sqrt(i*i+o*o),c=a*o,l=-a*i,s=n[0]+c,f=n[1]+l,h=t[0]+c,g=t[1]+l,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(M*M*y-x*x),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,E=_-p,A=w-v,N=S-p,C=k-v;return E*E+A*A>N*N+C*C&&(_=S,w=k),[[_-c,w-l],[_*e/M,w*e/M]]}function ho(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=Et(e),p=Et(r);++f1&&u.push("H",r[0]),u.join("")}function mo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function To(n){return n.length<3?go(n):n[0]+_o(n,Lo(n))}function Ro(n){for(var t,e,r,u=-1,i=n.length;++ur)return s();var u=i[i.active];u&&(--i.count,delete i[i.active],u.event&&u.event.interrupt.call(n,n.__data__,u.index)),i.active=r,o.event&&o.event.start.call(n,n.__data__,t),o.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&v.push(r)}),h=o.ease,f=o.duration,ta.timer(function(){return p.c=l(e||1)?Ne:l,1},0,a)}function l(e){if(i.active!==r)return 1;for(var u=e/f,a=h(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,n.__data__,t),s()):void 0}function s(){return--i.count?delete i[r]:delete n[e],1}var f,h,g=o.delay,p=ec,v=[];return p.t=g+a,u>=g?c(u-g):void(p.c=c)},0,a)}}function Bo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function Wo(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function Jo(n){return n.toISOString()}function Go(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=ta.bisect(Vl,u);return i==Vl.length?[t.year,Vi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Vl[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=Ko(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Ko(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Pi(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Ko(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Go(n.copy(),t,e)},Yi(r,n)}function Ko(n){return new Date(n)}function Qo(n){return JSON.parse(n.responseText)}function na(n){var t=ua.createRange();return t.selectNode(ua.body),t.createContextualFragment(n.responseText)}var ta={version:"3.5.5"},ea=[].slice,ra=function(n){return ea.call(n)},ua=this.document;if(ua)try{ra(ua.documentElement.childNodes)[0].nodeType}catch(ia){ra=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),ua)try{ua.createElement("DIV").style.setProperty("opacity",0,"")}catch(oa){var aa=this.Element.prototype,ca=aa.setAttribute,la=aa.setAttributeNS,sa=this.CSSStyleDeclaration.prototype,fa=sa.setProperty;aa.setAttribute=function(n,t){ca.call(this,n,t+"")},aa.setAttributeNS=function(n,t,e){la.call(this,n,t,e+"")},sa.setProperty=function(n,t,e){fa.call(this,n,t+"",e)}}ta.ascending=e,ta.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},ta.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ur&&(e=r)}else{for(;++u=r){e=r;break}for(;++ur&&(e=r)}return e},ta.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ue&&(e=r)}else{for(;++u=r){e=r;break}for(;++ue&&(e=r)}return e},ta.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},ta.sum=function(n,t){var e,r=0,i=n.length,o=-1;if(1===arguments.length)for(;++o1?c/(s-1):void 0},ta.deviation=function(){var n=ta.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ha=i(e);ta.bisectLeft=ha.left,ta.bisect=ta.bisectRight=ha.right,ta.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},ta.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},ta.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ta.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},ta.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=ta.min(arguments,o),e=new Array(t);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var ga=Math.abs;ta.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=a(ga(e)),o=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++o)>t;)u.push(r/i);else for(;(r=n+e*++o)=i.length)return r?r.call(u,o):e?o.sort(e):o;for(var c,s,f,h,g=-1,p=o.length,v=i[a++],d=new l;++g=i.length)return n;var r=[],u=o[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],o=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(ta.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return o[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},ta.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},c(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),ta.behavior={},ta.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ta.event=null,ta.requote=function(n){return n.replace(ma,"\\$&")};var ma=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ya={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},Ma=function(n,t){return t.querySelector(n)},xa=function(n,t){return t.querySelectorAll(n)},ba=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(ba=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(Ma=function(n,t){return Sizzle(n,t)[0]||null},xa=Sizzle,ba=Sizzle.matchesSelector),ta.selection=function(){return ta.select(ua.documentElement)};var _a=ta.selection.prototype=[];_a.select=function(n){var t,e,r,u,i=[];n=N(n);for(var o=-1,a=this.length;++o=0&&(e=n.slice(0,t),n=n.slice(t+1)),wa.hasOwnProperty(e)?{space:wa[e],local:n}:n}},_a.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ta.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},_a.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++uu){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},_a.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},_a.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},_a.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},_a.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},_a.insert=function(n,t){return n=j(n),t=N(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},_a.remove=function(){return this.each(F)},_a.data=function(n,t){function e(n,e){var r,u,i,o=n.length,f=e.length,h=Math.min(o,f),g=new Array(f),p=new Array(f),v=new Array(o);if(t){var d,m=new l,y=new Array(o);for(r=-1;++rr;++r)p[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,a.push(p),c.push(g),s.push(v)}var r,u,i=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++ii;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return A(u)},_a.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},_a.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},_a.size=function(){var n=0;return Y(this,function(){++n}),n};var Sa=[];ta.selection.enter=Z,ta.selection.enter.prototype=Sa,Sa.append=_a.append,Sa.empty=_a.empty,Sa.node=_a.node,Sa.call=_a.call,Sa.size=_a.size,Sa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var ka=ta.map({mouseenter:"mouseover",mouseleave:"mouseout"});ua&&ka.forEach(function(n){"on"+n in ua&&ka.remove(n)});var Ea,Aa=0;ta.mouse=function(n){return J(n,k())};var Na=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ta.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},ta.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",o)}function e(n,t,e,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&ta.event.target===f),g({type:"dragend"}))}var l,s=this,f=ta.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=ta.select(e(f)).on(i+d,a).on(o+d,c),y=W(f),M=t(h,v);u?(l=u.apply(s,arguments),l=[l.x-M[0],l.y-M[1]]):l=[0,0],g({type:"dragstart"})}}var r=E(n,"drag","dragstart","dragend"),u=null,i=e(b,ta.mouse,t,"mousemove","mouseup"),o=e(G,ta.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},ta.rebind(n,r,"on")},ta.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ra(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Ca=1e-6,za=Ca*Ca,qa=Math.PI,La=2*qa,Ta=La-Ca,Ra=qa/2,Da=qa/180,Pa=180/qa,Ua=Math.SQRT2,ja=2,Fa=4;ta.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=rt(v),o=i/(ja*h)*(e*ut(Ua*t+v)-et(v));return[r+o*l,u+o*s,i*e/rt(Ua*t+v)]}return[r+n*l,u+n*s,i*Math.exp(Ua*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Fa*f)/(2*i*ja*h),p=(c*c-i*i-Fa*f)/(2*c*ja*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Ua;return e.duration=1e3*y,e},ta.behavior.zoom=function(){function n(n){n.on(q,f).on(Oa+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(N[0],Math.min(N[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,o)),i(d=e,r),t=ta.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function c(n){z++||n({type:"zoomstart"})}function l(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||n({type:"zoomend"}),d=null}function f(){function n(){f=1,i(ta.mouse(u),g),l(a)}function r(){h.on(L,null).on(T,null),p(f&&ta.event.target===o),s(a)}var u=this,o=ta.event.target,a=D.of(u,arguments),f=0,h=ta.select(t(u)).on(L,n).on(T,r),g=e(ta.mouse(u)),p=W(u);Dl.call(u),c(a)}function h(){function n(){var n=ta.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ta.event.target;ta.select(t).on(x,r).on(b,a),_.push(t);for(var e=ta.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var c=n(),l=Date.now();if(1===c.length){if(500>l-M){var s=c[0];o(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=l}else if(c.length>1){var s=c[0],f=c[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,o=ta.touches(p);Dl.call(p);for(var a=0,c=o.length;c>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),l(v)}function a(){if(ta.event.touches.length){for(var t=ta.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}ta.selectAll(_).on(y,null),w.on(q,f).on(R,h),E(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+ta.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=ta.select(p),E=W(p);t(),c(v),w.on(q,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(v=e(d=m||ta.mouse(this)),Dl.call(this),c(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Ha())*k.k),i(d,v),l(n)}function p(){var n=ta.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ta.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},A=[960,500],N=Ia,C=250,z=0,q="mousedown.zoom",L="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=E(n,"zoomstart","zoom","zoomend");return Oa||(Oa="onwheel"in ua?(Ha=function(){return-ta.event.deltaY*(ta.event.deltaMode?120:1)},"wheel"):"onmousewheel"in ua?(Ha=function(){return ta.event.wheelDelta},"mousewheel"):(Ha=function(){return-ta.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Tl?ta.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},c(n)}).tween("zoom:zoom",function(){var e=A[0],r=A[1],u=d?d[0]:e/2,i=d?d[1]:r/2,o=ta.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:u-r[0]*a,y:i-r[1]*a,k:a},l(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,c(n),l(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:+t},a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(N=null==t?Ia:[+t[0],+t[1]],n):N},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(A=t&&[+t[0],+t[1]],n):A},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ta.rebind(n,D,"on")};var Ha,Oa,Ia=[0,1/0];ta.color=ot,ot.prototype.toString=function(){return this.rgb()+""},ta.hsl=at;var Ya=at.prototype=new ot;Ya.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,this.l/n)},Ya.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new at(this.h,this.s,n*this.l)},Ya.rgb=function(){return ct(this.h,this.s,this.l)},ta.hcl=lt;var Za=lt.prototype=new ot;Za.brighter=function(n){return new lt(this.h,this.c,Math.min(100,this.l+Va*(arguments.length?n:1)))},Za.darker=function(n){return new lt(this.h,this.c,Math.max(0,this.l-Va*(arguments.length?n:1)))},Za.rgb=function(){return st(this.h,this.c,this.l).rgb()},ta.lab=ft;var Va=18,Xa=.95047,$a=1,Ba=1.08883,Wa=ft.prototype=new ot;Wa.brighter=function(n){return new ft(Math.min(100,this.l+Va*(arguments.length?n:1)),this.a,this.b)},Wa.darker=function(n){return new ft(Math.max(0,this.l-Va*(arguments.length?n:1)),this.a,this.b)},Wa.rgb=function(){return ht(this.l,this.a,this.b)},ta.rgb=mt;var Ja=mt.prototype=new ot;Ja.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new mt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mt(u,u,u)},Ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mt(n*this.r,n*this.g,n*this.b)},Ja.hsl=function(){return _t(this.r,this.g,this.b)},Ja.toString=function(){return"#"+xt(this.r)+xt(this.g)+xt(this.b)};var Ga=ta.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Ga.forEach(function(n,t){Ga.set(n,yt(t))}),ta.functor=Et,ta.xhr=At(y),ta.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=Nt(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==c)continue;return n.slice(t,s-a)}return n.slice(t)}for(var r,u,i={},o={},a=[],l=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,f++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},ta.csv=ta.dsv(",","text/csv"),ta.tsv=ta.dsv(" ","text/tab-separated-values");var Ka,Qa,nc,tc,ec,rc=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ta.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Qa?Qa.n=i:Ka=i,Qa=i,nc||(tc=clearTimeout(tc),nc=1,rc(qt))},ta.timer.flush=function(){Lt(),Tt()},ta.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var uc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Dt);ta.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=ta.round(n,Rt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),uc[8+e/3]};var ic=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,oc=ta.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ta.round(n,Rt(n,t))).toFixed(Math.max(0,Math.min(20,Rt(n*(1+1e-15),t))))}}),ac=ta.time={},cc=Date;jt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){lc.setUTCDate.apply(this._,arguments)},setDay:function(){lc.setUTCDay.apply(this._,arguments)},setFullYear:function(){lc.setUTCFullYear.apply(this._,arguments)},setHours:function(){lc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){lc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){lc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){lc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){lc.setUTCSeconds.apply(this._,arguments)},setTime:function(){lc.setTime.apply(this._,arguments)}};var lc=Date.prototype;ac.year=Ft(function(n){return n=ac.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ac.years=ac.year.range,ac.years.utc=ac.year.utc.range,ac.day=Ft(function(n){var t=new cc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ac.days=ac.day.range,ac.days.utc=ac.day.utc.range,ac.dayOfYear=function(n){var t=ac.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ac[n]=Ft(function(n){return(n=ac.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ac[n+"s"]=e.range,ac[n+"s"].utc=e.utc.range,ac[n+"OfYear"]=function(n){var e=ac.year(n).getDay();return Math.floor((ac.dayOfYear(n)+(e+t)%7)/7)}}),ac.week=ac.sunday,ac.weeks=ac.sunday.range,ac.weeks.utc=ac.sunday.utc.range,ac.weekOfYear=ac.sundayOfYear;var sc={"-":"",_:" ",0:"0"},fc=/^\s*\d+/,hc=/^%/;ta.locale=function(n){return{numberFormat:Pt(n),timeFormat:Ot(n)}};var gc=ta.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ta.format=gc.numberFormat,ta.geo={},ce.prototype={s:0,t:0,add:function(n){le(n,this.t,pc),le(pc.s,this.s,this),this.s?this.t+=pc.t:this.s=pc.t +},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var pc=new ce;ta.geo.stream=function(n,t){n&&vc.hasOwnProperty(n.type)?vc[n.type](n,t):se(n,t)};var vc={Feature:function(n,t){se(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*qa+n:n,Mc.lineStart=Mc.lineEnd=Mc.point=b}};ta.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=pe([t*Da,e*Da]);if(m){var u=de(m,r),i=[u[1],-u[0],0],o=de(i,u);Me(o),o=xe(o);var c=t-p,l=c>0?1:-1,v=o[0]*Pa*l,d=ga(c)>180;if(d^(v>l*p&&l*t>v)){var y=o[1]*Pa;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-o[1]*Pa;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=ga(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Mc.point(n,e),t(n,e)}function i(){Mc.lineStart()}function o(){u(v,d),Mc.lineEnd(),ga(y)>Ca&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nyc?(s=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],ta.geo.stream(n,b);var t=M.length;if(t){M.sort(c);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])}return M=x=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),ta.geo.centroid=function(n){xc=bc=_c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,qc);var t=Nc,e=Cc,r=zc,u=t*t+e*e+r*r;return za>u&&(t=kc,e=Ec,r=Ac,Ca>bc&&(t=_c,e=wc,r=Sc),u=t*t+e*e+r*r,za>u)?[0/0,0/0]:[Math.atan2(e,t)*Pa,tt(r/Math.sqrt(u))*Pa]};var xc,bc,_c,wc,Sc,kc,Ec,Ac,Nc,Cc,zc,qc={sphere:b,point:_e,lineStart:Se,lineEnd:ke,polygonStart:function(){qc.lineStart=Ee},polygonEnd:function(){qc.lineStart=Se}},Lc=Le(Ne,Pe,je,[-qa,-qa/2]),Tc=1e9;ta.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Ie(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ta.geo.conicEqualArea=function(){return Ye(Ze)}).raw=Ze,ta.geo.albers=function(){return ta.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ta.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=ta.geo.albers(),o=ta.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ta.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ca,f+.12*l+Ca],[s-.214*l-Ca,f+.234*l-Ca]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ca,f+.166*l+Ca],[s-.115*l-Ca,f+.234*l-Ca]]).stream(c).point,n},n.scale(1070)};var Rc,Dc,Pc,Uc,jc,Fc,Hc={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Dc=0,Hc.lineStart=Ve},polygonEnd:function(){Hc.lineStart=Hc.lineEnd=Hc.point=b,Rc+=ga(Dc/2)}},Oc={point:Xe,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Ic={point:We,lineStart:Je,lineEnd:Ge,polygonStart:function(){Ic.lineStart=Ke},polygonEnd:function(){Ic.point=We,Ic.lineStart=Je,Ic.lineEnd=Ge}};ta.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),ta.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Rc=0,ta.geo.stream(n,u(Hc)),Rc},n.centroid=function(n){return _c=wc=Sc=kc=Ec=Ac=Nc=Cc=zc=0,ta.geo.stream(n,u(Ic)),zc?[Nc/zc,Cc/zc]:Ac?[kc/Ac,Ec/Ac]:Sc?[_c/Sc,wc/Sc]:[0/0,0/0]},n.bounds=function(n){return jc=Fc=-(Pc=Uc=1/0),ta.geo.stream(n,u(Oc)),[[Pc,Uc],[jc,Fc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||tr(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new $e:new Qe(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(ta.geo.albersUsa()).context(null)},ta.geo.transform=function(n){return{stream:function(t){var e=new er(t);for(var r in n)e[r]=n[r];return e}}},er.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ta.geo.projection=ur,ta.geo.projectionMutator=ir,(ta.geo.equirectangular=function(){return ur(ar)}).raw=ar.invert=ar,ta.geo.rotation=function(n){function t(t){return t=n(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t}return n=lr(n[0]%360*Da,n[1]*Da,n.length>2?n[2]*Da:0),t.invert=function(t){return t=n.invert(t[0]*Da,t[1]*Da),t[0]*=Pa,t[1]*=Pa,t},t},cr.invert=ar,ta.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=lr(-n[0]*Da,-n[1]*Da,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Pa,n[1]*=Pa}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=gr((t=+r)*Da,u*Da),n):t},n.precision=function(r){return arguments.length?(e=gr(t*Da,(u=+r)*Da),n):u},n.angle(90)},ta.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Da,u=n[1]*Da,i=t[1]*Da,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},ta.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ta.range(Math.ceil(i/d)*d,u,d).map(h).concat(ta.range(Math.ceil(l/m)*m,c,m).map(g)).concat(ta.range(Math.ceil(r/p)*p,e,p).filter(function(n){return ga(n%d)>Ca}).map(s)).concat(ta.range(Math.ceil(a/v)*v,o,v).filter(function(n){return ga(n%m)>Ca}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=vr(a,o,90),f=dr(r,e,y),h=vr(l,c,90),g=dr(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},ta.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=mr,u=yr;return n.distance=function(){return ta.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},ta.geo.interpolate=function(n,t){return Mr(n[0]*Da,n[1]*Da,t[0]*Da,t[1]*Da)},ta.geo.length=function(n){return Yc=0,ta.geo.stream(n,Zc),Yc};var Yc,Zc={sphere:b,point:b,lineStart:xr,lineEnd:b,polygonStart:b,polygonEnd:b},Vc=br(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ta.geo.azimuthalEqualArea=function(){return ur(Vc)}).raw=Vc;var Xc=br(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(ta.geo.azimuthalEquidistant=function(){return ur(Xc)}).raw=Xc,(ta.geo.conicConformal=function(){return Ye(_r)}).raw=_r,(ta.geo.conicEquidistant=function(){return Ye(wr)}).raw=wr;var $c=br(function(n){return 1/n},Math.atan);(ta.geo.gnomonic=function(){return ur($c)}).raw=$c,Sr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ra]},(ta.geo.mercator=function(){return kr(Sr)}).raw=Sr;var Bc=br(function(){return 1},Math.asin);(ta.geo.orthographic=function(){return ur(Bc)}).raw=Bc;var Wc=br(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ta.geo.stereographic=function(){return ur(Wc)}).raw=Wc,Er.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ra]},(ta.geo.transverseMercator=function(){var n=kr(Er),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Er,ta.geom={},ta.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=Et(e),i=Et(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(zr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var l=Cr(a),s=Cr(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[a[l[t]][2]]);for(t=+f;t=r&&l.x<=i&&l.y>=u&&l.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];s.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ar,u=Nr,i=r,o=u,a=ul;return n?t(n):(t.links=function(n){return iu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return iu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Yr),c=-1,l=a.length,s=a[l-1].edge,f=s.l===o?s.r:s.l;++c=l,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=su()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,v,d,m,y,M=Et(a),x=Et(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.xm&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=su();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){fu(n,k,v,d,m,y)},k.find=function(n){return hu(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=cl.get(e)||al,r=ll.get(r)||y,Mu(r(e.apply(null,ea.call(arguments,1))))},ta.interpolateHcl=Lu,ta.interpolateHsl=Tu,ta.interpolateLab=Ru,ta.interpolateRound=Du,ta.transform=function(n){var t=ua.createElementNS(ta.ns.prefix.svg,"g");return(ta.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Pu(e?e.matrix:sl)})(n)},Pu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var sl={a:1,b:0,c:0,d:1,e:0,f:0};ta.interpolateTransform=Hu,ta.layout={},ta.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=o*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=o*l}}return!t.charge}}function t(n){n.px=ta.event.x,n.py=ta.event.y,a.resume()}var e,r,u,i,o,a={},c=ta.dispatch("start","tick","end"),l=[1,1],s=.9,f=fl,h=hl,g=-30,p=gl,v=.1,d=.64,m=[],M=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,y,x,b=m.length,_=M.length;for(e=0;_>e;++e)a=M[e],f=a.source,h=a.target,y=h.x-f.x,x=h.y-f.y,(p=y*y+x*x)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,y*=p,x*=p,h.x-=y*(d=f.weight/(h.weight+f.weight)),h.y-=x*d,f.x+=y*(d=1-d),f.y+=x*d);if((d=r*v)&&(y=l[0]/2,x=l[1]/2,e=-1,d))for(;++e0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),ta.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=M[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,l=o.length;++at;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=M[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,M[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,M[t],t);else for(t=0;s>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=ta.behavior.drag().origin(y).on("dragstart.force",Xu).on("drag.force",t).on("dragend.force",$u)),arguments.length?void this.on("mouseover.force",Bu).on("mouseout.force",Wu).call(e):e},ta.rebind(a,c,"on")};var fl=20,hl=1,gl=1/0;ta.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)o.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return Qu(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),a}var t=ei,e=ni,r=ti;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Ku(t,function(n){n.children&&(n.value=0)}),Qu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ta.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++lf?-1:1),p=(f-c*g)/ta.sum(l),v=ta.range(c),d=[];return null!=e&&v.sort(e===pl?function(n,t){return l[t]-l[n]}:function(n,t){return e(o[n],o[t])}),v.forEach(function(n){d[n]={data:o[n],value:a=l[n],startAngle:s,endAngle:s+=a*p+g,padAngle:h}}),d}var t=Number,e=pl,r=0,u=La,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var pl={};ta.layout.stack=function(){function n(a,c){if(!(h=a.length))return a;var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=ta.permute(l,f),s=ta.permute(s,f);var h,g,p,v,d=r.call(n,s,c),m=l[0].length;for(p=0;m>p;++p)for(u.call(n,l[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,l[g][p],v+=s[g-1][p][1],s[g][p][1]);return a}var t=y,e=ai,r=ci,u=oi,i=ui,o=ii;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:vl.get(t)||ai,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:dl.get(t)||ci,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var vl=ta.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(li),i=n.map(si),o=ta.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return ta.range(n.length).reverse()},"default":ai}),dl=ta.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ci});ta.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=s[0]&&a<=s[1]&&(o=c[ta.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=pi,u=hi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=Et(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return gi(n,t)}:Et(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ta.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Qu(a,function(n){n.r=+s(n.value)}),Qu(a,Mi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Qu(a,function(n){n.r+=f}),Qu(a,Mi),Qu(a,function(n){n.r-=f})}return _i(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=ta.layout.hierarchy().sort(vi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Gu(n,e)},ta.layout.tree=function(){function n(n,u){var s=o.call(this,n,u),f=s[0],h=t(f);if(Qu(h,e),h.parent.m=-h.z,Ku(h,r),l)Ku(f,i);else{var g=f,p=f,v=f;Ku(f,function(n){n.xp.x&&(p=n),n.depth>v.depth&&(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);Ku(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,o=0,a=i.length;a>o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Ni(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],l=u.m,s=i.m,f=o.m,h=c.m;o=Ei(o),u=ki(u),o&&u;)c=ki(c),i=Ei(i),i.a=n,r=o.z+f-u.z-l+a(o._,u._),r>0&&(Ai(Ci(o,n,e),n,r),l+=r,s+=r),f+=o.m,l+=u.m,h+=c.m,s+=i.m;o&&!Ei(i)&&(i.t=o,i.m+=f-s),u&&!ki(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=ta.layout.hierarchy().sort(null).value(null),a=Si,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},Gu(n,o)},ta.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Qu(c,function(n){var t=n.children;t&&t.length?(n.x=qi(t),n.y=zi(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Li(c),f=Ti(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Qu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=ta.layout.hierarchy().sort(null).value(null),e=Si,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Gu(n,t)},ta.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,v))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++oe&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++ie.dx)&&(s=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=ta.random.normal.apply(ta,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ta.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ta.scale={};var ml={floor:y,ceil:y};ta.scale.linear=function(){return Ii([0,1],[0,1],mu,!1)};var yl={s:1,g:1,p:1,r:1,e:1};ta.scale.log=function(){return Ji(ta.scale.linear().domain([0,1]),10,!0,[1,10])};var Ml=ta.format(".0e"),xl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ta.scale.pow=function(){return Gi(ta.scale.linear(),1,[0,1])},ta.scale.sqrt=function(){return ta.scale.pow().exponent(.5)},ta.scale.ordinal=function(){return Qi([],{t:"range",a:[[]]})},ta.scale.category10=function(){return ta.scale.ordinal().range(bl)},ta.scale.category20=function(){return ta.scale.ordinal().range(_l)},ta.scale.category20b=function(){return ta.scale.ordinal().range(wl)},ta.scale.category20c=function(){return ta.scale.ordinal().range(Sl)};var bl=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(Mt),_l=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(Mt),wl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(Mt),Sl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(Mt);ta.scale.quantile=function(){return no([],[])},ta.scale.quantize=function(){return to(0,1,[0,1])},ta.scale.threshold=function(){return eo([.5],[0,1])},ta.scale.identity=function(){return ro([0,1])},ta.svg={},ta.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),l=Math.max(0,+r.apply(this,arguments)),s=o.apply(this,arguments)-Ra,f=a.apply(this,arguments)-Ra,h=Math.abs(f-s),g=s>f?0:1;if(n>l&&(p=l,l=n,n=p),h>=Ta)return t(l,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,E=0,A=0,N=[];if((m=(+c.apply(this,arguments)||0)/2)&&(d=i===kl?Math.sqrt(n*n+l*l):+i.apply(this,arguments),g||(A*=-1),l&&(A=tt(d/l*Math.sin(m))),n&&(E=tt(d/n*Math.sin(m)))),l){y=l*Math.cos(s+A),M=l*Math.sin(s+A),x=l*Math.cos(f-A),b=l*Math.sin(f-A);var C=Math.abs(f-s-2*A)<=qa?0:1;if(A&&so(y,M,x,b)===g^C){var z=(s+f)/2;y=l*Math.cos(z),M=l*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-E),w=n*Math.sin(f-E),S=n*Math.cos(s+E),k=n*Math.sin(s+E);var q=Math.abs(s-f+2*E)<=qa?0:1;if(E&&so(_,w,S,k)===1-g^q){var L=(s+f)/2;_=n*Math.cos(L),w=n*Math.sin(L),S=k=null}}else _=w=0;if((p=Math.min(Math.abs(l-n)/2,+u.apply(this,arguments)))>.001){v=l>n^g?0:1;var T=null==S?[_,w]:null==x?[y,M]:Lr([y,M],[S,k],[x,b],[_,w]),R=y-T[0],D=M-T[1],P=x-T[0],U=b-T[1],j=1/Math.sin(Math.acos((R*P+D*U)/(Math.sqrt(R*R+D*D)*Math.sqrt(P*P+U*U)))/2),F=Math.sqrt(T[0]*T[0]+T[1]*T[1]);if(null!=x){var H=Math.min(p,(l-F)/(j+1)),O=fo(null==S?[_,w]:[S,k],[y,M],l,H,g),I=fo([x,b],[_,w],l,H,g);p===H?N.push("M",O[0],"A",H,",",H," 0 0,",v," ",O[1],"A",l,",",l," 0 ",1-g^so(O[1][0],O[1][1],I[1][0],I[1][1]),",",g," ",I[1],"A",H,",",H," 0 0,",v," ",I[0]):N.push("M",O[0],"A",H,",",H," 0 1,",v," ",I[0])}else N.push("M",y,",",M);if(null!=S){var Y=Math.min(p,(n-F)/(j-1)),Z=fo([y,M],[S,k],n,-Y,g),V=fo([_,w],null==x?[y,M]:[x,b],n,-Y,g);p===Y?N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^so(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",Y,",",Y," 0 0,",v," ",Z[0]):N.push("L",V[0],"A",Y,",",Y," 0 0,",v," ",Z[0])}else N.push("L",_,",",w)}else N.push("M",y,",",M),null!=x&&N.push("A",l,",",l," 0 ",C,",",g," ",x,",",b),N.push("L",_,",",w),null!=S&&N.push("A",n,",",n," 0 ",q,",",1-g," ",S,",",k);return N.push("Z"),N.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=io,r=oo,u=uo,i=kl,o=ao,a=co,c=lo;return n.innerRadius=function(t){return arguments.length?(e=Et(t),n):e},n.outerRadius=function(t){return arguments.length?(r=Et(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=Et(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==kl?kl:Et(t),n):i},n.startAngle=function(t){return arguments.length?(o=Et(t),n):o},n.endAngle=function(t){return arguments.length?(a=Et(t),n):a},n.padAngle=function(t){return arguments.length?(c=Et(t),n):c},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Ra;return[Math.cos(t)*n,Math.sin(t)*n]},n};var kl="auto";ta.svg.line=function(){return ho(y)};var El=ta.map({linear:go,"linear-closed":po,step:vo,"step-before":mo,"step-after":yo,basis:So,"basis-open":ko,"basis-closed":Eo,bundle:Ao,cardinal:bo,"cardinal-open":Mo,"cardinal-closed":xo,monotone:To});El.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Al=[0,2/3,1/3,0],Nl=[0,1/3,2/3,0],Cl=[0,1/6,2/3,1/6];ta.svg.line.radial=function(){var n=ho(Ro);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},mo.reverse=yo,yo.reverse=mo,ta.svg.area=function(){return Do(y)},ta.svg.area.radial=function(){var n=Do(Ro);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ta.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)-Ra,s=l.call(n,u,r)-Ra;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>qa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=mr,o=yr,a=Po,c=ao,l=co;return n.radius=function(t){return arguments.length?(a=Et(t),n):a},n.source=function(t){return arguments.length?(i=Et(t),n):i},n.target=function(t){return arguments.length?(o=Et(t),n):o},n.startAngle=function(t){return arguments.length?(c=Et(t),n):c},n.endAngle=function(t){return arguments.length?(l=Et(t),n):l},n},ta.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=mr,e=yr,r=Uo;return n.source=function(e){return arguments.length?(t=Et(e),n):t},n.target=function(t){return arguments.length?(e=Et(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ta.svg.diagonal.radial=function(){var n=ta.svg.diagonal(),t=Uo,e=n.projection;return n.projection=function(n){return arguments.length?e(jo(t=n)):t},n},ta.svg.symbol=function(){function n(n,r){return(zl.get(t.call(this,n,r))||Oo)(e.call(this,n,r))}var t=Ho,e=Fo;return n.type=function(e){return arguments.length?(t=Et(e),n):t},n.size=function(t){return arguments.length?(e=Et(t),n):e},n};var zl=ta.map({circle:Oo,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ll)),e=t*Ll;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/ql),e=t*ql/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ta.svg.symbolTypes=zl.keys();var ql=Math.sqrt(3),Ll=Math.tan(30*Da);_a.transition=function(n){for(var t,e,r=Tl||++Ul,u=Xo(n),i=[],o=Rl||{time:Date.now(),ease:Su,delay:0,duration:250},a=-1,c=this.length;++ai;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Yo(u,this.namespace,this.id)},Pl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Pl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Hu:mu,a=ta.ns.qualify(n);return Zo(this,"attr."+n,t,a.local?i:u)},Pl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=ta.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Pl.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=mu(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Zo(this,"style."+n,e,i)},Pl.styleTween=function(n,e,r){function u(u,i){var o=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Pl.text=function(n){return Zo(this,"text",n,Vo)},Pl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Pl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ta.ease.apply(ta,arguments)),Y(this,function(r){r[e][t].ease=n}))},Pl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Pl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Pl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Rl,i=Tl;try{Tl=e,Y(this,function(t,u,i){Rl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Rl=u,Tl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=ta.dispatch("start","end","interrupt"))).on(n,t)});return this},Pl.transition=function(){for(var n,t,e,r,u=this.id,i=++Ul,o=this.namespace,a=[],c=0,l=this.length;l>c;c++){a.push(n=[]);for(var t=this[c],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[o][u],$o(e,s,o,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Yo(a,o,i)},ta.svg.axis=function(){function n(n){n.each(function(){var n,l=ta.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):y:t,p=l.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ca),d=ta.transition(p.exit()).style("opacity",Ca).remove(),m=ta.transition(p.order()).style("opacity",1),M=Math.max(u,0)+o,x=Ui(f),b=l.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ta.transition(b));v.append("line"),v.append("text");var w,S,k,E,A=v.select("line"),N=m.select("line"),C=p.select("text").text(g),z=v.select("text"),q=m.select("text"),L="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=Bo,w="x",k="y",S="x2",E="y2",C.attr("dy",0>L?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+L*i+"V0H"+x[1]+"V"+L*i)):(n=Wo,w="y",k="x",S="y2",E="x2",C.attr("dy",".32em").style("text-anchor",0>L?"end":"start"),_.attr("d","M"+L*i+","+x[0]+"H0V"+x[1]+"H"+L*i)),A.attr(E,L*u),z.attr(k,L*M),N.attr(S,0).attr(E,L*u),q.attr(w,0).attr(k,L*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=ta.scale.linear(),r=jl,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Fl?t+"":jl,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var jl="bottom",Fl={top:1,right:1,bottom:1,left:1};ta.svg.brush=function(){function n(t){t.each(function(){var t=ta.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,y);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Hl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var c,f=ta.transition(t),h=ta.transition(o);l&&(c=Ui(l),h.attr("x",c[0]).attr("width",c[1]-c[0]),r(f)),s&&(c=Ui(s),h.attr("y",c[0]).attr("height",c[1]-c[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==ta.event.keyCode&&(C||(M=null,q[0]-=f[1],q[1]-=h[1],C=2),S())}function v(){32==ta.event.keyCode&&2==C&&(q[0]+=f[1],q[1]+=h[1],C=0,S())}function d(){var n=ta.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ta.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),q[0]=f[+(n[0]s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?a=null:o=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ta.select("body").style("cursor",null),L.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ta.select(ta.event.target),w=c.of(b,arguments),k=ta.select(b),E=_.datum(),A=!/^(n|s)$/.test(E)&&l,N=!/^(e|w)$/.test(E)&&s,C=_.classed("extent"),z=W(b),q=ta.mouse(b),L=ta.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(ta.event.changedTouches?L.on("touchmove.brush",d).on("touchend.brush",y):L.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)q[0]=f[0]-q[0],q[1]=h[0]-q[1];else if(E){var T=+/w$/.test(E),R=+/^n/.test(E);x=[f[1-T]-q[0],h[1-R]-q[1]],q[0]=f[T],q[1]=h[R]}else ta.event.altKey&&(M=q.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ta.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,c=E(n,"brushstart","brush","brushend"),l=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=Ol[0];return n.event=function(n){n.each(function(){var n=c.of(this,arguments),t={x:f,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Tl?ta.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=yu(f,t.x),r=yu(h,t.y);return o=a=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(l=t,v=Ol[!l<<1|!s],n):l},n.y=function(t){return arguments.length?(s=t,v=Ol[!l<<1|!s],n):s},n.clamp=function(t){return arguments.length?(l&&s?(g=!!t[0],p=!!t[1]):l?g=!!t:s&&(p=!!t),n):l&&s?[g,p]:l?g:s?p:null},n.extent=function(t){var e,r,u,i,c;return arguments.length?(l&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),o=[e,r],l.invert&&(e=l(e),r=l(r)),e>r&&(c=e,e=r,r=c),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],l&&(u=u[1],i=i[1]),a=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(c=u,u=i,i=c),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(l&&(o?(e=o[0],r=o[1]):(e=f[0],r=f[1],l.invert&&(e=l.invert(e),r=l.invert(r)),e>r&&(c=e,e=r,r=c))),s&&(a?(u=a[0],i=a[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(c=u,u=i,i=c))),l&&s?[[e,u],[r,i]]:l?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!l&&f[0]==f[1]||!!s&&h[0]==h[1]},ta.rebind(n,c,"on")};var Hl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ol=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Il=ac.format=gc.timeFormat,Yl=Il.utc,Zl=Yl("%Y-%m-%dT%H:%M:%S.%LZ");Il.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Jo:Zl,Jo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Jo.toString=Zl.toString,ac.second=Ft(function(n){return new cc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ac.seconds=ac.second.range,ac.seconds.utc=ac.second.utc.range,ac.minute=Ft(function(n){return new cc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ac.minutes=ac.minute.range,ac.minutes.utc=ac.minute.utc.range,ac.hour=Ft(function(n){var t=n.getTimezoneOffset()/60;return new cc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ac.hours=ac.hour.range,ac.hours.utc=ac.hour.utc.range,ac.month=Ft(function(n){return n=ac.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ac.months=ac.month.range,ac.months.utc=ac.month.utc.range;var Vl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Xl=[[ac.second,1],[ac.second,5],[ac.second,15],[ac.second,30],[ac.minute,1],[ac.minute,5],[ac.minute,15],[ac.minute,30],[ac.hour,1],[ac.hour,3],[ac.hour,6],[ac.hour,12],[ac.day,1],[ac.day,2],[ac.week,1],[ac.month,1],[ac.month,3],[ac.year,1]],$l=Il.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Ne]]),Bl={range:function(n,t,e){return ta.range(Math.ceil(n/e)*e,+t,e).map(Ko)},floor:y,ceil:y};Xl.year=ac.year,ac.scale=function(){return Go(ta.scale.linear(),Xl,$l)};var Wl=Xl.map(function(n){return[n[0].utc,n[1]]}),Jl=Yl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Ne]]);Wl.year=ac.year.utc,ac.scale.utc=function(){return Go(ta.scale.linear(),Wl,Jl)},ta.text=At(function(n){return n.responseText}),ta.json=function(n,t){return Nt(n,"application/json",Qo,t)},ta.html=function(n,t){return Nt(n,"text/html",na,t)},ta.xml=At(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(ta):"object"==typeof module&&module.exports&&(module.exports=ta),this.d3=ta}(); \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/holder.min.js b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/holder.min.js new file mode 100644 index 0000000..6bfc844 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/holder.min.js @@ -0,0 +1,12 @@ +/*! + +Holder - client side image placeholders +Version 2.7.1+6hydf +© 2015 Ivan Malopinsky - http://imsky.co + +Site: http://holderjs.com +Issues: https://github.com/imsky/holder/issues +License: http://opensource.org/licenses/MIT + +*/ +!function(a){if(a.document){var b=a.document;b.querySelectorAll||(b.querySelectorAll=function(c){var d,e=b.createElement("style"),f=[];for(b.documentElement.firstChild.appendChild(e),b._qsa=[],e.styleSheet.cssText=c+"{x-qsa:expression(document._qsa && document._qsa.push(this))}",a.scrollBy(0,0),e.parentNode.removeChild(e);b._qsa.length;)d=b._qsa.shift(),d.style.removeAttribute("x-qsa"),f.push(d);return b._qsa=null,f}),b.querySelector||(b.querySelector=function(a){var c=b.querySelectorAll(a);return c.length?c[0]:null}),b.getElementsByClassName||(b.getElementsByClassName=function(a){return a=String(a).replace(/^|\s+/g,"."),b.querySelectorAll(a)}),Object.keys||(Object.keys=function(a){if(a!==Object(a))throw TypeError("Object.keys called on non-object");var b,c=[];for(b in a)Object.prototype.hasOwnProperty.call(a,b)&&c.push(b);return c}),function(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";a.atob=a.atob||function(a){a=String(a);var c,d=0,e=[],f=0,g=0;if(a=a.replace(/\s/g,""),a.length%4===0&&(a=a.replace(/=+$/,"")),a.length%4===1)throw Error("InvalidCharacterError");if(/[^+/0-9A-Za-z]/.test(a))throw Error("InvalidCharacterError");for(;d>16&255)),e.push(String.fromCharCode(f>>8&255)),e.push(String.fromCharCode(255&f)),g=0,f=0),d+=1;return 12===g?(f>>=4,e.push(String.fromCharCode(255&f))):18===g&&(f>>=2,e.push(String.fromCharCode(f>>8&255)),e.push(String.fromCharCode(255&f))),e.join("")},a.btoa=a.btoa||function(a){a=String(a);var c,d,e,f,g,h,i,j=0,k=[];if(/[^\x00-\xFF]/.test(a))throw Error("InvalidCharacterError");for(;j>2,g=(3&c)<<4|d>>4,h=(15&d)<<2|e>>6,i=63&e,j===a.length+2?(h=64,i=64):j===a.length+1&&(i=64),k.push(b.charAt(f),b.charAt(g),b.charAt(h),b.charAt(i));return k.join("")}}(a),Object.prototype.hasOwnProperty||(Object.prototype.hasOwnProperty=function(a){var b=this.__proto__||this.constructor.prototype;return a in this&&(!(a in b)||b[a]!==this[a])}),function(){if("performance"in a==!1&&(a.performance={}),Date.now=Date.now||function(){return(new Date).getTime()},"now"in a.performance==!1){var b=Date.now();performance.timing&&performance.timing.navigationStart&&(b=performance.timing.navigationStart),a.performance.now=function(){return Date.now()-b}}}(),a.requestAnimationFrame||(a.webkitRequestAnimationFrame?!function(a){a.requestAnimationFrame=function(b){return webkitRequestAnimationFrame(function(){b(a.performance.now())})},a.cancelAnimationFrame=webkitCancelAnimationFrame}(a):a.mozRequestAnimationFrame?!function(a){a.requestAnimationFrame=function(b){return mozRequestAnimationFrame(function(){b(a.performance.now())})},a.cancelAnimationFrame=mozCancelAnimationFrame}(a):!function(a){a.requestAnimationFrame=function(b){return a.setTimeout(b,1e3/60)},a.cancelAnimationFrame=a.clearTimeout}(a))}}(this),function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):"object"==typeof exports?exports.Holder=b():a.Holder=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){(function(b){function d(a,b,c,d){var f=e(c.substr(c.lastIndexOf(a.domain)),a);f&&h({mode:null,el:d,flags:f,engineSettings:b})}function e(a,b){var c={theme:B(J.settings.themes.gray,null),stylesheets:b.stylesheets,instanceOptions:b};return a.match(/([\d]+p?)x([\d]+p?)(?:\?|$)/)?f(a,c):g(a,c)}function f(a,b){var c=a.split("?"),d=c[0].split("/");b.holderURL=a;var e=d[1],f=e.match(/([\d]+p?)x([\d]+p?)/);if(!f)return!1;if(b.fluid=-1!==e.indexOf("p"),b.dimensions={width:f[1].replace("p","%"),height:f[2].replace("p","%")},2===c.length){var g=A.parse(c[1]);if(g.bg&&(b.theme.background=(-1===g.bg.indexOf("#")?"#":"")+g.bg),g.fg&&(b.theme.foreground=(-1===g.fg.indexOf("#")?"#":"")+g.fg),g.theme&&b.instanceOptions.themes.hasOwnProperty(g.theme)&&(b.theme=B(b.instanceOptions.themes[g.theme],null)),g.text&&(b.text=g.text),g.textmode&&(b.textmode=g.textmode),g.size&&(b.size=g.size),g.font&&(b.font=g.font),g.align&&(b.align=g.align),b.nowrap=z.truthy(g.nowrap),b.auto=z.truthy(g.auto),z.truthy(g.random)){J.vars.cache.themeKeys=J.vars.cache.themeKeys||Object.keys(b.instanceOptions.themes);var h=J.vars.cache.themeKeys[0|Math.random()*J.vars.cache.themeKeys.length];b.theme=B(b.instanceOptions.themes[h],null)}}return b}function g(a,b){var c=!1,d=String.fromCharCode(11),e=a.replace(/([^\\])\//g,"$1"+d).split(d),f=/%[0-9a-f]{2}/gi,g=b.instanceOptions;b.holderURL=[];for(var h=e.length,i=0;h>i;i++){var j=e[i];if(j.match(f))try{j=decodeURIComponent(j)}catch(k){j=e[i]}var l=!1;if(J.flags.dimensions.match(j))c=!0,b.dimensions=J.flags.dimensions.output(j),l=!0;else if(J.flags.fluid.match(j))c=!0,b.dimensions=J.flags.fluid.output(j),b.fluid=!0,l=!0;else if(J.flags.textmode.match(j))b.textmode=J.flags.textmode.output(j),l=!0;else if(J.flags.colors.match(j)){var m=J.flags.colors.output(j);b.theme=B(b.theme,m),l=!0}else if(g.themes[j])g.themes.hasOwnProperty(j)&&(b.theme=B(g.themes[j],null)),l=!0;else if(J.flags.font.match(j))b.font=J.flags.font.output(j),l=!0;else if(J.flags.auto.match(j))b.auto=!0,l=!0;else if(J.flags.text.match(j))b.text=J.flags.text.output(j),l=!0;else if(J.flags.size.match(j))b.size=J.flags.size.output(j),l=!0;else if(J.flags.random.match(j)){null==J.vars.cache.themeKeys&&(J.vars.cache.themeKeys=Object.keys(g.themes));var n=J.vars.cache.themeKeys[0|Math.random()*J.vars.cache.themeKeys.length];b.theme=B(g.themes[n],null),l=!0}l&&b.holderURL.push(j)}return b.holderURL.unshift(g.domain),b.holderURL=b.holderURL.join("/"),c?b:!1}function h(a){var b=a.mode,c=a.el,d=a.flags,e=a.engineSettings,f=d.dimensions,g=d.theme,h=f.width+"x"+f.height;if(b=null==b?d.fluid?"fluid":"image":b,null!=d.text&&(g.text=d.text,"object"===c.nodeName.toLowerCase())){for(var j=g.text.split("\\n"),k=0;k1){var n,o=0,p=0,q=0;j=new e.Group("line"+q),("left"===a.align||"right"===a.align)&&(m=a.width*(1-2*(1-J.setup.lineWrapRatio)));for(var r=0;r=m||t===!0)&&(b(g,j,o,g.properties.leading),g.add(j),o=0,p+=g.properties.leading,q+=1,j=new e.Group("line"+q),j.y=p),t!==!0&&(i.moveTo(o,0),o+=h.spaceWidth+s.width,j.add(i))}if(b(g,j,o,g.properties.leading),g.add(j),"left"===a.align)g.moveTo(a.width-l,null,null);else if("right"===a.align){for(n in g.children)j=g.children[n],j.moveTo(a.width-j.width,null,null);g.moveTo(0-(a.width-l),null,null)}else{for(n in g.children)j=g.children[n],j.moveTo((g.width-j.width)/2,null,null);g.moveTo((a.width-g.width)/2,null,null)}g.moveTo(null,(a.height-g.height)/2,null),(a.height-g.height)/2<0&&g.moveTo(null,0,null)}else i=new e.Text(a.text),j=new e.Group("line0"),j.add(i),g.add(j),"left"===a.align?g.moveTo(a.width-l,null,null):"right"===a.align?g.moveTo(0-(a.width-l),null,null):g.moveTo((a.width-h.boundingBox.width)/2,null,null),g.moveTo(null,(a.height-h.boundingBox.height)/2,null);return d}function k(a,b,c){var d=parseInt(a,10),e=parseInt(b,10),f=Math.max(d,e),g=Math.min(d,e),h=.8*Math.min(g,f*J.defaults.scale);return Math.round(Math.max(c,h))}function l(a){var b;b=null==a||null==a.nodeType?J.vars.resizableImages:[a];for(var c=0,d=b.length;d>c;c++){var e=b[c];if(e.holderData){var f=e.holderData.flags,g=D(e);if(g){if(!e.holderData.resizeUpdate)continue;if(f.fluid&&f.auto){var h=e.holderData.fluidConfig;switch(h.mode){case"width":g.height=g.width/h.ratio;break;case"height":g.width=g.height*h.ratio}}var j={mode:"image",holderSettings:{dimensions:g,theme:f.theme,flags:f},el:e,engineSettings:e.holderData.engineSettings};"exact"==f.textmode&&(f.exactDimensions=g,j.holderSettings.dimensions=f.dimensions),i(j)}else p(e)}}}function m(a){if(a.holderData){var b=D(a);if(b){var c=a.holderData.flags,d={fluidHeight:"%"==c.dimensions.height.slice(-1),fluidWidth:"%"==c.dimensions.width.slice(-1),mode:null,initialDimensions:b};d.fluidWidth&&!d.fluidHeight?(d.mode="width",d.ratio=d.initialDimensions.width/parseFloat(c.dimensions.height)):!d.fluidWidth&&d.fluidHeight&&(d.mode="height",d.ratio=parseFloat(c.dimensions.width)/d.initialDimensions.height),a.holderData.fluidConfig=d}else p(a)}}function n(){for(var a,c=[],d=Object.keys(J.vars.invisibleImages),e=0,f=d.length;f>e;e++)a=J.vars.invisibleImages[d[e]],D(a)&&"img"==a.nodeName.toLowerCase()&&(c.push(a),delete J.vars.invisibleImages[d[e]]);c.length&&I.run({images:c}),b.requestAnimationFrame(n)}function o(){J.vars.visibilityCheckStarted||(b.requestAnimationFrame(n),J.vars.visibilityCheckStarted=!0)}function p(a){a.holderData.invisibleId||(J.vars.invisibleId+=1,J.vars.invisibleImages["i"+J.vars.invisibleId]=a,a.holderData.invisibleId=J.vars.invisibleId)}function q(a,b){return null==b?document.createElement(a):document.createElementNS(b,a)}function r(a,b){for(var c in b)a.setAttribute(c,b[c])}function s(a,b,c){var d,e;null==a?(a=q("svg",E),d=q("defs",E),e=q("style",E),r(e,{type:"text/css"}),d.appendChild(e),a.appendChild(d)):e=a.querySelector("style"),a.webkitMatchesSelector&&a.setAttribute("xmlns",E);for(var f=0;f=0;h--){var i=g.createProcessingInstruction("xml-stylesheet",'href="'+f[h]+'" rel="stylesheet"');g.insertBefore(i,g.firstChild)}g.removeChild(g.documentElement),e=d.serializeToString(g)}var j=d.serializeToString(a);return j=j.replace(/\&(\#[0-9]{2,}\;)/g,"&$1"),e+j}}function u(){return b.DOMParser?(new DOMParser).parseFromString("","application/xml"):void 0}function v(a){J.vars.debounceTimer||a.call(this),J.vars.debounceTimer&&b.clearTimeout(J.vars.debounceTimer),J.vars.debounceTimer=b.setTimeout(function(){J.vars.debounceTimer=null,a.call(this)},J.setup.debounce)}function w(){v(function(){l(null)})}var x=c(1),y=c(2),z=c(3),A=c(4),B=z.extend,C=z.getNodeArray,D=z.dimensionCheck,E="http://www.w3.org/2000/svg",F=8,G="2.7.1",H="\nCreated with Holder.js "+G+".\nLearn more at http://holderjs.com\n(c) 2012-2015 Ivan Malopinsky - http://imsky.co\n",I={version:G,addTheme:function(a,b){return null!=a&&null!=b&&(J.settings.themes[a]=b),delete J.vars.cache.themeKeys,this},addImage:function(a,b){var c=document.querySelectorAll(b);if(c.length)for(var d=0,e=c.length;e>d;d++){var f=q("img"),g={};g[J.vars.dataAttr]=a,r(f,g),c[d].appendChild(f)}return this},setResizeUpdate:function(a,b){a.holderData&&(a.holderData.resizeUpdate=!!b,a.holderData.resizeUpdate&&l(a))},run:function(a){a=a||{};var c={},f=B(J.settings,a);J.vars.preempted=!0,J.vars.dataAttr=f.dataAttr||J.vars.dataAttr,c.renderer=f.renderer?f.renderer:J.setup.renderer,-1===J.setup.renderers.join(",").indexOf(c.renderer)&&(c.renderer=J.setup.supportsSVG?"svg":J.setup.supportsCanvas?"canvas":"html");var g=C(f.images),i=C(f.bgnodes),j=C(f.stylenodes),k=C(f.objects);c.stylesheets=[],c.svgXMLStylesheet=!0,c.noFontFallback=f.noFontFallback?f.noFontFallback:!1;for(var l=0;l1){c.nodeValue="";for(var u=0;u=0?b:1)}function f(a){v?e(a):w.push(a)}null==document.readyState&&document.addEventListener&&(document.addEventListener("DOMContentLoaded",function y(){document.removeEventListener("DOMContentLoaded",y,!1),document.readyState="complete"},!1),document.readyState="loading");var g=a.document,h=g.documentElement,i="load",j=!1,k="on"+i,l="complete",m="readyState",n="attachEvent",o="detachEvent",p="addEventListener",q="DOMContentLoaded",r="onreadystatechange",s="removeEventListener",t=p in g,u=j,v=j,w=[];if(g[m]===l)e(b);else if(t)g[p](q,c,j),a[p](i,c,j);else{g[n](r,c),a[n](k,c);try{u=null==a.frameElement&&h}catch(x){}u&&u.doScroll&&!function z(){if(!v){try{u.doScroll("left")}catch(a){return e(z,50)}d(),b()}}()}return f.version="1.4.0",f.isReady=function(){return v},f}a.exports="undefined"!=typeof window&&b(window)},function(a,b,c){var d=c(5),e=function(a){function b(a,b){for(var c in b)a[c]=b[c];return a}var c=1,e=d.defclass({constructor:function(a){c++,this.parent=null,this.children={},this.id=c,this.name="n"+c,null!=a&&(this.name=a),this.x=0,this.y=0,this.z=0,this.width=0,this.height=0},resize:function(a,b){null!=a&&(this.width=a),null!=b&&(this.height=b)},moveTo:function(a,b,c){this.x=null!=a?a:this.x,this.y=null!=b?b:this.y,this.z=null!=c?c:this.z},add:function(a){var b=a.name;if(null!=this.children[b])throw"SceneGraph: child with that name already exists: "+b;this.children[b]=a,a.parent=this}}),f=d(e,function(b){this.constructor=function(){b.constructor.call(this,"root"),this.properties=a}}),g=d(e,function(a){function c(c,d){if(a.constructor.call(this,c),this.properties={fill:"#000"},null!=d)b(this.properties,d);else if(null!=c&&"string"!=typeof c)throw"SceneGraph: invalid node name"}this.Group=d.extend(this,{constructor:c,type:"group"}),this.Rect=d.extend(this,{constructor:c,type:"rect"}),this.Text=d.extend(this,{constructor:function(a){c.call(this),this.properties.text=a},type:"text"})}),h=new f;return this.Shape=g,this.root=h,this};a.exports=e},function(a,b){(function(a){b.extend=function(a,b){var c={};for(var d in a)a.hasOwnProperty(d)&&(c[d]=a[d]);if(null!=b)for(var e in b)b.hasOwnProperty(e)&&(c[e]=b[e]);return c},b.cssProps=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c+":"+a[c]);return b.join(";")},b.encodeHtmlEntity=function(a){for(var b=[],c=0,d=a.length-1;d>=0;d--)c=a.charCodeAt(d),b.unshift(c>128?["&#",c,";"].join(""):a[d]);return b.join("")},b.getNodeArray=function(b){var c=null;return"string"==typeof b?c=document.querySelectorAll(b):a.NodeList&&b instanceof a.NodeList?c=b:a.Node&&b instanceof a.Node?c=[b]:a.HTMLCollection&&b instanceof a.HTMLCollection?c=b:b instanceof Array?c=b:null===b&&(c=[]),c},b.imageExists=function(a,b){var c=new Image;c.onerror=function(){b.call(this,!1)},c.onload=function(){b.call(this,!0)},c.src=a},b.decodeHtmlEntity=function(a){return a.replace(/&#(\d+);/g,function(a,b){return String.fromCharCode(b)})},b.dimensionCheck=function(a){var b={height:a.clientHeight,width:a.clientWidth};return b.height&&b.width?b:!1},b.truthy=function(a){return"string"==typeof a?"true"===a||"yes"===a||"1"===a||"on"===a||"✓"===a:!!a}}).call(b,function(){return this}())},function(a,b,c){var d=encodeURIComponent,e=decodeURIComponent,f=c(6),g=c(7),h=/(\w+)\[(\d+)\]/,i=/\w+\.\w+/;b.parse=function(a){if("string"!=typeof a)return{};if(a=f(a),""===a)return{};"?"===a.charAt(0)&&(a=a.slice(1));for(var b={},c=a.split("&"),d=0;d",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document); \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.js b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.js new file mode 100644 index 0000000..0f60b7b --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
    a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:k.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("