TraverseTrait   A
last analyzed

Complexity

Total Complexity 22

Size/Duplication

Total Lines 254
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 100%

Importance

Changes 8
Bugs 0 Features 3
Metric Value
wmc 22
c 8
b 0
f 3
lcom 1
cbo 8
dl 0
loc 254
ccs 63
cts 63
cp 1
rs 10

23 Methods

Rating   Name   Duplication   Size   Complexity  
getCrawler() 0 1 ?
queryIds() 0 1 ?
A getArray() 0 4 1
A getLinkArray() 0 4 1
A getButtonArray() 0 4 1
A getFieldArray() 0 4 1
A getLabelArray() 0 4 1
A get() 0 4 1
A getLink() 0 4 1
A getButton() 0 4 1
A getField() 0 4 1
A getLabel() 0 4 1
A newEmptyNode() 0 4 1
A clickOn() 0 8 1
A clickLink() 0 8 1
A clickButton() 0 8 1
A setField() 0 8 1
A setFieldFile() 0 8 1
A check() 0 8 1
A newNode() 0 4 1
A query() 0 7 1
A queryFirst() 0 6 2
A select() 0 9 1
1
<?php
2
3
namespace SP\Spiderling;
4
5
/**
6
 * @author    Ivan Kerin <[email protected]>
7
 * @copyright 2015, Clippings Ltd.
8
 * @license   http://spdx.org/licenses/BSD-3-Clause
9
 */
