Completed
Pull Request — develop (#1760)
by
unknown
18:24
created
includes/class-admin-installer.php 1 patch
Indentation   +94 added lines, -94 removed lines patch added patch discarded remove patch
@@ -66,9 +66,9 @@  discard block
 block discarded – undo
66 66
 	 */
67 67
 	public function add_downloads_data_filters() {
68 68
 
69
-	    $downloads_data = get_site_transient( self::DOWNLOADS_DATA_TRANSIENT );
69
+		$downloads_data = get_site_transient( self::DOWNLOADS_DATA_TRANSIENT );
70 70
 
71
-	    if ( ! $downloads_data && ! isset( $_GET['cache'] ) ) {
71
+		if ( ! $downloads_data && ! isset( $_GET['cache'] ) ) {
72 72
 			return;
73 73
 		}
74 74
 
@@ -97,7 +97,7 @@  discard block
 block discarded – undo
97 97
 	 */
98 98
 	public function add_admin_menu() {
99 99
 
100
-	    $menu_text = _x( 'Manage Add-Ons', 'Extensions are WordPress plugins that add functionality to GravityView and Gravity Forms', 'gravityview' );
100
+		$menu_text = _x( 'Manage Add-Ons', 'Extensions are WordPress plugins that add functionality to GravityView and Gravity Forms', 'gravityview' );
101 101
 
102 102
 		$menu_text = sprintf( '<span title="%s" style="margin: 0">%s</span>', esc_attr__( 'Plugins that extend GravityView and Gravity Forms functionality.', 'gravityview' ), $menu_text );
103 103
 
@@ -112,8 +112,8 @@  discard block
 block discarded – undo
112 112
 	}
113 113
 
114 114
 	/**
115
-     * When on the Installer page, show a different notice than on the Settings page
116
-     *
115
+	 * When on the Installer page, show a different notice than on the Settings page
116
+	 *
117 117
 	 * @param array $notice
118 118
 	 *
119 119
 	 * @return string License notice
@@ -121,10 +121,10 @@  discard block
 block discarded – undo
121 121
 	public function maybe_modify_license_notice( $notice = '' ) {
122 122
 
123 123
 		if ( ! gravityview()->request->is_admin( '', 'downloads' ) ) {
124
-            return $notice;
125
-        }
124
+			return $notice;
125
+		}
126 126
 
127
-        return esc_html__( 'Your license %s. Do you want access to these plugins? %sActivate your license%s or %sget a license here%s.', 'gravityview' );
127
+		return esc_html__( 'Your license %s. Do you want access to these plugins? %sActivate your license%s or %sget a license here%s.', 'gravityview' );
128 128
 	}
129 129
 
130 130
 	/**
@@ -167,43 +167,43 @@  discard block
 block discarded – undo
167 167
 	 * Get downloads data from transient or from API; save transient after getting data from API
168 168
 	 *
169 169
 	 * @return WP_Error|array If error, returns WP_Error. If not valid JSON, empty array. Otherwise, this structure: {
170
-     *   @type array  $info {
171
-     *       @type string $id int 17
172
-     *       @type string $slug Extension slug
173
-     *       @type string $title Extension title
174
-     *       @type string $create_date in '2018-07-19 20:03:10' format
175
-     *       @type string $modified_date
176
-     *       @type string $status
177
-     *       @type string $link URL to public plugin page
178
-     *       @type string $content
179
-     *       @type string $excerpt
180
-     *       @type string $thumbnail URL to thumbnail
181
-     *       @type array  $category Taxonomy details for the plugin's category {
182
-     *         @type int $term_id => int 30
183
-     *         @type string $name => string 'Plugins' (length=7)
184
-     *         @type string $slug => string 'plugins' (length=7)
185
-     *         @type int $term_group => int 0
186
-     *         @type int $term_taxonomy_id => int 30
187
-     *         @type string $taxonomy => string 'download_category' (length=17)
188
-     *         @type string $description => string '' (length=0)
189
-     *         @type int $parent => int 0
190
-     *         @type int $count => int 4
191
-     *         @type string $filter => string 'raw' (length=3)
192
-     *       }
193
-     *       @type array $tags {see $category above}
194
-     *       @type string $textdomain string 'gravityview' (length=11)
195
-     *   }
196
-     *   @type array $pricing array of `price_name_slugs` => '00.00' values, if price options exist
197
-     *   @type array $licensing {
198
-     *       @type bool   $enabled Is licensing enabled for the extension
199
-     *       @type string $version Version number
200
-     *       @type string $exp_unit Expiration unit ('years')
201
-     *       @type string $exp_length Expiration length ('1')
202
-     *   }
203
-     *   @type array $files Array of files. Empty if user has no access to the file. {
204
-     *       @type string $file string URL of the file download
205
-     *   }
206
-     * }
170
+	 *   @type array  $info {
171
+	 *       @type string $id int 17
172
+	 *       @type string $slug Extension slug
173
+	 *       @type string $title Extension title
174
+	 *       @type string $create_date in '2018-07-19 20:03:10' format
175
+	 *       @type string $modified_date
176
+	 *       @type string $status
177
+	 *       @type string $link URL to public plugin page
178
+	 *       @type string $content
179
+	 *       @type string $excerpt
180
+	 *       @type string $thumbnail URL to thumbnail
181
+	 *       @type array  $category Taxonomy details for the plugin's category {
182
+	 *         @type int $term_id => int 30
183
+	 *         @type string $name => string 'Plugins' (length=7)
184
+	 *         @type string $slug => string 'plugins' (length=7)
185
+	 *         @type int $term_group => int 0
186
+	 *         @type int $term_taxonomy_id => int 30
187
+	 *         @type string $taxonomy => string 'download_category' (length=17)
188
+	 *         @type string $description => string '' (length=0)
189
+	 *         @type int $parent => int 0
190
+	 *         @type int $count => int 4
191
+	 *         @type string $filter => string 'raw' (length=3)
192
+	 *       }
193
+	 *       @type array $tags {see $category above}
194
+	 *       @type string $textdomain string 'gravityview' (length=11)
195
+	 *   }
196
+	 *   @type array $pricing array of `price_name_slugs` => '00.00' values, if price options exist
197
+	 *   @type array $licensing {
198
+	 *       @type bool   $enabled Is licensing enabled for the extension
199
+	 *       @type string $version Version number
200
+	 *       @type string $exp_unit Expiration unit ('years')
201
+	 *       @type string $exp_length Expiration length ('1')
202
+	 *   }
203
+	 *   @type array $files Array of files. Empty if user has no access to the file. {
204
+	 *       @type string $file string URL of the file download
205
+	 *   }
206
+	 * }
207 207
 	 */
208 208
 	public function get_downloads_data() {
209 209
 
@@ -235,7 +235,7 @@  discard block
 block discarded – undo
235 235
 		) );
236 236
 
237 237
 		if ( is_wp_error( $response ) ) {
238
-		    gravityview()->log->error( "Extension data response is an error", array( 'data' => $response ) );
238
+			gravityview()->log->error( "Extension data response is an error", array( 'data' => $response ) );
239 239
 			return $response;
240 240
 		}
241 241
 
@@ -288,10 +288,10 @@  discard block
 block discarded – undo
288 288
                 <div class="gv-admin-installer-notice notice inline error">
289 289
                     <h3><?php esc_html_e( 'Extensions and plugins data cannot be loaded at the moment. Please try again later.', 'gravityview' ); ?></h3>
290 290
                     <?php
291
-                    if ( is_wp_error( $downloads_data ) ) {
292
-	                    echo wpautop( '<pre>' . esc_html( $downloads_data->get_error_message() ) . '</pre>' );
293
-                    }
294
-                    ?>
291
+					if ( is_wp_error( $downloads_data ) ) {
292
+						echo wpautop( '<pre>' . esc_html( $downloads_data->get_error_message() ) . '</pre>' );
293
+					}
294
+					?>
295 295
                 </div>
296 296
             </div>
297 297
 			<?php
@@ -381,9 +381,9 @@  discard block
 block discarded – undo
381 381
 	 */
382 382
 	protected function render_download( $download, $wp_plugins ) {
383 383
 
384
-        $details = $this->get_download_display_details( $download, $wp_plugins );
384
+		$details = $this->get_download_display_details( $download, $wp_plugins );
385 385
 
386
-        $download_info = $details['download_info'];
386
+		$download_info = $details['download_info'];
387 387
 
388 388
 		?>
389 389
         <div class="item <?php echo esc_attr( $details['item_class'] ); ?>">
@@ -407,45 +407,45 @@  discard block
 block discarded – undo
407 407
 
408 408
                 <div class="addon-excerpt"><?php
409 409
 
410
-                    $excerpt = \GV\Utils::get( $download_info, 'installer_excerpt', $download_info['excerpt'] );
410
+					$excerpt = \GV\Utils::get( $download_info, 'installer_excerpt', $download_info['excerpt'] );
411 411
 
412
-                    // Allow some pure HTML tags, but remove everything else from the excerpt.
413
-                    $tags = array( '<strong>', '</strong>', '<em>', '</em>', '<code>', '</code>' );
414
-                    $replacements = array( '[b]', '[/b]', '[i]', '[/i]', '[code]', '[/code]' );
412
+					// Allow some pure HTML tags, but remove everything else from the excerpt.
413
+					$tags = array( '<strong>', '</strong>', '<em>', '</em>', '<code>', '</code>' );
414
+					$replacements = array( '[b]', '[/b]', '[i]', '[/i]', '[code]', '[/code]' );
415 415
 
416
-                    $excerpt = str_replace( $tags, $replacements, $excerpt );
417
-                    $excerpt = esc_html( strip_tags( $excerpt ) );
416
+					$excerpt = str_replace( $tags, $replacements, $excerpt );
417
+					$excerpt = esc_html( strip_tags( $excerpt ) );
418 418
 					$excerpt = str_replace( $replacements, $tags, $excerpt );
419 419
 
420 420
 					echo wpautop( $excerpt );
421
-                ?></div>
421
+				?></div>
422 422
             </div>
423 423
         </div>
424 424
 		<?php
425 425
 	}
426 426
 
427 427
 	/**
428
-     * Generates details array for the download to keep the render_download() method a bit tidier
429
-     *
428
+	 * Generates details array for the download to keep the render_download() method a bit tidier
429
+	 *
430 430
 	 * @since 2.10 Allow managing installed add-ons whether or not the user's license shows they have access.
431 431
 	 *
432 432
 	 * @param array $download Single download, as returned by {@see get_downloads_data}
433 433
 	 * @param array $wp_plugins All active plugins, as returned by {@see get_plugins()}
434 434
 	 *
435 435
 	 * @return array {
436
-     *   @type array $download_info
437
-     *   @type string $plugin_path
438
-     *   @type string $status License status returned by Easy Digital Downloads ("active", "inactive", "expired", "revoked", etc)
439
-     *   @type string $status_label
440
-     *   @type string $button_title Title attribute to show when hovering over the download's button
441
-     *   @type string $button_class CSS class to use for the button
442
-     *   @type string $button_label Text to use for the download's anchor link
443
-     *   @type string $href URL for the download's button
444
-     *   @type bool   $spinner Whether to show the spinner icon
445
-     *   @type string $item_class CSS class for the download container
446
-     *   @type string $required_license The name of the required license for the download ("All Access" or "Core + Extensions")
447
-     *   @type bool   $is_active Is the current GravityView license (as entered in Settings) active?
448
-     * }
436
+	 *   @type array $download_info
437
+	 *   @type string $plugin_path
438
+	 *   @type string $status License status returned by Easy Digital Downloads ("active", "inactive", "expired", "revoked", etc)
439
+	 *   @type string $status_label
440
+	 *   @type string $button_title Title attribute to show when hovering over the download's button
441
+	 *   @type string $button_class CSS class to use for the button
442
+	 *   @type string $button_label Text to use for the download's anchor link
443
+	 *   @type string $href URL for the download's button
444
+	 *   @type bool   $spinner Whether to show the spinner icon
445
+	 *   @type string $item_class CSS class for the download container
446
+	 *   @type string $required_license The name of the required license for the download ("All Access" or "Core + Extensions")
447
+	 *   @type bool   $is_active Is the current GravityView license (as entered in Settings) active?
448
+	 * }
449 449
 	 */
450 450
 	private function get_download_display_details( $download, $wp_plugins ) {
451 451
 
@@ -456,7 +456,7 @@  discard block
 block discarded – undo
456 456
 			'slug' => '',
457 457
 			'excerpt' => '',
458 458
 			'link' => '',
459
-            'coming_soon' => false,
459
+			'coming_soon' => false,
460 460
 			'installer_title' => null, // May not be defined
461 461
 			'installer_excerpt' => null, // May not be defined
462 462
 		) );
@@ -500,14 +500,14 @@  discard block
 block discarded – undo
500 500
 			$href         = 'https://www.gravitykit.com/pricing/?utm_source=admin-installer&utm_medium=admin&utm_campaign=Admin%20Notice&utm_content=' . $required_license;
501 501
 		}
