Completed
Push — master ( 851150...ee52e4 )
by Mahmoud
03:11
created

ShipButler::getContainersNames()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 0
1
<?php
2
3
namespace App\Ship\Engine\Butlers;
4
5
use Illuminate\Support\Facades\Config;
6
use Illuminate\Support\Facades\File;
7
8
/**
9
 * Class ShipButler
10
 *
11
 * Helper Class to serve on the Ship layer.
12
 *
13
 * @author  Mahmoud Zalt  <[email protected]>
14
 */
15
class ShipButler
16
{
17
18
    /**
19
     * Get the containers namespace value from the containers config file
20
     *
21
     * @return  string
22
     */
23
    public function getContainersNamespace()
24
    {
25
        return Config::get('hello.containers.namespace');
26
    }
27
28
    /**
29
     * Get the containers names
30
     *
31
     * @return  array
32
     */
33
    public function getContainersNames()
34
    {
35
        $containersNames = [];
36
37
        foreach ($this->getContainersPaths() as $containersPath) {
38
            $containersNames[] = basename($containersPath);
39
        }
40
41
        return $containersNames;
42
    }
43
44
    /**
45
     * Get the port folders names
46
     *
47
     * @return  array
48
     */
49
    public function getShipFoldersNames()
50
    {
51
        $portFoldersNames = [];
52
53
        foreach ($this->getShipPath() as $portFoldersPath) {
54
            $portFoldersNames[] = basename($portFoldersPath);
55
        }
56
57
        return $portFoldersNames;
58
    }
59
60
    /**
61
     * get containers directories paths
62
     *
63
     * @return  mixed
64
     */
65
    public function getContainersPaths()
66
    {
67
        return File::directories(app_path('Containers'));;
68
    }
69
70
    /**
71
     * @return  mixed
72
     */
73
    public function getShipPath()
74
    {
75
        return File::directories(app_path('Ship'));
76
    }
77
78
    /**
79
     * build and return an object of a class from its file path
80
     *
81
     * @param $filePathName
82
     *
83
     * @return  mixed
84
     */
85
    public function getClassObjectFromFile($filePathName)
86
    {
87
        $classString = $this->getClassFullNameFromFile($filePathName);
88
89
        $object = new $classString;
90
91
        return $object;
92
    }
93
94
    /**
95
     * get the full name (name \ namespace) of a class from its file path
96
     * result example: (string) "I\Am\The\Namespace\Of\This\Class"
97
     *
98
     * @param $filePathName
99
     *
100
     * @return  string
101
     */
102
    public function getClassFullNameFromFile($filePathName)
103
    {
104
        return $this->getClassNamespaceFromFile($filePathName) . '\\' . $this->getClassNameFromFile($filePathName);
105
    }
106
107
    /**
108
     * get the class namespace form file path using token
109
     *
110
     * @param $filePathName
111
     *
112
     * @return  null|string
113
     */
114
    protected function getClassNamespaceFromFile($filePathName)
115
    {
116
        $src = file_get_contents($filePathName);
117
118
        $tokens = token_get_all($src);
119
        $count = count($tokens);
120
        $i = 0;
121
        $namespace = '';
122
        $namespace_ok = false;
123
        while ($i < $count) {
124
            $token = $tokens[$i];
125
            if (is_array($token) && $token[0] === T_NAMESPACE) {
126
                // Found namespace declaration
127
                while (++$i < $count) {
128
                    if ($tokens[$i] === ';') {
129
                        $namespace_ok = true;
130
                        $namespace = trim($namespace);
131
                        break;
132
                    }
133
                    $namespace .= is_array($tokens[$i]) ? $tokens[$i][1] : $tokens[$i];
134
                }
135
                break;
136
            }
137
            $i++;
138
        }
139
        if (!$namespace_ok) {
140
            return null;
141
        } else {
142
            return $namespace;
143
        }
144
    }
145
146
    /**
147
     * get the class name form file path using token
148
     *
149
     * @param $filePathName
150
     *
151
     * @return  mixed
152
     */
153
    protected function getClassNameFromFile($filePathName)
154
    {
155
        $php_code = file_get_contents($filePathName);
156
157
        $classes = array();
158
        $tokens = token_get_all($php_code);
159
        $count = count($tokens);
160
        for ($i = 2; $i < $count; $i++) {
161
            if ($tokens[$i - 2][0] == T_CLASS
162
                && $tokens[$i - 1][0] == T_WHITESPACE
163
                && $tokens[$i][0] == T_STRING
164
            ) {
165
166
                $class_name = $tokens[$i][1];
167
                $classes[] = $class_name;
168
            }
169
        }
170
171
        return $classes[0];
172
    }
173
174
    /**
175
     * check if a word starts with another word
176
     *
177
     * @param $word
178
     * @param $startsWith
179
     *
180
     * @return  bool
181
     */
182
    public function stringStartsWith($word, $startsWith)
183
    {
184
        return (substr($word, 0, strlen($startsWith)) === $startsWith);
185
    }
186
187
}
188