10
trait TraverseTrait
11
{
12
    /**
13
     * @return CrawlerInterface
14
     */
15
    abstract public function getCrawler();
16
17
    /**
18
     * @param  Query\AbstractQuery $query
19
     * @return array
20
     */
21
    abstract public function queryIds(Query\AbstractQuery $query);
22
23
    /**
24
     * @param  string $id
25
     * @return Node
26
     */
27
    public function newNode($id)
28
    {
29
        return new Node($this->getCrawler(), $id);
30
    }
31
32
    /**
33
     * @return EmptyNode
34
     */
35 2
    public function newEmptyNode(Query\AbstractQuery $query = null)
36
    {
37
        return new EmptyNode($this->getCrawler(), $query);
38 2
    }
39
40
    /**
41
     * @param  Query\AbstractQuery $query
42
     * @return Node[]
43
     */
44 1
    public function query(Query\AbstractQuery $query)
45
    {
46
        return array_map(
47 1
            [$this, 'newNode'],
48 1
            $this->queryIds($query)
49
        );
50 1
    }
51
52
    /**
53
     * @param  Query\AbstractQuery $query
54
     * @return Node
55
     */
56 1
    public function queryFirst(Query\AbstractQuery $query)
57
    {
58
        $nodes = $this->query($query);
59
60
        return reset($nodes) ?: $this->newEmptyNode($query);
61 1
    }
62
63
    /**
64
     * @param  string         $selector
65
     * @param  Query\Filters  $filters
66
     * @return Node[]
67
     */
68 1
    public function getArray($selector, Query\Filters $filters = null)
69
    {
70
        return $this->query(new Query\Css($selector, $filters));
71 1
    }
72
73
    /**
74
     * @param  string         $selector
75
     * @param  Query\Filters  $filters
76
     * @return Node[]
77
     */
78 1
    public function getLinkArray($selector, Query\Filters $filters = null)
79
    {
80
        return $this->query(new Query\Link($selector, $filters));
81 1
    }
82
83
    /**
84
     * @param  string         $selector
85
     * @param  Query\Filters  $filters
86
     * @return Node[]
87
     */
88 1
    public function getButtonArray($selector, Query\Filters $filters = null)
89
    {
90
        return $this->query(new Query\Button($selector, $filters));
91 1
    }
92
93
    /**
94
     * @param  string         $selector
95
     * @param  Query\Filters  $filters
96
     * @return Node[]
97
     */
98 1
    public function getFieldArray($selector, Query\Filters $filters = null)
99
    {
100
        return $this->query(new Query\Field($selector, $filters));
101 1
    }
102
103
    /**
104
     * @param  string         $selector
105
     * @param  Query\Filters  $filters
106
     * @return Node[]
107
     */
108 1
    public function getLabelArray($selector, Query\Filters $filters = null)
109
    {
110
        return $this->query(new Query\Label($selector, $filters));
111 1
    }
112
113
    /**
114
     * @param  string         $selector
115
     * @param  Query\Filters  $filters
116
     * @return Node
117
     */
118 1
    public function get($selector, Query\Filters $filters = null)
119
    {
120
        return $this->queryFirst(new Query\Css($selector, $filters));
121 1
    }
122
123
    /**
124
     * @param  string         $selector
125
     * @param  Query\Filters  $filters
126
     * @return Node
127
     */
128 1
    public function getLink($selector, Query\Filters $filters = null)
129
    {
130
        return $this->queryFirst(new Query\Link($selector, $filters));
131 1
    }
132
133
    /**
134
     * @param  string         $selector
135
     * @param  Query\Filters  $filters
136
     * @return Node
137
     */
138 1
    public function getButton($selector, Query\Filters $filters = null)
139
    {
140
        return $this->queryFirst(new Query\Button($selector, $filters));
141 1
    }
142
143
    /**
144
     * @param  string         $selector
145
     * @param  Query\Filters  $filters
146
     * @return Node
147
     */
148 1
    public function getField($selector, Query\Filters $filters = null)
149
    {
150
        return $this->queryFirst(new Query\Field($selector, $filters));
151 1
    }
152
153
    /**
154
     * @param  string         $selector
155
     * @param  Query\Filters  $filters
156
     * @return Node
157
     */
158 1
    public function getLabel($selector, Query\Filters $filters = null)
159
    {
160
        return $this->queryFirst(new Query\Label($selector, $filters));
161 1
    }
162
163
    /**
164
     * @param  string         $selector
165
     * @param  Query\Filters  $filters
166
     * @return self
167
     */
168 1
    public function clickOn($selector, Query\Filters $filters = null)
169
    {
170 1
        $this
171 1
            ->get($selector, $filters)
172
            ->click();
173
174 1
        return $this;
175 1
    }
176
177
    /**
178
     * @param  string         $selector
179
     * @param  Query\Filters  $filters
180
     * @return self
181
     */
182 1
    public function clickLink($selector, Query\Filters $filters = null)
183
    {
184 1
        $this
185 1
            ->getLink($selector, $filters)
186
            ->click();
187
188 1
        return $this;
189 1
    }
190
191
    /**
192
     * @param  string         $selector
193
     * @param  Query\Filters  $filters
194
     * @return self
195
     */
196 1
    public function clickButton($selector, Query\Filters $filters = null)
197
    {
198 1
        $this
199 1
            ->getButton($selector, $filters)
200
            ->click();
201
202 1
        return $this;
203 1
    }
204
205
    /**
206
     * @param  string         $selector
207
     * @param  mixed          $value
208
     * @param  Query\Filters  $filters
209
     * @return self
210
     */
211 1
    public function setField($selector, $value, Query\Filters $filters = null)
212
    {
213 1
        $this
214 1
            ->getField($selector, $filters)
215
            ->setValue($value);
216
217 1
        return $this;
218 1
    }
219
220
    /**
221
     * @param  string         $selector
222
     * @param  mixed          $file
223
     * @param  Query\Filters  $filters
224
     * @return self
225
     */
226 1
    public function setFieldFile($selector, $file, Query\Filters $filters = null)
227
    {
228 1
        $this
229 1
            ->getField($selector, $filters)
230
            ->setFile($file);
231
232 1
        return $this;
233 1
    }
234
235
    /**
236
     * @param  string $selector
237
     * @return self
238
     */
239 1
    public function check($selector, Query\Filters $filters = null)
240
    {
241 1
        $this
242 1
            ->getField($selector, $filters)
243
            ->click();
244
245 1
        return $this;
246 1
    }
247
248
    /**
249
     * @param  string $selector
250
     * @param  string         $selector
251
     * @param  Query\Filters  $filters
252
     * @return self
253
     */
254 1
    public function select($selector, $optionText, Query\Filters $filters = null)
255
    {
256 1
        $this
257 1
            ->getField($selector, $filters)
258
                ->get('option', new Query\Filters(['text' => $optionText]))
259
                    ->select();
260
261 1
        return $this;
262 1
    }
263
}
264