502 502
 
503
-        elseif ( ! empty( $download_info['coming_soon'] ) ) {
504
-	        $spinner      = false;
505
-	        $status       = 'notinstalled';
506
-	        $status_label = __( 'Coming Soon', 'gravityview' );
507
-	        $button_label = __( 'Learn More', 'gravityview' );
508
-	        $button_class = 'button-primary button-large';
509
-	        $href         = \GV\Utils::get( $download_info, 'link', 'https://www.gravitykit.com/extensions/' );
510
-        }
503
+		elseif ( ! empty( $download_info['coming_soon'] ) ) {
504
+			$spinner      = false;
505
+			$status       = 'notinstalled';
506
+			$status_label = __( 'Coming Soon', 'gravityview' );
507
+			$button_label = __( 'Learn More', 'gravityview' );
508
+			$button_class = 'button-primary button-large';
509
+			$href         = \GV\Utils::get( $download_info, 'link', 'https://www.gravitykit.com/extensions/' );
510
+		}
511 511
 
512 512
 		// Access but the plugin is not installed
513 513
 		elseif ( ! $wp_plugin ) {
@@ -553,18 +553,18 @@  discard block
 block discarded – undo
553 553
 		$download_info['link'] = add_query_arg( array( 'license_key' => $license_key ), $download_info['link'] );
554 554
 
555 555
 		return compact( 'download_info','plugin_path', 'status', 'status_label', 'button_title', 'button_class', 'button_label', 'href', 'spinner', 'item_class', 'required_license', 'is_active' );
556
-    }
556
+	}
557 557
 
