Completed
Pull Request — staging (#840)
by
unknown
19:58
created

BaseAsset   A

Complexity

Total Complexity 23

Size/Duplication

Total Lines 203
Duplicated Lines 4.43 %

Coupling/Cohesion

Components 2
Dependencies 2

Importance

Changes 0
Metric Value
dl 9
loc 203
rs 10
c 0
b 0
f 0
wmc 23
lcom 2
cbo 2

14 Methods

Rating   Name   Duplication   Size   Complexity  
A get_handle() 0 3 1
A register() 0 3 1
A enqueue() 0 3 1
A dequeue() 0 3 1
A deferred_action() 0 9 2
A get_register_action() 0 3 1
A get_enqueue_action() 0 3 2
A get_dequeue_action() 0 3 2
A normalize_source() 0 7 1
B check_for_minified_asset() 0 13 9
get_register_closure() 0 1 ?
get_enqueue_closure() 0 1 ?
get_dequeue_closure() 0 1 ?
A check_extension() 9 9 2

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
/**
3
 * YIKES Inc. Easy Mailchimp Forms Plugin.
4
 *
5
 * @package   YIKES\EasyForms
6
 * @author    Freddie Mixell
7
 * @license   GPL2
8
 */
9
10
namespace YIKES\EasyForms\Assets;
11
12
use Closure;
13
use YIKES\EasyForms\Exception\InvalidURI;
14
use YIKES\EasyForms\PluginHelper;
15
16
/**
17
 * Abstract class BaseAsset.
18
 *
19
 * @since   %VERSION%
20
 *
21
 * @package YIKES\EasyForms\Assets
22
 * @author  Freddie Mixell
23
 */
24
abstract class BaseAsset implements Asset {
25
26
	use PluginHelper;
27
28
	const REGISTER_PRIORITY = 1;
29
	const ENQUEUE_PRIORITY  = 10;
30
	const DEQUEUE_PRIORITY  = 20;
31
32
	/**
33
	 * Handle of the asset.
34
	 *
35
	 * @since %VERSION%
36
	 *
37
	 * @var string
38
	 */
39
	protected $handle;
40
41
	/**
42
	 * Get the handle of the asset.
43
	 *
44
	 * @since %VERSION%
45
	 *
46
	 * @return string
47
	 */
48
	public function get_handle() {
49
		return $this->handle;
50
	}
51
52
	/**
53
	 * Register the current Registerable.
54
	 *
55
	 * @since %VERSION%
56
	 */
57
	public function register() {
58
		$this->deferred_action( $this->get_register_action(), $this->get_register_closure(), static::REGISTER_PRIORITY );
59
	}
60
61
	/**
62
	 * Enqueue the asset.
63
	 *
64
	 * @since %VERSION%
65
	 */
66
	public function enqueue() {
67
		$this->deferred_action( $this->get_enqueue_action(), $this->get_enqueue_closure(), static::ENQUEUE_PRIORITY );
68
	}
69
70
	/**
71
	 * Dequeue the asset.
72
	 *
73
	 * @since %VERSION%
74
	 */
75
	public function dequeue() {
76
		$this->deferred_action( $this->get_dequeue_action(), $this->get_dequeue_closure(), static::DEQUEUE_PRIORITY );
77
	}
78
79
	/**
80
	 * Add a deferred action hook.
81
	 *
82
	 * If the action has already passed, the closure will be called directly.
83
	 *
84
	 * @since %VERSION%
85
	 *
86
	 * @param string  $action   Deferred action to hook to.
87
	 * @param Closure $closure  Closure to attach to the action.
88
	 * @param int     $priority Optional. Priority to use. Defaults to 10.
89
	 */
90
	protected function deferred_action( $action, $closure, $priority = 10 ) {
91
		if ( did_action( $action ) ) {
92
			$closure();
93
94
			return;
95
		}
96
97
		add_action( $action, $closure, $priority );
98
	}
99
100
	/**
101
	 * Get the register action to use.
102
	 *
103
	 * @since %VERSION%
104
	 *
105
	 * @return string Register action to use.
106
	 */
107
	protected function get_register_action() {
108
		return $this->get_enqueue_action();
109
	}
110
111
	/**
112
	 * Get the enqueue action to use.
113
	 *
114
	 * @since %VERSION%
115
	 *
116
	 * @return string Enqueue action name.
117
	 */
118
	protected function get_enqueue_action() {
119
		return is_admin() ? 'admin_enqueue_scripts' : 'wp_enqueue_scripts';
120
	}
121
122
	/**
123
	 * Get the dequeue action to use.
124
	 *
125
	 * @since %VERSION%
126
	 *
127
	 * @return string Enqueue action name.
128
	 */
129
	protected function get_dequeue_action() {
130
		return is_admin() ? 'admin_print_scripts' : 'wp_print_scripts';
131
	}
132
133
	/**
134
	 * Normalize the source URI.
135
	 *
136
	 * @since %VERSION%
137
	 *
138
	 * @param string $uri       Source URI to normalize.
139
	 * @param string $extension Default extension to use.
140
	 *
141
	 * @return string Normalized source URI.
142
	 */
143
	protected function normalize_source( $uri, $extension ) {
144
		$uri  = $this->check_extension( $uri, $extension );
145
		$path = trailingslashit( $this->get_root_dir() ) . $uri;
146
		$uri  = $this->get_plugin_url( $uri );
147
148
		return $this->check_for_minified_asset( $uri, $path, $extension );
149
	}
150
151
	/**
152
	 * Return the URI of the minified asset if it is readable and
153
	 * `SCRIPT_DEBUG` is not set.
154
	 *
155
	 * @since %VERSION%
156
	 *
157
	 * @param string $uri       Source URI.
158
	 * @param string $path      Source path.
159
	 * @param string $extension Default extension to use.
160
	 *
161
	 * @return string URI of the asset to use.
162
	 * @throws InvalidURI When the file specified by $path isn't readable.
163
	 */
164
	protected function check_for_minified_asset( $uri, $path, $extension ) {
165
		$debug         = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG;
166
		$minified_uri  = str_replace( ".$extension", ".min.{$extension}", $uri );
167
		$minified_path = str_replace( ".$extension", ".min.{$extension}", $path );
168
169
		// If both the regular and minified path aren't readable, that might mean that build scripts need to run.
170
		if ( ! is_readable( $path ) && ! is_readable( $minified_path ) ) {
171
			throw InvalidURI::from_asset_path( $path );
172
		}
173
174
		// If we're not in debug mode and we have a minified asset, or we're in a debug mode and we don't have an unminified asset but we have a minified asset, return the minified.
175
		return ! $debug && is_readable( $minified_path ) || $debug && ! is_readable( $path ) && is_readable( $minified_path ) ? $minified_uri : $uri;
176
	}
177
178
	/**
179
	 * Check that the URI has the correct extension.
180
	 *
181
	 * Optionally adds the extension if none was detected.
182
	 *
183
	 * @since %VERSION%
184
	 *
185
	 * @param string $uri       URI to check the extension of.
186
	 * @param string $extension Extension to use.
187
	 *
188
	 * @return string URI with correct extension.
189
	 */
190 View Code Duplication
	public function check_extension( $uri, $extension ) {
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...
191
		$detected_extension = pathinfo( $uri, PATHINFO_EXTENSION );
192
193
		if ( $extension !== $detected_extension ) {
194
			$uri .= '.' . $extension;
195
		}
196
197
		return $uri;
198
	}
199
200
	/**
201
	 * Get the enqueue closure to use.
202
	 *
203
	 * @since %VERSION%
204
	 *
205
	 * @return Closure
206
	 */
207
	abstract protected function get_register_closure();
208
209
	/**
210
	 * Get the enqueue closure to use.
211
	 *
212
	 * @since %VERSION%
213
	 *
214
	 * @return Closure
215
	 */
216
	abstract protected function get_enqueue_closure();
217
218
	/**
219
	 * Get the dequeue closure to use.
220
	 *
221
	 * @since %VERSION%
222
	 *
223
	 * @return Closure
224
	 */
225
	abstract protected function get_dequeue_closure();
226
}
227