Passed
Push — master ( fdc038...0227c6 )
by litefeel
02:32
created

Writing_On_GitHub_Import   B

Complexity

Total Complexity 50

Size/Duplication

Total Lines 311
Duplicated Lines 0 %

Coupling/Cohesion

Dependencies 9

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
dl 0
loc 311
ccs 0
cts 138
cp 0
rs 8.6206
c 0
b 0
f 0
wmc 50
cbo 9

11 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A payload() 0 19 4
C import_files() 0 32 7
A importable_file() 0 13 3
A importable_post() 0 19 2
A master() 0 19 4
A delete_post() 0 12 3
B import_post() 0 28 6
A importable_raw_file() 0 12 3
A import_raw_file() 0 17 4
C blob_to_post() 0 54 13

How to fix   Complexity   

Complex Class

Complex classes like Writing_On_GitHub_Import often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Writing_On_GitHub_Import, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * GitHub Import Manager
4
 *
5
 * @package Writing_On_GitHub
6
 */
7
8
/**
9
 * Class Writing_On_GitHub_Import
10
 */
11
class Writing_On_GitHub_Import {
12
13
    /**
14
     * Application container.
15
     *
16
     * @var Writing_On_GitHub
17
     */
18
    protected $app;
19
20
    /**
21
     * Initializes a new import manager.
22
     *
23
     * @param Writing_On_GitHub $app Application container.
24
     */
25
    public function __construct( Writing_On_GitHub $app ) {
26
        $this->app = $app;
27
    }
28
29
    /**
30
     * Imports a payload.
31
     * @param  Writing_On_GitHub_Payload $payload
32
     *
33
     * @return string|WP_Error
34
     */
35
    public function payload( Writing_On_GitHub_Payload $payload ) {
36
37
        $result = $this->app->api()->fetch()->compare( $payload->get_before_commit_id() );
38
39
        if ( is_wp_error( $result ) ) {
40
            /* @var WP_Error $result */
41
            return $result;
42
        }
43
44
        if ( is_array( $result ) ) {
45
            $result = $this->import_files( $result );
46
        }
47
48
        if ( is_wp_error( $result ) ) {
49
            return $files;
50
        }
51
52
        return __( 'Payload processed', 'writing-on-github' );
53
    }
54
55
    /**
56
     * import blob by files
57
     * @param  Writing_On_GitHub_File_Info[] $files
58
     *
59
     * @return true|WP_Error
0 ignored issues
show
Documentation introduced by
Should the return type not be WP_Error|boolean?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
60
     */
61
    protected function import_files( $files ) {
62
63
        $error = true;
64
65
        foreach ( $files as $file ) {
66
            if ( ! $this->importable_file( $file ) ) {
67
                continue;
68
            }
69
70
            $blob = $this->app->api()->fetch()->blob( $file );
71
            // network error ?
72
            if ( ! $blob instanceof Writing_On_GitHub_Blob ) {
73
                continue;
74
            }
75
76
            $is_remove = 'removed' == $file->status;
77
78
            $result = false;
79
            if ( $this->importable_raw_file( $blob ) ) {
80
                $result = $this->import_raw_file( $blob, $is_remove );
81
            } elseif ( $this->importable_post( $blob ) ) {
82
                $result = $this->import_post( $blob, $is_remove );
0 ignored issues
show
Unused Code introduced by
The call to Writing_On_GitHub_Import::import_post() has too many arguments starting with $is_remove.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
83
            }
84
85
            if ( is_wp_error( $result ) ) {
86
                /* @var WP_Error $result */
87
                $error = wogh_append_error( $error, $result );
88
            }
89
        }
90
91
        return $error;
92
    }
93
94
    /**
95
     * Imports the latest commit on the master branch.
96
     *
97
     * @return string|WP_Error
98
     */
99
    public function master() {
100
        $result = $this->app->api()->fetch()->tree_recursive();
101
102
        if ( is_wp_error( $result ) ) {
103
            /* @var WP_Error $result */
104
            return $result;
105
        }
106
107
        if ( is_array( $result ) ) {
108
            $result = $this->import_files( $result );
109
        }
110
111
        if ( is_wp_error( $result ) ) {
112
            /* @var WP_Error $result */
113
            return $result;
114
        }
115
116
        return __( 'Payload processed', 'writing-on-github' );
117
    }
118
119
    /**
120
     * Checks whether the provided blob should be imported.
121
     *
122
     * @param Writing_On_GitHub_File_Info $file
123
     *
124
     * @return bool
125
     */
126
    protected function importable_file( Writing_On_GitHub_File_Info $file ) {
127
128
        $path = $file->path;
129
130
        // only _pages, _posts and images
131
        $prefixs = array( '_pages/', '_posts/', 'images/');
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
132
        foreach ($prefixs as $prefix) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
133
            if ( ! strncasecmp($path, $prefix, strlen( $prefix ) ) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
134
                return true;
135
            }
136
        }
137
        return false;
138
    }
