Completed
Pull Request — master (#525)
by Sean
03:16
created

DeploymentStrategy::setActionTitle()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 3
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
class DeploymentStrategy extends ViewableData {
4
5
	const SUCCESS_CODE = 'success';
6
7
	const WARNING_CODE = 'warning';
8
9
	const ERROR_CODE = 'error';
10
11
	/**
12
	 * @var DNEnvironment
13
	 */
14
	protected $environment;
15
16
	/**
17
	 * @var string
18
	 */
19
	protected $actionTitle = 'Deploy';
20
21
	/**
22
	 * @var string
23
	 */
24
	protected $actionCode = 'default';
25
26
	/**
27
	 * @var int
28
	 */
29
	protected $estimatedTime = 0;
30
31
	/**
32
	 * @var array
33
	 */
34
	protected $changes = [];
35
36
	/**
37
	 * @var array
38
	 */
39
	protected $options;
40
41
	/**
42
	 * Validation code
43
	 *
44
	 * @var string
45
	 */
46
	protected $validationCode = DeploymentStrategy::SUCCESS_CODE;
47
48
	/**
49
	 * @var array
50
	 */
51
	protected $messages = [];
52
53
54
	/**
55
	 * @param DNEnvironment $environment
56
	 * @param array $options
57
	 */
58
	public function __construct(DNEnvironment $environment, $options = array()) {
59
		$this->environment = $environment;
60
		$this->options = $options;
61
	}
62
63
	/**
64
	 * @param string $title
65
	 */
66
	public function setActionTitle($title) {
67
		$this->actionTitle = $title;
68
	}
69
70
	/**
71
	 * @return string
72
	 */
73
	public function getActionTitle() {
74
		return $this->actionTitle;
75
	}
76
77
	/**
78
	 */
79
	public function setActionCode($code) {
80
		$this->actionCode = $code;
81
	}
82
83
	/**
84
	 * @return string
85
	 */
86
	public function getActionCode() {
87
		return $this->actionCode;
88
	}
89
90
	/**
91
	 * @param int
92
	 */
93
	public function setEstimatedTime($seconds) {
94
		$this->estimatedTime = $seconds;
95
	}
96
97
	/**
98
	 * @return int Time in minutes
99
	 */
100
	public function getEstimatedTime() {
101
		return $this->estimatedTime;
102
	}
103
104
	/**
105
	 * @param string $title
106
	 * @param string $from
107
	 * @param string $to
108
	 */
109
	public function setChange($title, $from, $to) {
110
		// Normalise "empty" values into dashes so comparisons are done properly.
111
		// This means there is no diference between an empty string and a null
112
		// but "0" is considered to be non-empty.
113
		if(empty($from) && !strlen($from)) $from = '-';
114
		if(empty($to) && !strlen($from)) $to = '-';
115
116
		return $this->changes[$title] = array(
117
			'from' => $from,
118
			'to' => $to
119
		);
120
	}
121
122
	/**
123
	 * @param string $title
124
	 * @param string $desc
125
	 */
126
	public function setChangeDescriptionOnly($title, $desc) {
127
		return $this->changes[$title] = array(
128
			'description' => $desc
129
		);
130
	}
131
132
	/**
133
	 * Filter the changeset where modification was not required.
134
	 *
135
	 * @return array
136
	 */
137
	public function getChangesModificationNeeded() {
138
		$filtered = [];
139
		foreach ($this->getChanges() as $change => $details) {
140
			if (array_key_exists('description', $details)) {
141
				$filtered[$change] = $details;
142
			} else if (
143
				(array_key_exists('from', $details) || array_key_exists('to', $details))
144
				&& $details['from'] !== $details['to']
145
			) {
146
				$filtered[$change] = $details;
147
			}
148
		}
149
150
		return $filtered;
151
	}
152
153
	/**
154
	 * @return array Associative array of changes, e.g.
155
	 *	array(
156
	 *		'SHA' => array(
157
	 *			'from' => 'abc',
158
	 *			'to' => 'def'
159
	 *		)
160
	 *	)
161
	 */
162
	public function getChanges() {
163
		// Normalise "empty" values into dashes so comparisons are done properly.
164
		// This means there is no diference between an empty string and a null
165
		// but "0" is considered to be non-empty.
166
		$changes = $this->changes;
167
		foreach($changes as $field => $events) {
168
			foreach($events as $event => $value) {
169
				if(empty($value) && !strlen($value)) {
170
					$changes[$field][$event] = '-';
171
				}
172
			}
173
		}
174
		return $changes;
175
	}
176
177
	/**
178
	 * Returns a change or a given key.
179
	 *
180
	 * @return ArrayData|null
181
	 */
182
	public function getChange($key) {
183
		$changes = $this->getChanges();
184
		if(array_key_exists($key, $changes)) {
185
			return new ArrayData($changes[$key]);
186
		}
187
		return null;
188
	}
189
190
	/**
191
	 * @param string $option
192
	 * @param string $value
193
	 */
194
	public function setOption($option, $value) {
195
		$this->options[$option] = $value;
196
	}
197
198
	/**
199
	 * @param string $option
200
	 * @return string|null
201
	 */
202
	public function getOption($option) {
203
		if(!empty($this->options[$option])) {
204
			return $this->options[$option];
205
		}
206
	}
207
208
	/**
209
	 * @return string
210
	 */
211
	public function getOptions() {
212
		return $this->options;
213
	}
214
215
	/**
216
	 * @param string $code
217
	 */
218
	public function setValidationCode($code) {
219
		$this->validationCode = $code;
220
	}
221
222
	/**
223
	 * @return string
224
	 */
225
	public function getValidationCode() {
226
		return $this->validationCode;
227
	}
228
229
	/**
230
	 * @param string $msg
231
	 */
232
	public function setMessage($msg, $code = self::ERROR_CODE) {
233
		$this->messages[] = [
234
			'text' => $msg,
235
			'code' => $code
236
		];
237
238
		$current = $this->getValidationCode();
239
		$map = [
240
			DeploymentStrategy::SUCCESS_CODE => 0,
241
			DeploymentStrategy::WARNING_CODE => 1,
242
			DeploymentStrategy::ERROR_CODE => 2
243
		];
244
		if($map[$current] < $map[$code]) {
245
			$this->setValidationCode($code);
246
		}
247
	}
248
249
	/**
250
	 * @return array
251
	 */
252
	public function getMessages() {
253
		return $this->messages;
254
	}
255
256
	/**
257
	 * Transform the deployment strategy to an array.
258
	 *
259
	 * @return array
260
	 */
261
	public function toArray() {
262
		$fields = array(
263
			'actionTitle',
264
			'actionCode',
265
			'estimatedTime',
266
			'changes',
267
			'options',
268
			'validationCode',
269
			'messages'
270
		);
271
272
		$output = array();
273
		foreach($fields as $field) {
274
			if(method_exists($this, 'get' . $field)) {
275
				$output[$field] = $this->{'get' . $field}();
276
			} else {
277
				$output[$field] = $this->$field;
278
			}
279
		}
280
		return $output;
281
	}
282
283
	/**
284
	 * @return string
285
	 */
286
	public function toJSON() {
287
		return json_encode($this->toArray(), JSON_PRETTY_PRINT);
288
	}
289
290
	/**
291
	 * Load from JSON associative array.
292
	 * Environment must be set by the callee when creating this object.
293
	 *
294
	 * @param string $json
295
	 */
296
	public function fromJSON($json) {
297
		$decoded = json_decode($json, true);
298
		return $this->fromArray($decoded);
299
	}
300
301
	/**
302
	 * Load from array.
303
	 * Environment must be set by the callee when creating this object.
304
	 *
305
	 * @param string $data
306
	 */
307
	public function fromArray($data) {
308
		$fields = array(
309
			'actionTitle',
310
			'actionCode',
311
			'estimatedTime',
312
			'changes',
313
			'options',
314
			'validationCode',
315
			'messages'
316
		);
317
318
		foreach($fields as $field) {
319
			if(!empty($data[$field])) {
320
				$this->$field = $data[$field];
321
			}
322
		}
323
	}
324
325
	/**
326
	 * @return DNDeployment
327
	 */
328
	public function createDeployment() {
329
		$deployment = DNDeployment::create();
330
		$deployment->EnvironmentID = $this->environment->ID;
331
		// Pull out the SHA from the options so we can make it queryable.
332
		$deployment->SHA = $this->getOption('sha');
333
		$deployment->Strategy = $this->toJSON();
0 ignored issues
show
Documentation introduced by
The property Strategy does not exist on object<DNDeployment>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
334
		$deployment->write();
335
336
		return $deployment;
337
	}
338
339
}
340
341