558 558
 	/**
559
-     * Returns the base price for an extension
560
-     *
559
+	 * Returns the base price for an extension
560
+	 *
561 561
 	 * @param array $download
562 562
 	 *
563 563
 	 * @return float Base price for an extension. If not for sale separately, returns 0
564 564
 	 */
565 565
 	private function get_download_base_price( $download ) {
566 566
 
567
-	    $base_price = \GV\Utils::get( $download, 'pricing/amount', 0 );
567
+		$base_price = \GV\Utils::get( $download, 'pricing/amount', 0 );
568 568
 		$base_price = \GFCommon::to_number( $base_price );
569 569
 
570 570
 		unset( $download['pricing']['amount'] );
@@ -575,7 +575,7 @@  discard block
 block discarded – undo
575 575
 		}
576 576
 
577 577
 		return floatval( $base_price );
578
-    }
578
+	}
579 579
 
580 580
 	/**
581 581
 	 * Handle AJAX request to activate extension
@@ -593,8 +593,8 @@  discard block
 block discarded – undo
593 593
 
594 594
 		if ( is_wp_error( $result ) || ! is_plugin_active( $data['path'] ) ) {
595 595
 			wp_send_json_error( array(
596
-                'error' => sprintf( __( 'Plugin activation failed: %s', 'gravityview' ), $result->get_error_message() )
597
-            ) );
596
+				'error' => sprintf( __( 'Plugin activation failed: %s', 'gravityview' ), $result->get_error_message() )
597
+			) );
598 598
 		}
599 599
 
600 600
 		wp_send_json_success();
@@ -615,10 +615,10 @@  discard block
 block discarded – undo
615 615
 		deactivate_plugins( $data['path'] );
616 616
 
617 617
 		if( is_plugin_active( $data['path'] ) ) {
618
-            wp_send_json_error( array(
619
-                'error' => sprintf( __( 'Plugin deactivation failed.', 'gravityview' ) )
620
-            ) );
621
-        }
618
+			wp_send_json_error( array(
619
+				'error' => sprintf( __( 'Plugin deactivation failed.', 'gravityview' ) )
620
+			) );
621
+		}
622 622
 
623 623
 		wp_send_json_success();
624 624
 	}
Please login to merge, or discard this patch.
trustedlogin/katzgrau/klogger/src/Logger.php 1 patch
Indentation   +318 added lines, -318 removed lines patch added patch discarded remove patch
@@ -34,322 +34,322 @@
 block discarded – undo
34 34
  */