139
140
    /**
141
     * Checks whether the provided blob should be imported.
142
     *
143
     * @param Writing_On_GitHub_Blob $blob Blob to validate.
144
     *
145
     * @return bool
146
     */
147
    protected function importable_post( Writing_On_GitHub_Blob $blob ) {
148
        // global $wpdb;
149
150
        // // Skip the repo's readme.
151
        // if ( 'readme' === strtolower( substr( $blob->path(), 0, 6 ) ) ) {
152
        //  return false;
153
        // }
154
155
        // // If the blob sha already matches a post, then move on.
156
        // if ( ! is_wp_error( $this->app->database()->fetch_by_sha( $blob->sha() ) ) ) {
157
        //  return false;
158
        // }
159
160
        if ( ! $blob->has_frontmatter() ) {
0 ignored issues
show
Unused Code introduced by
This if statement, and the following return statement can be replaced with return $blob->has_frontmatter();.
Loading history...
161
            return false;
162
        }
163
164
        return true;
165
    }
166
167
    /**
168
     * Delete post
169
     * @param  Writing_On_GitHub_Blob $blob
170
     * @return WP_Error|bool
171
     */
172
    protected function delete_post( Writing_On_GitHub_Blob $blob ) {
173
        $id = $blob->id();
174
        if ( empty( $id ) ) {
175
            return false;
176
        }
177
        $result = $this->app->database()->delete_post( $id );
178
        if ( is_wp_error( $result ) ) {
179
            /* @var WP_Error $result */
180
            return $result;
181
        }
182
        return true;
183
    }
184
185
    /**
186
     * Imports a post into wordpress
187
     * @param  Writing_On_GitHub_Blob $blob
188
     * @return WP_Error|bool
189
     */
190
    protected function import_post( Writing_On_GitHub_Blob $blob ) {
191
        $post = $this->blob_to_post( $blob );
192
193
        if ( ! $post instanceof Writing_On_GitHub_Post ) {
194
            return false;
195
        }
196
197
        $result = $this->app->database()->save_post( $post );
198
        if ( is_wp_error( $result ) ) {
199
            /** @var WP_Error $result */
200
            return $result;
201
        }
202
203
        if ( $post->is_new() ||
204
                ! wogh_equal_front_matter( $post, $blob ) ) {
205
206
            $result = $this->app->export()->new_posts( array( $post ) );
207
208
            if ( is_wp_error( $result ) ) {
209
                /** @var WP_Error $result */
210
                return $result;
211
            }
212
        }
213
214
        clean_post_cache( $post->id() );
215
216
        return true;
217
    }
218
219
    /**
220
     * import raw file
221
     * @param  Writing_On_GitHub_Blob $blob
222
     * @return bool
223
     */
