Completed
Pull Request — master (#488)
by Helpful
1295:51 queued 1292:33
created

DeploymentStrategy::toJSON()   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 0
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
		return $this->changes[$title] = array(
111
			'from' => $from,
112
			'to' => $to
113
		);
114
	}
115
116
	/**
117
	 * @param string $title
118
	 * @param string $desc
119
	 */
120
	public function setChangeDescriptionOnly($title, $desc) {
121
		return $this->changes[$title] = array(
122
			'description' => $desc
123
		);
124
	}
125
126
	/**
127
	 * Filter the changeset where modification was not required.
128
	 *
129
	 * @return array
130
	 */
131
	public function getChangesModificationNeeded() {
132
		$filtered = [];
133
		foreach ($this->changes as $change => $details) {
134
			if (array_key_exists('description', $details)) {
135
				$filtered[$change] = $details;
136
			} else if (
137
				(array_key_exists('from', $details) || array_key_exists('to', $details))
138
				&& $details['from'] !== $details['to']
139
			) {
140
				$filtered[$change] = $details;
141
			}
142
		}
143
144
		return $filtered;
145
	}
146
147
	/**
148
	 * @return array Associative array of changes, e.g.
149
	 *	array(
150
	 *		'SHA' => array(
151
	 *			'from' => 'abc',
152
	 *			'to' => 'def'
153
	 *		)
154
	 *	)
155
	 */
156
	public function getChanges() {
157
		return $this->changes;
158
	}
159
160
	/**
161
	 * Returns a change or a given key.
162
	 *
163
	 * @return ArrayData|null
164
	 */
165
	public function getChange($key) {
166
		$changes = $this->getChanges();
167
		if(array_key_exists($key, $changes)) {
168
			return new ArrayData($changes[$key]);
169
		}
170
		return null;
171
	}
172
173
	/**
174
	 * @param string $option
175
	 * @param string $value
176
	 */
177
	public function setOption($option, $value) {
178
		$this->options[$option] = $value;
179
	}
180
181
	/**
182
	 * @param string $option
183
	 * @return string|null
184
	 */
185
	public function getOption($option) {
186
		if(!empty($this->options[$option])) {
187
			return $this->options[$option];
188
		}
189
	}
190
191
	/**
192
	 * @return string
193
	 */
194
	public function getOptions() {
195
		return $this->options;
196
	}
197
198
	/**
199
	 * @param string $code
200
	 */
201
	public function setValidationCode($code) {
202
		$this->validationCode = $code;
203
	}
204
205
	/**
206
	 * @return string
207
	 */
208
	public function getValidationCode() {
209
		return $this->validationCode;
210
	}
211
212
	/**
213
	 * @param string $msg
214
	 */
215
	public function setMessage($msg, $code = self::ERROR_CODE) {
216
		$this->messages[] = [
217
			'text' => $msg,
218
			'code' => $code
219
		];
220
221
		$current = $this->getValidationCode();
222
		$map = [
223
			DeploymentStrategy::SUCCESS_CODE => 0,
224
			DeploymentStrategy::WARNING_CODE => 1,
225
			DeploymentStrategy::ERROR_CODE => 2
226
		];
227
		if($map[$current] < $map[$code]) {
228
			$this->setValidationCode($code);
229
		}
230
	}
231
232
	/**
233
	 * @return array
234
	 */
235
	public function getMessages() {
236
		return $this->messages;
237
	}
238
239
	/**
240
	 * Transform the deployment strategy to an array.
241
	 *
242
	 * @return array
243
	 */
244 View Code Duplication
	public function toArray() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
245
		$fields = array(
246
			'actionTitle',
247
			'actionCode',
248
			'estimatedTime',
249
			'changes',
250
			'options',
251
			'validationCode',
252
			'messages'
253
		);
254
255
		$output = array();
256
		foreach($fields as $field) {
257
			$output[$field] = $this->$field;
258
		}
259
		return $output;
260
	}
261
262
	/**
263
	 * @return string
264
	 */
265
	public function toJSON() {
266
		return json_encode($this->toArray(), JSON_PRETTY_PRINT);
267
	}
268
269
	/**
270
	 * Load from JSON associative array.
271
	 * Environment must be set by the callee when creating this object.
272
	 *
273
	 * @param string $json
274
	 */
275
	public function fromJSON($json) {
276
		$decoded = json_decode($json, true);
277
		return $this->fromArray($decoded);
278
	}
279
280
	/**
281
	 * Load from array.
282
	 * Environment must be set by the callee when creating this object.
283
	 *
284
	 * @param string $data
285
	 */
286 View Code Duplication
	public function fromArray($data) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
287
		$fields = array(
288
			'actionTitle',
289
			'actionCode',
290
			'estimatedTime',
291
			'changes',
292
			'options',
293
			'validationCode',
294
			'messages'
295
		);
296
297
		foreach($fields as $field) {
298
			if(!empty($data[$field])) {
299
				$this->$field = $data[$field];
300
			}
301
		}
302
	}
303
304
	/**
305
	 * @return DNDeployment
306
	 */
307
	public function createDeployment() {
308
		$deployment = DNDeployment::create();
309
		$deployment->EnvironmentID = $this->environment->ID;
310
		// Pull out the SHA from the options so we can make it queryable.
311
		$deployment->SHA = $this->getOption('sha');
312
		$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...
313
		$deployment->write();
314
315
		return $deployment;
316
	}
317
318
}
319
320