35 35
 class Logger extends AbstractLogger
36 36
 {
37
-    /**
38
-     * KLogger options
39
-     *  Anything options not considered 'core' to the logging library should be
40
-     *  settable view the third parameter in the constructor
41
-     *
42
-     *  Core options include the log file path and the log threshold
43
-     *
44
-     * @var array
45
-     */
46
-    protected $options = array (
47
-        'extension'      => 'txt',
48
-        'dateFormat'     => 'Y-m-d G:i:s.u',
49
-        'filename'       => false,
50
-        'flushFrequency' => false,
51
-        'prefix'         => 'log_',
52
-        'logFormat'      => false,
53
-        'appendContext'  => true,
54
-    );
55
-
56
-    /**
57
-     * Path to the log file
58
-     * @var string
59
-     */
60
-    private $logFilePath;
61
-
62
-    /**
63
-     * Current minimum logging threshold
64
-     * @var integer
65
-     */
66
-    protected $logLevelThreshold = LogLevel::DEBUG;
67
-
68
-    /**
69
-     * The number of lines logged in this instance's lifetime
70
-     * @var int
71
-     */
72
-    private $logLineCount = 0;
73
-
74
-    /**
75
-     * Log Levels
76
-     * @var array
77
-     */
78
-    protected $logLevels = array(
79
-        LogLevel::EMERGENCY => 0,
80
-        LogLevel::ALERT     => 1,
81
-        LogLevel::CRITICAL  => 2,
82
-        LogLevel::ERROR     => 3,
83
-        LogLevel::WARNING   => 4,
84
-        LogLevel::NOTICE    => 5,
85
-        LogLevel::INFO      => 6,
86
-        LogLevel::DEBUG     => 7
87
-    );
88
-
89
-    /**
90
-     * This holds the file handle for this instance's log file
91
-     * @var resource
92
-     */
93
-    private $fileHandle;
94
-
95
-    /**
96
-     * This holds the last line logged to the logger
97
-     *  Used for unit tests
98
-     * @var string
99
-     */
100
-    private $lastLine = '';
101
-
102
-    /**
103
-     * Octal notation for default permissions of the log file
104
-     * @var integer
105
-     */
106
-    private $defaultPermissions = 0777;
107
-
108
-    /**
109
-     * Class constructor
110
-     *
111
-     * @param string $logDirectory      File path to the logging directory
112
-     * @param string $logLevelThreshold The LogLevel Threshold
113
-     * @param array  $options
114
-     *
115
-     * @internal param string $logFilePrefix The prefix for the log file name
116
-     * @internal param string $logFileExt The extension for the log file
117
-     */
118
-    public function __construct($logDirectory, $logLevelThreshold = LogLevel::DEBUG, array $options = array())
119
-    {
120
-        $this->logLevelThreshold = $logLevelThreshold;
121
-        $this->options = array_merge($this->options, $options);
122
-
123
-        $logDirectory = rtrim($logDirectory, DIRECTORY_SEPARATOR);
124
-        if ( ! file_exists($logDirectory)) {
125
-            mkdir($logDirectory, $this->defaultPermissions, true);
126
-        }
127
-
128
-        if(strpos($logDirectory, 'php://') === 0) {
129
-            $this->setLogToStdOut($logDirectory);
130
-            $this->setFileHandle('w+');
131
-        } else {
132
-            $this->setLogFilePath($logDirectory);
133
-            if(file_exists($this->logFilePath) && !is_writable($this->logFilePath)) {
134
-                throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
135
-            }
136
-            $this->setFileHandle('a');
137
-        }
138
-
139
-        if ( ! $this->fileHandle) {
140
-            throw new RuntimeException('The file could not be opened. Check permissions.');
141
-        }
142
-    }
143
-
144
-    /**
145
-     * @param string $stdOutPath
146
-     */
147
-    public function setLogToStdOut($stdOutPath) {
148
-        $this->logFilePath = $stdOutPath;
149
-    }
150
-
151
-    /**
152
-     * @param string $logDirectory
153
-     */
154
-    public function setLogFilePath($logDirectory) {
155
-        if ($this->options['filename']) {
156
-            if (strpos($this->options['filename'], '.log') !== false || strpos($this->options['filename'], '.txt') !== false) {
157
-                $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename'];
158
-            }
159
-            else {
160
-                $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename'].'.'.$this->options['extension'];
161
-            }
162
-        } else {
163
-            $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['prefix'].date('Y-m-d').'.'.$this->options['extension'];
164
-        }
165
-    }
166
-
167
-    /**
168
-     * @param $writeMode
169
-     *
170
-     * @internal param resource $fileHandle
171
-     */
172
-    public function setFileHandle($writeMode) {
173
-        $this->fileHandle = fopen($this->logFilePath, $writeMode);
174
-    }
175
-
176
-
177
-    /**
178
-     * Class destructor
179
-     */
180
-    public function __destruct()
181
-    {
182
-        if ($this->fileHandle) {
183
-            fclose($this->fileHandle);
184
-        }
185
-    }
186
-
187
-    /**
188
-     * Sets the date format used by all instances of KLogger
189
-     *
190
-     * @param string $dateFormat Valid format string for date()
191
-     */
192
-    public function setDateFormat($dateFormat)
193
-    {
194
-        $this->options['dateFormat'] = $dateFormat;
195
-    }
196
-
197
-    /**
198
-     * Sets the Log Level Threshold
199
-     *
200
-     * @param string $logLevelThreshold The log level threshold
201
-     */
202
-    public function setLogLevelThreshold($logLevelThreshold)
203
-    {
204
-        $this->logLevelThreshold = $logLevelThreshold;
205
-    }
206
-
207
-    /**
208
-     * Logs with an arbitrary level.
209
-     *
210
-     * @param mixed $level
211
-     * @param string $message
212
-     * @param array $context
213
-     * @return null
214
-     */
215
-    public function log($level, $message, array $context = array())
216
-    {
217
-        if ($this->logLevels[$this->logLevelThreshold] < $this->logLevels[$level]) {
218
-            return;
219
-        }
220
-        $message = $this->formatMessage($level, $message, $context);
221
-        $this->write($message);
222
-    }
223
-
224
-    /**
225
-     * Writes a line to the log without prepending a status or timestamp
226
-     *
227
-     * @param string $message Line to write to the log
228
-     * @return void
229
-     */
230
-    public function write($message)
231
-    {
232
-        if (null !== $this->fileHandle) {
233
-            if (fwrite($this->fileHandle, $message) === false) {
234
-                throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
235
-            } else {
236
-                $this->lastLine = trim($message);
237
-                $this->logLineCount++;
238
-
239
-                if ($this->options['flushFrequency'] && $this->logLineCount % $this->options['flushFrequency'] === 0) {
240
-                    fflush($this->fileHandle);
241
-                }
242
-            }
243
-        }
244
-    }
245
-
246
-    /**
247
-     * Get the file path that the log is currently writing to
248
-     *
249
-     * @return string
250
-     */
251
-    public function getLogFilePath()
252
-    {
253
-        return $this->logFilePath;
254
-    }
255
-
256
-    /**
257
-     * Get the last line logged to the log file
258
-     *
259
-     * @return string
260
-     */
261
-    public function getLastLogLine()
262
-    {
263
-        return $this->lastLine;
264
-    }
265
-
266
-    /**
267
-     * Formats the message for logging.
268
-     *
269
-     * @param  string $level   The Log Level of the message
270
-     * @param  string $message The message to log
271
-     * @param  array  $context The context
272
-     * @return string
273
-     */
274
-    protected function formatMessage($level, $message, $context)
275
-    {
276
-        if ($this->options['logFormat']) {
277
-            $parts = array(
278
-                'date'          => $this->getTimestamp(),
279
-                'level'         => strtoupper($level),
280
-                'level-padding' => str_repeat(' ', 9 - strlen($level)),
281
-                'priority'      => $this->logLevels[$level],
282
-                'message'       => $message,
283
-                'context'       => json_encode($context),
284
-            );
285
-            $message = $this->options['logFormat'];
286
-            foreach ($parts as $part => $value) {
287
-                $message = str_replace('{'.$part.'}', $value, $message);
288
-            }
289
-
290
-        } else {
291
-            $message = "[{$this->getTimestamp()}] [{$level}] {$message}";
292
-        }
293
-
294
-        if ($this->options['appendContext'] && ! empty($context)) {
295
-            $message .= PHP_EOL.$this->indent($this->contextToString($context));
296
-        }
297
-
298
-        return $message.PHP_EOL;
299
-
300
-    }
301
-
302
-    /**
303
-     * Gets the correctly formatted Date/Time for the log entry.
304
-     *
305
-     * PHP DateTime is dump, and you have to resort to trickery to get microseconds
306
-     * to work correctly, so here it is.
307
-     *
308
-     * @return string
309
-     */
310
-    private function getTimestamp()
311
-    {
312
-        $originalTime = microtime(true);
313
-        $micro = sprintf("%06d", ($originalTime - floor($originalTime)) * 1000000);
314
-        $date = new DateTime(date('Y-m-d H:i:s.'.$micro, (int)$originalTime));
315
-
316
-        return $date->format($this->options['dateFormat']);
317
-    }
318
-
319
-    /**
320
-     * Takes the given context and coverts it to a string.
321
-     *
322
-     * @param  array $context The Context
323
-     * @return string
324
-     */
325
-    protected function contextToString($context)
326
-    {
327
-        $export = '';
328
-        foreach ($context as $key => $value) {
329
-            $export .= "{$key}: ";
330
-            $export .= preg_replace(array(
331
-                '/=>\s+([a-zA-Z])/im',
332
-                '/array\(\s+\)/im',
333
-                '/^  |\G  /m'
334
-            ), array(
335
-                '=> $1',
336
-                'array()',
337
-                '    '
338
-            ), str_replace('array (', 'array(', var_export($value, true)));
339
-            $export .= PHP_EOL;
340
-        }
341
-        return str_replace(array('\\\\', '\\\''), array('\\', '\''), rtrim($export));
342
-    }
343
-
344
-    /**
345
-     * Indents the given string with the given indent.
346
-     *
347
-     * @param  string $string The string to indent
348
-     * @param  string $indent What to use as the indent.
349
-     * @return string
350
-     */
351
-    protected function indent($string, $indent = '    ')
352
-    {
353
-        return $indent.str_replace("\n", "\n".$indent, $string);
354
-    }
37
+	/**
38
+	 * KLogger options
39
+	 *  Anything options not considered 'core' to the logging library should be
40
+	 *  settable view the third parameter in the constructor
41
+	 *
42
+	 *  Core options include the log file path and the log threshold
43
+	 *
44
+	 * @var array
45
+	 */
46
+	protected $options = array (
47
+		'extension'      => 'txt',
48
+		'dateFormat'     => 'Y-m-d G:i:s.u',
49
+		'filename'       => false,
50
+		'flushFrequency' => false,
51
+		'prefix'         => 'log_',
52
+		'logFormat'      => false,
53
+		'appendContext'  => true,
54
+	);
55
+
56
+	/**
57
+	 * Path to the log file
58
+	 * @var string
59
+	 */
60
+	private $logFilePath;
61
+
62
+	/**
63
+	 * Current minimum logging threshold
64
+	 * @var integer
65
+	 */
66
+	protected $logLevelThreshold = LogLevel::DEBUG;
67
+
68
+	/**
69
+	 * The number of lines logged in this instance's lifetime
70
+	 * @var int
71
+	 */
72
+	private $logLineCount = 0;
73
+
74
+	/**
75
+	 * Log Levels
76
+	 * @var array
77
+	 */
78
+	protected $logLevels = array(
79
+		LogLevel::EMERGENCY => 0,
80
+		LogLevel::ALERT     => 1,
81
+		LogLevel::CRITICAL  => 2,
82
+		LogLevel::ERROR     => 3,
83
+		LogLevel::WARNING   => 4,
84
+		LogLevel::NOTICE    => 5,
85
+		LogLevel::INFO      => 6,
86
+		LogLevel::DEBUG     => 7
87
+	);
88
+
89
+	/**
90
+	 * This holds the file handle for this instance's log file
91
+	 * @var resource
92
+	 */
93
+	private $fileHandle;
94
+
95
+	/**
96
+	 * This holds the last line logged to the logger
97
+	 *  Used for unit tests
98
+	 * @var string
99
+	 */
100
+	private $lastLine = '';
101
+
102
+	/**
103
+	 * Octal notation for default permissions of the log file
104
+	 * @var integer
105
+	 */
106
+	private $defaultPermissions = 0777;
107
+
108
+	/**
109
+	 * Class constructor
110
+	 *
111
+	 * @param string $logDirectory      File path to the logging directory
112
+	 * @param string $logLevelThreshold The LogLevel Threshold
113
+	 * @param array  $options
114
+	 *
115
+	 * @internal param string $logFilePrefix The prefix for the log file name
116
+	 * @internal param string $logFileExt The extension for the log file
117
+	 */
118
+	public function __construct($logDirectory, $logLevelThreshold = LogLevel::DEBUG, array $options = array())
119
+	{
120
+		$this->logLevelThreshold = $logLevelThreshold;
121
+		$this->options = array_merge($this->options, $options);
122
+
123
+		$logDirectory = rtrim($logDirectory, DIRECTORY_SEPARATOR);
124
+		if ( ! file_exists($logDirectory)) {
125
+			mkdir($logDirectory, $this->defaultPermissions, true);
126
+		}
127
+
128
+		if(strpos($logDirectory, 'php://') === 0) {
129
+			$this->setLogToStdOut($logDirectory);
130
+			$this->setFileHandle('w+');
131
+		} else {
132
+			$this->setLogFilePath($logDirectory);
133
+			if(file_exists($this->logFilePath) && !is_writable($this->logFilePath)) {
134
+				throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
135
+			}
136
+			$this->setFileHandle('a');
137
+		}
138
+
139
+		if ( ! $this->fileHandle) {
140
+			throw new RuntimeException('The file could not be opened. Check permissions.');
141
+		}
142
+	}
143
+
144
+	/**
145
+	 * @param string $stdOutPath
146
+	 */
147
+	public function setLogToStdOut($stdOutPath) {
148
+		$this->logFilePath = $stdOutPath;
149
+	}
150
+
151
+	/**
152
+	 * @param string $logDirectory
153
+	 */
154
+	public function setLogFilePath($logDirectory) {
155
+		if ($this->options['filename']) {
156
+			if (strpos($this->options['filename'], '.log') !== false || strpos($this->options['filename'], '.txt') !== false) {
157
+				$this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename'];
158
+			}
159
+			else {
160
+				$this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename'].'.'.$this->options['extension'];
161
+			}
162
+		} else {
163
+			$this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['prefix'].date('Y-m-d').'.'.$this->options['extension'];
164
+		}
165
+	}
166
+
167
+	/**
168
+	 * @param $writeMode
169
+	 *
170
+	 * @internal param resource $fileHandle
171
+	 */
172
+	public function setFileHandle($writeMode) {
173
+		$this->fileHandle = fopen($this->logFilePath, $writeMode);
174
+	}
175
+
176
+
177
+	/**
178
+	 * Class destructor
179
+	 */
180
+	public function __destruct()
181
+	{
182
+		if ($this->fileHandle) {
183
+			fclose($this->fileHandle);
184
+		}
185
+	}
186
+
187
+	/**
188
+	 * Sets the date format used by all instances of KLogger
189
+	 *
190
+	 * @param string $dateFormat Valid format string for date()
191
+	 */
192
+	public function setDateFormat($dateFormat)
193
+	{
194
+		$this->options['dateFormat'] = $dateFormat;
195
+	}
196
+
197
+	/**
198
+	 * Sets the Log Level Threshold
199
+	 *
200
+	 * @param string $logLevelThreshold The log level threshold
201
+	 */
202
+	public function setLogLevelThreshold($logLevelThreshold)
203
+	{
204
+		$this->logLevelThreshold = $logLevelThreshold;
205
+	}
206
+
207
+	/**
208
+	 * Logs with an arbitrary level.
209
+	 *
210
+	 * @param mixed $level
211
+	 * @param string $message
212
+	 * @param array $context
213
+	 * @return null
214
+	 */
215
+	public function log($level, $message, array $context = array())
216
+	{
217
+		if ($this->logLevels[$this->logLevelThreshold] < $this->logLevels[$level]) {
218
+			return;
219
+		}
220
+		$message = $this->formatMessage($level, $message, $context);
221
+		$this->write($message);
222
+	}
223
+
224
+	/**
225
+	 * Writes a line to the log without prepending a status or timestamp
226
+	 *
227
+	 * @param string $message Line to write to the log
228
+	 * @return void
229
+	 */
230
+	public function write($message)
231
+	{
232
+		if (null !== $this->fileHandle) {
233
+			if (fwrite($this->fileHandle, $message) === false) {
234
+				throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
235
+			} else {
236
+				$this->lastLine = trim($message);
237
+				$this->logLineCount++;
238
+
239
+				if ($this->options['flushFrequency'] && $this->logLineCount % $this->options['flushFrequency'] === 0) {
240
+					fflush($this->fileHandle);
241
+				}
242
+			}
243
+		}
244
+	}
245
+
246
+	/**
247
+	 * Get the file path that the log is currently writing to
248
+	 *
249
+	 * @return string
250
+	 */
251
+	public function getLogFilePath()
252
+	{
253
+		return $this->logFilePath;
254
+	}
255
+
256
+	/**
257
+	 * Get the last line logged to the log file
258
+	 *
259
+	 * @return string
260
+	 */
261
+	public function getLastLogLine()
262
+	{
263
+		return $this->lastLine;
264
+	}
265
+
266
+	/**
267
+	 * Formats the message for logging.
268
+	 *
269
+	 * @param  string $level   The Log Level of the message
270
+	 * @param  string $message The message to log
271
+	 * @param  array  $context The context
272
+	 * @return string
273
+	 */
274
+	protected function formatMessage($level, $message, $context)
275
+	{
276
+		if ($this->options['logFormat']) {
277
+			$parts = array(
278
+				'date'          => $this->getTimestamp(),
279
+				'level'         => strtoupper($level),
280
+				'level-padding' => str_repeat(' ', 9 - strlen($level)),
281
+				'priority'      => $this->logLevels[$level],
282
+				'message'       => $message,
283
+				'context'       => json_encode($context),
284
+			);
285
+			$message = $this->options['logFormat'];
286
+			foreach ($parts as $part => $value) {
287
+				$message = str_replace('{'.$part.'}', $value, $message);
288
+			}
289
+
290
+		} else {
291
+			$message = "[{$this->getTimestamp()}] [{$level}] {$message}";
292
+		}
293
+
294
+		if ($this->options['appendContext'] && ! empty($context)) {
295
+			$message .= PHP_EOL.$this->indent($this->contextToString($context));
296
+		}
297
+
298
+		return $message.PHP_EOL;
299
+
300
+	}
301
+
302
+	/**
303
+	 * Gets the correctly formatted Date/Time for the log entry.
304
+	 *
305
+	 * PHP DateTime is dump, and you have to resort to trickery to get microseconds
306
+	 * to work correctly, so here it is.
307
+	 *
308
+	 * @return string
309
+	 */
310
+	private function getTimestamp()
311
+	{
312
+		$originalTime = microtime(true);
313
+		$micro = sprintf("%06d", ($originalTime - floor($originalTime)) * 1000000);
314
+		$date = new DateTime(date('Y-m-d H:i:s.'.$micro, (int)$originalTime));
315
+
316
+		return $date->format($this->options['dateFormat']);
317
+	}
318
+
319
+	/**
320
+	 * Takes the given context and coverts it to a string.
321
+	 *
322
+	 * @param  array $context The Context
323
+	 * @return string
324
+	 */
325
+	protected function contextToString($context)
326
+	{
327
+		$export = '';
328
+		foreach ($context as $key => $value) {
329
+			$export .= "{$key}: ";
330
+			$export .= preg_replace(array(
331
+				'/=>\s+([a-zA-Z])/im',
332
+				'/array\(\s+\)/im',
333
+				'/^  |\G  /m'
334
+			), array(
335
+				'=> $1',
336
+				'array()',
337
+				'    '
338
+			), str_replace('array (', 'array(', var_export($value, true)));
339
+			$export .= PHP_EOL;
340
+		}
341
+		return str_replace(array('\\\\', '\\\''), array('\\', '\''), rtrim($export));
342
+	}
343
+
344
+	/**
345
+	 * Indents the given string with the given indent.
346
+	 *
347
+	 * @param  string $string The string to indent
348
+	 * @param  string $indent What to use as the indent.
349
+	 * @return string
350
+	 */
351
+	protected function indent($string, $indent = '    ')
352
+	{
353
+		return $indent.str_replace("\n", "\n".$indent, $string);
354
+	}
355 355
 }
Please login to merge, or discard this patch.