Completed
Push — master ( 456549...47da6e )
by Łukasz
02:25
created

WorkingDirectory::__toString()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Tworzenieweb\SqlProvisioner\Filesystem;
4
5
use Symfony\Component\Filesystem\Filesystem;
6
use Symfony\Component\Finder\Finder;
7
8
/**
9
 * @author Luke Adamczewski
10
 * @package Tworzenieweb\SqlProvisioner\Filesystem
11
 */
12
class WorkingDirectory
13
{
14
    const DRAFT_CONTENT = <<<DRAFT
15
DATABASE_USER=[user]
16
DATABASE_PASSWORD=[password]
17
DATABASE_HOST=[host]
18
DATABASE_PORT=[port]
19
DATABASE_NAME=[database]
20
PROVISIONING_TABLE=changelog_database_deployments
21
PROVISIONING_TABLE_CANDIDATE_NUMBER_COLUMN=deploy_script_number
22
DRAFT;
23
    const FILE_SUFFIX = '.env';
24
25
    /** @var string */
26
    private $currentDirectory;
27
28
    /** @var Filesystem */
29
    private $filesystem;
30
31
    /** @var string */
32
    private $currentDirectoryAbsolute;
33
34
    /** @var EnvironmentLoaderInterface */
35
    private $environmentLoader;
36
37
38
    /**
39
     * @param string                     $currentDirectory
40
     * @param CandidatesFinder           $finder
41
     * @param Filesystem                 $filesystem
42
     * @param EnvironmentLoaderInterface $environmentLoader
43
     */
44
    public function __construct($currentDirectory, CandidatesFinder $finder, Filesystem $filesystem, EnvironmentLoaderInterface $environmentLoader)
45
    {
46
        $this->currentDirectory = $currentDirectory;
47
        $this->filesystem = $filesystem;
48
        $this->currentDirectoryAbsolute = $this->buildAbsolutePath($currentDirectory);
49
        $this->finder = $finder;
0 ignored issues
show
Bug introduced by
The property finder does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
50
        $this->environmentLoader = $environmentLoader;
51
    }
52
53
    /**
54
     * @param string $newPath
55
     * @return WorkingDirectory
56
     */
57
    public function cd($newPath)
58
    {
59
        return new WorkingDirectory($newPath, $this->finder, $this->filesystem, $this->environmentLoader);
60
    }
61
62
    /**
63
     * @return void
64
     */
65
    public function createEnvironmentFile()
66
    {
67
        $targetFilename = $this->currentDirectoryAbsolute . DIRECTORY_SEPARATOR . self::FILE_SUFFIX;
68
        $this->filesystem->dumpFile(
69
            $targetFilename,
70
            self::DRAFT_CONTENT
71
        );
72
    }
73
74
    /**
75
     * @return void
76
     */
77
    public function loadEnvironment()
78
    {
79
        $this->environmentLoader->load($this);
80
    }
81
82
    /**
83
     * @return Finder
84
     */
85
    public function getCandidates()
86
    {
87
        return $this->finder->find($this->currentDirectoryAbsolute);
88
    }
89
90
    /**
91
     * @return string
92
     */
93
    public function getCurrentDirectoryAbsolute(): string
94
    {
95
        return $this->currentDirectoryAbsolute;
96
    }
97
98
    /**
99
     * @return string
100
     */
101
    public function __toString()
102
    {
103
        return $this->currentDirectoryAbsolute;
104
    }
105
106
    /**
107
     * @param string $path
108
     * @return string
109
     */
110
    private function buildAbsolutePath($path)
111
    {
112
        $absolutePath = $path;
113
114
        if (!$this->filesystem->isAbsolutePath($path)) {
115
            $absolutePath = realpath($path);
116
        }
117
118
        return $absolutePath;
119
    }
120
}