224
    protected function importable_raw_file( Writing_On_GitHub_Blob $blob ) {
225
        if ( $blob->has_frontmatter() ) {
226
            return false;
227
        }
228
229
        // only images
230
        if ( strncasecmp($blob->path(), 'images/', strlen('images/') ) != 0) {
0 ignored issues
show
Unused Code introduced by
This if statement, and the following return statement can be replaced with return !(strncasecmp($bl...rlen('images/')) != 0);.
Loading history...
introduced by
Found "!= 0". Use Yoda Condition checks, you must
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
231
            return false;
232
        }
233
234
        return true;
235
    }
236
237
    /**
238
     * Imports a raw file content into file system.
239
     * @param  Writing_On_GitHub_Blob $blob
240
     * @param  bool                   $is_remove
241
     */
242
    protected function import_raw_file( Writing_On_GitHub_Blob $blob, $is_remove ) {
243
        $arr = wp_upload_dir();
244
        $path = $arr['basedir'] . '/writing-on-github/' . $blob->path();
245
        if ( $is_remove ) {
246
            if ( file_exists($path) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
247
                unlink($path);
0 ignored issues
show
introduced by
Filesystem writes are forbidden, you should not be using unlink()
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
248
            }
249
        } else {
250
            $dirname = dirname($path);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
251
            if ( ! file_exists($dirname) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
252
                wp_mkdir_p($dirname);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
253
            }
254
255
            file_put_contents($path, $blob->content());
0 ignored issues
show
introduced by
Filesystem writes are forbidden, you should not be using file_put_contents()
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
256
        }
257
        return true;
258
    }
259
260
    /**
261
     * Imports a single blob content into matching post.
262
     *
263
     * @param Writing_On_GitHub_Blob $blob Blob to transform into a Post.
264
     *
265
     * @return Writing_On_GitHub_Post|false
266
     */
267
    protected function blob_to_post( Writing_On_GitHub_Blob $blob ) {
0 ignored issues
show
Complexity introduced by
This operation has 582 execution paths which exceeds the configured maximum of 200.

A high number of execution paths generally suggests many nested conditional statements and make the code less readible. This can usually be fixed by splitting the method into several smaller methods.

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

Loading history...
268
        $args = array( 'post_content' => $blob->content_import() );
269
        $meta = $blob->meta();
270
271
        $id = false;
272
273
        if ( ! empty( $meta ) ) {
274
            if ( array_key_exists( 'layout', $meta ) ) {
275
                $args['post_type'] = $meta['layout'];
276
                unset( $meta['layout'] );
277
            }
278
279
            if ( array_key_exists( 'published', $meta ) ) {
280
                $args['post_status'] = true === $meta['published'] ? 'publish' : 'draft';
281
                unset( $meta['published'] );
282
            }
283
284
            if ( array_key_exists( 'post_title', $meta ) ) {
285
                $args['post_title'] = $meta['post_title'];
286
                unset( $meta['post_title'] );
287
            }
288
289
            if ( array_key_exists( 'post_name', $meta ) ) {
290
                $args['post_name'] = $meta['post_name'];
291
                unset( $meta['post_name'] );
292
            }
293
294
            if ( array_key_exists( 'ID', $meta ) ) {
295
                $id = $args['ID'] = $meta['ID'];
296
                $blob->set_id($id);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
297
                unset( $meta['ID'] );
298
            }
299
        }
300
301
        $meta['_wogh_sha'] = $blob->sha();
302
303
        if ( $id ) {
304
            $old_sha = get_post_meta( $id, '_wogh_sha', true );
305
            $old_github_path = get_post_meta( $id, '_wogh_github_path', true );
306
307
            // dont save post when has same sha
308
            if ( $old_sha  && $old_sha == $meta['_wogh_sha'] &&
309
                 $old_github_path && $old_github_path == $blob->path() ) {
310
                return false;
311
            }
312
        }
313
314
        $post = new Writing_On_GitHub_Post( $args, $this->app->api() );
315
        $post->set_old_github_path( $blob->path() );
316
        $post->set_meta( $meta );
317
        $blob->set_id( $post->id() );
318
319
        return $post;
320
    }
321
}
322