PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/src/Codeception/Lib/ParamsLoader.php

http://github.com/Codeception/Codeception
PHP | 157 lines | 145 code | 12 blank | 0 comment | 9 complexity | 3093aa48fde10171a65a15e423bc2863 MD5 | raw file
  1. <?php
  2. namespace Codeception\Lib;
  3. use Codeception\Exception\ConfigurationException;
  4. use Symfony\Component\Yaml\Yaml;
  5. class ParamsLoader
  6. {
  7. protected $paramStorage;
  8. protected $paramsFile;
  9. public function load($paramStorage)
  10. {
  11. $this->paramsFile = null;
  12. $this->paramStorage = $paramStorage;
  13. if (is_array($paramStorage)) {
  14. return $this->loadArray();
  15. }
  16. if ($paramStorage === 'env' || $paramStorage === 'environment') {
  17. return $this->loadEnvironmentVars();
  18. }
  19. $this->paramsFile = codecept_absolute_path($paramStorage);
  20. if (!file_exists($this->paramsFile)) {
  21. throw new ConfigurationException("Params file {$this->paramsFile} not found");
  22. }
  23. try {
  24. if (preg_match('~\.ya?ml$~', $paramStorage)) {
  25. return $this->loadYamlFile();
  26. }
  27. if (preg_match('~\.ini$~', $paramStorage)) {
  28. return $this->loadIniFile();
  29. }
  30. if (preg_match('~\.php$~', $paramStorage)) {
  31. return $this->loadPhpFile();
  32. }
  33. if (preg_match('~(\.env(\.|$))~', $paramStorage)) {
  34. return $this->loadDotEnvFile();
  35. }
  36. if (preg_match('~\.xml$~', $paramStorage)) {
  37. return $this->loadXmlFile();
  38. }
  39. } catch (\Exception $e) {
  40. throw new ConfigurationException("Failed loading params from $paramStorage\n" . $e->getMessage());
  41. }
  42. throw new ConfigurationException("Params can't be loaded from `$paramStorage`.");
  43. }
  44. public function loadArray()
  45. {
  46. return $this->paramStorage;
  47. }
  48. protected function loadIniFile()
  49. {
  50. return parse_ini_file($this->paramsFile);
  51. }
  52. protected function loadPhpFile()
  53. {
  54. return require $this->paramsFile;
  55. }
  56. protected function loadYamlFile()
  57. {
  58. $params = Yaml::parse(file_get_contents($this->paramsFile));
  59. if (isset($params['parameters'])) { // Symfony style
  60. $params = $params['parameters'];
  61. }
  62. return $params;
  63. }
  64. protected function loadXmlFile()
  65. {
  66. $paramsToArray = function (\SimpleXMLElement $params) use (&$paramsToArray) {
  67. $a = [];
  68. foreach ($params as $param) {
  69. $key = isset($param['key']) ? (string) $param['key'] : $param->getName();
  70. $type = isset($param['type']) ? (string) $param['type'] : 'string';
  71. $value = (string) $param;
  72. switch ($type) {
  73. case 'bool':
  74. case 'boolean':
  75. case 'int':
  76. case 'integer':
  77. case 'float':
  78. case 'double':
  79. $a[$key] = settype($value, $type);
  80. break;
  81. case 'constant':
  82. $a[$key] = constant($value);
  83. break;
  84. case 'collection':
  85. $a[$key] = $paramsToArray($param);
  86. break;
  87. default:
  88. $a[$key] = (string) $param;
  89. }
  90. }
  91. return $a;
  92. };
  93. return $paramsToArray(simplexml_load_file($this->paramsFile));
  94. }
  95. protected function loadDotEnvFile()
  96. {
  97. if (class_exists('Dotenv\Dotenv')) {
  98. if (class_exists('Dotenv\Repository\RepositoryBuilder') && method_exists('Dotenv\Repository\RepositoryBuilder', 'createWithNoAdapters')) {
  99. //dotenv v5
  100. $repository = \Dotenv\Repository\RepositoryBuilder::createWithNoAdapters()
  101. ->addAdapter(\Dotenv\Repository\Adapter\EnvConstAdapter::class)
  102. ->addAdapter(\Dotenv\Repository\Adapter\ServerConstAdapter::class)
  103. ->make();
  104. $dotEnv = \Dotenv\Dotenv::create($repository, codecept_root_dir(), $this->paramStorage);
  105. } elseif (class_exists('Dotenv\Repository\RepositoryBuilder')) {
  106. //dotenv v4
  107. $repository = \Dotenv\Repository\RepositoryBuilder::create()
  108. ->withReaders([new \Dotenv\Repository\Adapter\ServerConstAdapter()])
  109. ->immutable()
  110. ->make();
  111. $dotEnv = \Dotenv\Dotenv::create($repository, codecept_root_dir(), $this->paramStorage);
  112. } elseif (method_exists('Dotenv\Dotenv', 'create')) {
  113. //dotenv v3
  114. $dotEnv = \Dotenv\Dotenv::create(codecept_root_dir(), $this->paramStorage);
  115. } else {
  116. //dotenv v2
  117. $dotEnv = new \Dotenv\Dotenv(codecept_root_dir(), $this->paramStorage);
  118. }
  119. $dotEnv->load();
  120. return $_SERVER;
  121. } elseif (class_exists('Symfony\Component\Dotenv\Dotenv')) {
  122. $dotEnv = new \Symfony\Component\Dotenv\Dotenv();
  123. $dotEnv->load(codecept_root_dir($this->paramStorage));
  124. return $_SERVER;
  125. }
  126. throw new ConfigurationException(
  127. "`vlucas/phpdotenv` library is required to parse .env files.\n" .
  128. "Please install it via composer: composer require vlucas/phpdotenv"
  129. );
  130. }
  131. protected function loadEnvironmentVars()
  132. {
  133. return $_SERVER;
  134. }
  135. }