WooCommerce MailChimp - Version 2.3.3

Version Description

Download this release

Release Info

Developer anderly
Plugin Icon 128x128 WooCommerce MailChimp
Version 2.3.3
Comparing to
See all releases

Code changes from version 2.3.2 to 2.3.3

Files changed (62) hide show
  1. includes/class-ss-wc-mailchimp-migrator.php +2 -0
  2. includes/class-ss-wc-mailchimp-plugin.php +1 -1
  3. includes/lib/action-scheduler/.gitattributes +0 -9
  4. includes/lib/action-scheduler/.github/release-drafter.yml +0 -15
  5. includes/lib/action-scheduler/.gitignore +0 -3
  6. includes/lib/action-scheduler/.travis.yml +0 -37
  7. includes/lib/action-scheduler/README.md +0 -41
  8. includes/lib/action-scheduler/action-scheduler.php +1 -1
  9. includes/lib/action-scheduler/classes/ActionScheduler.php +0 -4
  10. includes/lib/action-scheduler/classes/ActionScheduler_AdminHelp.php +0 -47
  11. includes/lib/action-scheduler/classes/ActionScheduler_AdminView.php +1 -1
  12. includes/lib/action-scheduler/classes/ActionScheduler_Store.php +1 -31
  13. includes/lib/action-scheduler/classes/ActionScheduler_wcSystemStatus.php +2 -2
  14. includes/lib/action-scheduler/classes/ActionScheduler_wpPostStore.php +13 -21
  15. includes/lib/action-scheduler/codecov.yml +0 -13
  16. includes/lib/action-scheduler/composer.json +0 -11
  17. includes/lib/action-scheduler/composer.lock +0 -2909
  18. includes/lib/action-scheduler/docs/CNAME +0 -1
  19. includes/lib/action-scheduler/docs/_config.yml +0 -7
  20. includes/lib/action-scheduler/docs/_layouts/default.html +0 -62
  21. includes/lib/action-scheduler/docs/admin.md +0 -22
  22. includes/lib/action-scheduler/docs/android-chrome-192x192.png +0 -0
  23. includes/lib/action-scheduler/docs/android-chrome-256x256.png +0 -0
  24. includes/lib/action-scheduler/docs/api.md +0 -179
  25. includes/lib/action-scheduler/docs/apple-touch-icon.png +0 -0
  26. includes/lib/action-scheduler/docs/assets/css/style.scss +0 -57
  27. includes/lib/action-scheduler/docs/browserconfig.xml +0 -9
  28. includes/lib/action-scheduler/docs/faq.md +0 -101
  29. includes/lib/action-scheduler/docs/favicon-16x16.png +0 -0
  30. includes/lib/action-scheduler/docs/favicon-32x32.png +0 -0
  31. includes/lib/action-scheduler/docs/favicon.ico +0 -0
  32. includes/lib/action-scheduler/docs/google14ef723abb376cd3.html +0 -1
  33. includes/lib/action-scheduler/docs/index.md +0 -68
  34. includes/lib/action-scheduler/docs/mstile-150x150.png +0 -0
  35. includes/lib/action-scheduler/docs/perf.md +0 -127
  36. includes/lib/action-scheduler/docs/safari-pinned-tab.svg +0 -40
  37. includes/lib/action-scheduler/docs/site.webmanifest +0 -19
  38. includes/lib/action-scheduler/docs/usage.md +0 -123
  39. includes/lib/action-scheduler/docs/wp-cli.md +0 -73
  40. includes/lib/action-scheduler/lib/cron-expression/README.md +0 -92
  41. includes/lib/action-scheduler/tests/ActionScheduler_UnitTestCase.php +0 -44
  42. includes/lib/action-scheduler/tests/bootstrap.php +0 -31
  43. includes/lib/action-scheduler/tests/phpunit.xml.dist +0 -32
  44. includes/lib/action-scheduler/tests/phpunit/deprecated/ActionScheduler_UnitTestCase.php +0 -44
  45. includes/lib/action-scheduler/tests/phpunit/helpers/ActionScheduler_TimezoneHelper_Test.php +0 -100
  46. includes/lib/action-scheduler/tests/phpunit/jobs/ActionScheduler_Action_Test.php +0 -55
  47. includes/lib/action-scheduler/tests/phpunit/jobs/ActionScheduler_NullAction_Test.php +0 -16
  48. includes/lib/action-scheduler/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php +0 -375
  49. includes/lib/action-scheduler/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php +0 -185
  50. includes/lib/action-scheduler/tests/phpunit/procedural_api/procedural_api_Test.php +0 -222
  51. includes/lib/action-scheduler/tests/phpunit/procedural_api/wc_get_scheduled_actions_Test.php +0 -100
  52. includes/lib/action-scheduler/tests/phpunit/runner/ActionScheduler_QueueCleaner_Test.php +0 -151
  53. includes/lib/action-scheduler/tests/phpunit/runner/ActionScheduler_QueueRunner_Test.php +0 -262
  54. includes/lib/action-scheduler/tests/phpunit/schedules/ActionScheduler_CronSchedule_Test.php +0 -45
  55. includes/lib/action-scheduler/tests/phpunit/schedules/ActionScheduler_IntervalSchedule_Test.php +0 -28
  56. includes/lib/action-scheduler/tests/phpunit/schedules/ActionScheduler_NullSchedule_Test.php +0 -18
  57. includes/lib/action-scheduler/tests/phpunit/schedules/ActionScheduler_SimpleSchedule_Test.php +0 -37
  58. includes/lib/action-scheduler/tests/phpunit/versioning/ActionScheduler_Versions_Test.php +0 -43
  59. includes/lib/action-scheduler/tests/travis/setup.sh +0 -38
  60. includes/lib/action-scheduler/tests/travis/wp-tests-config.php +0 -38
  61. readme.txt +4 -1
  62. woocommerce-mailchimp.php +1 -1
includes/class-ss-wc-mailchimp-migrator.php CHANGED
@@ -16,6 +16,8 @@ final class SS_WC_MailChimp_Migrator {
16
  '2.0.15',
17
  '2.3.0',
18
  '2.3.1',
 
 
19
  );
20
 
21
  public static function migrate( $target_version ) {
16
  '2.0.15',
17
  '2.3.0',
18
  '2.3.1',
19
+ '2.3.2',
20
+ '2.3.3',
21
  );
22
 
23
  public static function migrate( $target_version ) {
includes/class-ss-wc-mailchimp-plugin.php CHANGED
@@ -15,7 +15,7 @@ final class SS_WC_MailChimp_Plugin {
15
  *
16
  * @var string
17
  */
18
- private static $version = '2.3.2';
19
 
20
  /**
21
  * Plugin singleton instance
15
  *
16
  * @var string
17
  */
18
+ private static $version = '2.3.3';
19
 
20
  /**
21
  * Plugin singleton instance
includes/lib/action-scheduler/.gitattributes DELETED
@@ -1,9 +0,0 @@
1
- docs export-ignore
2
- tests export-ignore
3
- codecov.yml export-ignore
4
- .github export-ignore
5
- .travis.yml export-ignore
6
- .gitattributes export-ignore
7
- .gitignore export-ignore
8
- phpunit.xml.dist export-ignore
9
-
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/.github/release-drafter.yml DELETED
@@ -1,15 +0,0 @@
1
- template: |
2
- ## next release – date
3
-
4
- <!-- Move the individual changes below into the appropriate section -->
5
-
6
- $CHANGES
7
-
8
- **Added**
9
- **Changed**
10
- **Deprecated**
11
- **Removed**
12
- **Fixed**
13
- **Security**
14
-
15
- change-template: '* $TITLE (PR #$NUMBER)'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/.gitignore DELETED
@@ -1,3 +0,0 @@
1
- phpunit.xml
2
- vendor
3
- .idea
 
 
 
includes/lib/action-scheduler/.travis.yml DELETED
@@ -1,37 +0,0 @@
1
- # Travis CI Configuration File
2
-
3
- # Tell Travis CI we're using PHP
4
- language: php
5
-
6
- # We nee to use Precise, not Trusty, to test against PHP 5.3, see https://github.com/travis-ci/travis-ci/issues/8219
7
- dist: precise
8
-
9
- # Versions of PHP to test against
10
- php:
11
- - "5.3"
12
- - "5.4"
13
- - "5.5"
14
- - "5.6"
15
- - "7.0"
16
- - "7.1"
17
-
18
- # Specify versions of WordPress to test against
19
- # WP_VERSION = WordPress version number (use "master" for SVN trunk)
20
- # WP_MULTISITE = whether to test multisite (use either "0" or "1")
21
- env:
22
- - WP_VERSION=4.8 WP_MULTISITE=0
23
- - WP_VERSION=4.7 WP_MULTISITE=0
24
- - WP_VERSION=4.6 WP_MULTISITE=0
25
- - WP_VERSION=4.8 WP_MULTISITE=1
26
- - WP_VERSION=4.7 WP_MULTISITE=1
27
- - WP_VERSION=4.6 WP_MULTISITE=1
28
-
29
- # Grab the setup script and execute
30
- before_script:
31
- - source tests/travis/setup.sh $TRAVIS_PHP_VERSION
32
-
33
- script:
34
- - if [[ "$TRAVIS_PHP_VERSION" == "7.1" ]] && [[ "$WP_VERSION" == "4.8" ]] && [[ "$WP_MULTISITE" == "0" ]] && [[ "$TRAVIS_BRANCH" == "master" ]]; then phpunit --configuration tests/phpunit.xml.dist --coverage-clover clover.xml; else phpunit --configuration tests/phpunit.xml.dist; fi
35
-
36
- after_script:
37
- - bash <(curl -s https://codecov.io/bash)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/README.md DELETED
@@ -1,41 +0,0 @@
1
- # Action Scheduler - Job Queue for WordPress [![Build Status](https://travis-ci.org/Prospress/action-scheduler.png?branch=master)](https://travis-ci.org/Prospress/action-scheduler) [![codecov](https://codecov.io/gh/Prospress/action-scheduler/branch/master/graph/badge.svg)](https://codecov.io/gh/Prospress/action-scheduler)
2
-
3
- Action Scheduler is a scalable, traceable job queue for background processing large sets of actions in WordPress. It's specially designed to be distributed in WordPress plugins.
4
-
5
- Action Scheduler works by triggering an action hook to run at some time in the future. Each hook can be scheduled with unique data, to allow callbacks to perform operations on that data. The hook can also be scheduled to run on one or more occassions.
6
-
7
- Think of it like an extension to `do_action()` which adds the ability to delay and repeat a hook.
8
-
9
- ## Battle-Tested Background Processing
10
-
11
- Every month, Action Scheduler processes millions of payments for [Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/), webhooks for [WooCommerce](https://wordpress.org/plugins/woocommerce/), as well as emails and other events for a range of other plugins.
12
-
13
- It's been seen on live sites processing queues in excess of 50,000 jobs and doing resource intensive operations, like processing payments and creating orders, at a sustained rate of over 10,000 / hour without negatively impacting normal site operations.
14
-
15
- This is all on infrastructure and WordPress sites outside the control of the plugin author.
16
-
17
- If your plugin needs background processing, especially of large sets of tasks, Action Scheduler can help.
18
-
19
- ## Learn More
20
-
21
- To learn more about how to Action Scheduler works, and how to use it in your plugin, check out the docs on [ActionScheduler.org](https://actionscheduler.org).
22
-
23
- There you will find:
24
-
25
- * [Usage guide](https://actionscheduler.org/usage/): instructions on installing and using Action Scheduler
26
- * [WP CLI guide](https://actionscheduler.org/wp-cli/): instructions on running Action Scheduler at scale via WP CLI
27
- * [API Reference](https://actionscheduler.org/api/): complete reference guide for all API functions
28
- * [Administration Guide](https://actionscheduler.org/admin/): guide to managing scheduled actions via the administration screen
29
- * [Guide to Background Processing at Scale](https://actionscheduler.org/perf/): instructions for running Action Scheduler at scale via the default WP Cron queue runner
30
-
31
- ## Credits
32
-
33
- Action Scheduler is developed and maintained by [Prospress](http://prospress.com/) in collaboration with [Flightless](https://flightless.us/).
34
-
35
- Collaboration is cool. We'd love to work with you to improve Action Scheduler. [Pull Requests](https://github.com/prospress/action-scheduler/pulls) welcome.
36
-
37
- ---
38
-
39
- <p align="center">
40
- <img src="https://cloud.githubusercontent.com/assets/235523/11986380/bb6a0958-a983-11e5-8e9b-b9781d37c64a.png" width="160">
41
- </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/action-scheduler.php CHANGED
@@ -25,7 +25,7 @@
25
  *
26
  */
27
 
28
- if ( ! function_exists( 'action_scheduler_register_2_dot_2_dot_5' ) && function_exists( 'add_action' ) ) {
29
 
30
  if ( ! class_exists( 'ActionScheduler_Versions' ) ) {
31
  require_once( 'classes/ActionScheduler_Versions.php' );
25
  *
26
  */
27
 
28
+ if ( ! function_exists( 'action_scheduler_register_2_dot_2_dot_5' ) ) {
29
 
30
  if ( ! class_exists( 'ActionScheduler_Versions' ) ) {
31
  require_once( 'classes/ActionScheduler_Versions.php' );
includes/lib/action-scheduler/classes/ActionScheduler.php CHANGED
@@ -102,10 +102,6 @@ abstract class ActionScheduler {
102
  $admin_view = self::admin_view();
103
  add_action( 'init', array( $admin_view, 'init' ), 0, 0 ); // run before $store::init()
104
 
105
- if ( is_admin() ) {
106
- add_action( 'current_screen', array( 'ActionScheduler_AdminHelp', 'add_help_tabs' ) );
107
- }
108
-
109
  require_once( self::plugin_path('functions.php') );
110
 
111
  if ( apply_filters( 'action_scheduler_load_deprecated_functions', true ) ) {
102
  $admin_view = self::admin_view();
103
  add_action( 'init', array( $admin_view, 'init' ), 0, 0 ); // run before $store::init()
104
 
 
 
 
 
105
  require_once( self::plugin_path('functions.php') );
106
 
107
  if ( apply_filters( 'action_scheduler_load_deprecated_functions', true ) ) {
includes/lib/action-scheduler/classes/ActionScheduler_AdminHelp.php DELETED
@@ -1,47 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_AdminHelp
5
- * @codeCoverageIgnore
6
- */
7
- class ActionScheduler_AdminHelp {
8
- const SCREEN_ID = 'tools_page_action-scheduler';
9
-
10
- public function add_help_tabs() {
11
- $screen = get_current_screen();
12
-
13
- if ( ! $screen || self::SCREEN_ID != $screen->id ) {
14
- return;
15
- }
16
-
17
- $screen->add_help_tab(
18
- array(
19
- 'id' => 'action_scheduler_about',
20
- 'title' => __( 'About', 'action-scheduler' ),
21
- 'content' =>
22
- '<h2>' . __( 'About Action Scheduler', 'action-scheduler' ) . '</h2>' .
23
- '<p>' .
24
- __( 'Action Scheduler is a scalable, traceable job queue for background processing large sets of actions. Action Scheduler works by triggering an action hook to run at some time in the future. Scheduled actions can also be scheduled to run on a recurring schedule.', 'action-scheduler' ) .
25
- '</p>',
26
- )
27
- );
28
-
29
- $screen->add_help_tab(
30
- array(
31
- 'id' => 'action_scheduler_columns',
32
- 'title' => __( 'Columns', 'action-scheduler' ),
33
- 'content' =>
34
- '<h2>' . __( 'Scheduled Action Columns', 'action-scheduler' ) . '</h2>' .
35
- '<ul>' .
36
- sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Hook', 'action-scheduler' ), __( 'Name of the action hook that will be triggered.', 'action-scheduler' ) ) .
37
- sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Status', 'action-scheduler' ), __( 'Action statuses are Pending, Complete, Canceled, Failed', 'action-scheduler' ) ) .
38
- sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Arguments', 'action-scheduler' ), __( 'Optional data array passed to the action hook.', 'action-scheduler' ) ) .
39
- sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Group', 'action-scheduler' ), __( 'Optional action group.', 'action-scheduler' ) ) .
40
- sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Recurrence', 'action-scheduler' ), __( 'The action\'s schedule frequency.', 'action-scheduler' ) ) .
41
- sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Scheduled', 'action-scheduler' ), __( 'The date/time the action is/was scheduled to run.', 'action-scheduler' ) ) .
42
- sprintf( '<li><strong>%1$s</strong>: %2$s</li>', __( 'Log', 'action-scheduler' ), __( 'Activity log for the action.', 'action-scheduler' ) ) .
43
- '</ul>',
44
- )
45
- );
46
- }
47
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/classes/ActionScheduler_AdminView.php CHANGED
@@ -9,7 +9,7 @@ class ActionScheduler_AdminView extends ActionScheduler_AdminView_Deprecated {
9
  private static $admin_view = NULL;
10
 
11
  /**
12
- * @return ActionScheduler_AdminView
13
  * @codeCoverageIgnore
14
  */
15
  public static function instance() {
9
  private static $admin_view = NULL;
10
 
11
  /**
12
+ * @return ActionScheduler_QueueRunner
13
  * @codeCoverageIgnore
14
  */
15
  public static function instance() {
includes/lib/action-scheduler/classes/ActionScheduler_Store.php CHANGED
@@ -188,43 +188,13 @@ abstract class ActionScheduler_Store {
188
 
189
  public function init() {}
190
 
191
- /**
192
- * Mark an action that failed to fetch correctly as failed.
193
- *
194
- * @since 2.2.6
195
- *
196
- * @param int $action_id The ID of the action.
197
- */
198
- public function mark_failed_fetch_action( $action_id ) {
199
- self::$store->mark_failure( $action_id );
200
- }
201
-
202
- /**
203
- * Add base hooks
204
- *
205
- * @since 2.2.6
206
- */
207
- protected static function hook() {
208
- add_action( 'action_scheduler_failed_fetch_action', array( self::$store, 'mark_failed_fetch_action' ), 20 );
209
- }
210
-
211
- /**
212
- * Remove base hooks
213
- *
214
- * @since 2.2.6
215
- */
216
- protected static function unhook() {
217
- remove_action( 'action_scheduler_failed_fetch_action', array( self::$store, 'mark_failed_fetch_action' ), 20 );
218
- }
219
-
220
  /**
221
  * @return ActionScheduler_Store
222
  */
223
  public static function instance() {
224
  if ( empty(self::$store) ) {
225
- $class = apply_filters( 'action_scheduler_store_class', 'ActionScheduler_wpPostStore' );
226
  self::$store = new $class();
227
- self::hook();
228
  }
229
  return self::$store;
230
  }
188
 
189
  public function init() {}
190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  /**
192
  * @return ActionScheduler_Store
193
  */
194
  public static function instance() {
195
  if ( empty(self::$store) ) {
196
+ $class = apply_filters('action_scheduler_store_class', 'ActionScheduler_wpPostStore');
197
  self::$store = new $class();
 
198
  }
199
  return self::$store;
200
  }
includes/lib/action-scheduler/classes/ActionScheduler_wcSystemStatus.php CHANGED
@@ -129,8 +129,8 @@ class ActionScheduler_wcSystemStatus {
129
  /**
130
  * is triggered when invoking inaccessible methods in an object context.
131
  *
132
- * @param string $name
133
- * @param array $arguments
134
  *
135
  * @return mixed
136
  * @link https://php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods
129
  /**
130
  * is triggered when invoking inaccessible methods in an object context.
131
  *
132
+ * @param $name string
133
+ * @param $arguments array
134
  *
135
  * @return mixed
136
  * @link https://php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods
includes/lib/action-scheduler/classes/ActionScheduler_wpPostStore.php CHANGED
@@ -19,7 +19,13 @@ class ActionScheduler_wpPostStore extends ActionScheduler_Store {
19
  $this->validate_action( $action );
20
  $post_array = $this->create_post_array( $action, $scheduled_date );
21
  $post_id = $this->save_post_array( $post_array );
22
- $this->save_post_schedule( $post_id, $action->get_schedule() );
 
 
 
 
 
 
23
  $this->save_action_group( $post_id, $action->get_group() );
24
  do_action( 'action_scheduler_stored_action', $post_id );
25
  return $post_id;
@@ -43,20 +49,7 @@ class ActionScheduler_wpPostStore extends ActionScheduler_Store {
43
  protected function save_post_array( $post_array ) {
44
  add_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10, 1 );
45
  add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 );
46
-
47
- $has_kses = false !== has_filter( 'content_save_pre', 'wp_filter_post_kses' );
48
-
49
- if ( $has_kses ) {
50
- // Prevent KSES from corrupting JSON in post_content.
51
- kses_remove_filters();
52
- }
53
-
54
  $post_id = wp_insert_post($post_array);
55
-
56
- if ( $has_kses ) {
57
- kses_init_filters();
58
- }
59
-
60
  remove_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10 );
61
  remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 );
62
 
@@ -307,16 +300,15 @@ class ActionScheduler_wpPostStore extends ActionScheduler_Store {
307
  $sql = ( 'count' === $select_or_count ) ? 'SELECT count(p.ID)' : 'SELECT p.ID ';
308
  $sql .= "FROM {$wpdb->posts} p";
309
  $sql_params = array();
310
- if ( empty( $query['group'] ) && 'group' === $query['orderby'] ) {
311
- $sql .= " LEFT JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID";
312
- $sql .= " LEFT JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id";
313
- $sql .= " LEFT JOIN {$wpdb->terms} t ON tt.term_id=t.term_id";
314
- } elseif ( ! empty( $query['group'] ) ) {
315
  $sql .= " INNER JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID";
316
  $sql .= " INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id";
317
  $sql .= " INNER JOIN {$wpdb->terms} t ON tt.term_id=t.term_id";
318
- $sql .= " AND t.slug=%s";
319
- $sql_params[] = $query['group'];
 
 
 
320
  }
321
  $sql .= " WHERE post_type=%s";
322
  $sql_params[] = self::POST_TYPE;
19
  $this->validate_action( $action );
20
  $post_array = $this->create_post_array( $action, $scheduled_date );
21
  $post_id = $this->save_post_array( $post_array );
22
+ $schedule = $action->get_schedule();
23
+
24
+ if ( ! is_null( $scheduled_date ) && $schedule->is_recurring() ) {
25
+ $schedule = new ActionScheduler_IntervalSchedule( $scheduled_date, $schedule->interval_in_seconds() );
26
+ }
27
+
28
+ $this->save_post_schedule( $post_id, $schedule );
29
  $this->save_action_group( $post_id, $action->get_group() );
30
  do_action( 'action_scheduler_stored_action', $post_id );
31
  return $post_id;
49
  protected function save_post_array( $post_array ) {
50
  add_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10, 1 );
51
  add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 );
 
 
 
 
 
 
 
 
52
  $post_id = wp_insert_post($post_array);
 
 
 
 
 
53
  remove_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10 );
54
  remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 );
55
 
300
  $sql = ( 'count' === $select_or_count ) ? 'SELECT count(p.ID)' : 'SELECT p.ID ';
301
  $sql .= "FROM {$wpdb->posts} p";
302
  $sql_params = array();
303
+ if ( ! empty( $query['group'] ) || 'group' === $query['orderby'] ) {
 
 
 
 
304
  $sql .= " INNER JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID";
305
  $sql .= " INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id";
306
  $sql .= " INNER JOIN {$wpdb->terms} t ON tt.term_id=t.term_id";
307
+
308
+ if ( ! empty( $query['group'] ) ) {
309
+ $sql .= " AND t.slug=%s";
310
+ $sql_params[] = $query['group'];
311
+ }
312
  }
313
  $sql .= " WHERE post_type=%s";
314
  $sql_params[] = self::POST_TYPE;
includes/lib/action-scheduler/codecov.yml DELETED
@@ -1,13 +0,0 @@
1
- codecov:
2
- branch: master
3
-
4
- coverage:
5
- ignore:
6
- - tests/.*
7
- - lib/.*
8
- status:
9
- project: false
10
- patch: false
11
- changes: false
12
-
13
- comment: false
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/composer.json DELETED
@@ -1,11 +0,0 @@
1
- {
2
- "name": "prospress/action-scheduler",
3
- "description": "Action Scheduler for WordPress and WooCommerce",
4
- "type": "wordpress-plugin",
5
- "license": "GPL-3.0",
6
- "minimum-stability": "dev",
7
- "require": {},
8
- "require-dev": {
9
- "wp-cli/wp-cli": "1.5.1"
10
- }
11
- }
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/composer.lock DELETED
@@ -1,2909 +0,0 @@
1
- {
2
- "_readme": [
3
- "This file locks the dependencies of your project to a known state",
4
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
- "This file is @generated automatically"
6
- ],
7
- "content-hash": "f4556531e7b95173d1b769b3d7350926",
8
- "packages": [],
9
- "packages-dev": [
10
- {
11
- "name": "composer/ca-bundle",
12
- "version": "dev-master",
13
- "source": {
14
- "type": "git",
15
- "url": "https://github.com/composer/ca-bundle.git",
16
- "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12"
17
- },
18
- "dist": {
19
- "type": "zip",
20
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b17e6153cb7f33c7e44eb59578dc12eee5dc8e12",
21
- "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12",
22
- "shasum": ""
23
- },
24
- "require": {
25
- "ext-openssl": "*",
26
- "ext-pcre": "*",
27
- "php": "^5.3.2 || ^7.0"
28
- },
29
- "require-dev": {
30
- "phpunit/phpunit": "^4.5",
31
- "psr/log": "^1.0",
32
- "symfony/process": "^2.5 || ^3.0"
33
- },
34
- "suggest": {
35
- "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+"
36
- },
37
- "type": "library",
38
- "extra": {
39
- "branch-alias": {
40
- "dev-master": "1.x-dev"
41
- }
42
- },
43
- "autoload": {
44
- "psr-4": {
45
- "Composer\\CaBundle\\": "src"
46
- }
47
- },
48
- "notification-url": "https://packagist.org/downloads/",
49
- "license": [
50
- "MIT"
51
- ],
52
- "authors": [
53
- {
54
- "name": "Jordi Boggiano",
55
- "email": "j.boggiano@seld.be",
56
- "homepage": "http://seld.be"
57
- }
58
- ],
59
- "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
60
- "keywords": [
61
- "cabundle",
62
- "cacert",
63
- "certificate",
64
- "ssl",
65
- "tls"
66
- ],
67
- "time": "2017-03-06T11:59:08+00:00"
68
- },
69
- {
70
- "name": "composer/composer",
71
- "version": "dev-master",
72
- "source": {
73
- "type": "git",
74
- "url": "https://github.com/composer/composer.git",
75
- "reference": "82c27a68bc5cb76f3d00b82c27496e3cdbb6d4ff"
76
- },
77
- "dist": {
78
- "type": "zip",
79
- "url": "https://api.github.com/repos/composer/composer/zipball/82c27a68bc5cb76f3d00b82c27496e3cdbb6d4ff",
80
- "reference": "82c27a68bc5cb76f3d00b82c27496e3cdbb6d4ff",
81
- "shasum": ""
82
- },
83
- "require": {
84
- "composer/ca-bundle": "^1.0",
85
- "composer/semver": "^1.0",
86
- "composer/spdx-licenses": "^1.0",
87
- "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0",
88
- "php": "^5.3.2 || ^7.0",
89
- "psr/log": "^1.0",
90
- "seld/cli-prompt": "^1.0",
91
- "seld/jsonlint": "^1.4",
92
- "seld/phar-utils": "^1.0",
93
- "symfony/console": "^2.7 || ^3.0",
94
- "symfony/filesystem": "^2.7 || ^3.0",
95
- "symfony/finder": "^2.7 || ^3.0",
96
- "symfony/process": "^2.7 || ^3.0"
97
- },
98
- "require-dev": {
99
- "phpunit/phpunit": "^4.5 || ^5.0.5",
100
- "phpunit/phpunit-mock-objects": "^2.3 || ^3.0"
101
- },
102
- "suggest": {
103
- "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
104
- "ext-zip": "Enabling the zip extension allows you to unzip archives",
105
- "ext-zlib": "Allow gzip compression of HTTP requests"
106
- },
107
- "bin": [
108
- "bin/composer"
109
- ],
110
- "type": "library",
111
- "extra": {
112
- "branch-alias": {
113
- "dev-master": "1.6-dev"
114
- }
115
- },
116
- "autoload": {
117
- "psr-4": {
118
- "Composer\\": "src/Composer"
119
- }
120
- },
121
- "notification-url": "https://packagist.org/downloads/",
122
- "license": [
123
- "MIT"
124
- ],
125
- "authors": [
126
- {
127
- "name": "Nils Adermann",
128
- "email": "naderman@naderman.de",
129
- "homepage": "http://www.naderman.de"
130
- },
131
- {
132
- "name": "Jordi Boggiano",
133
- "email": "j.boggiano@seld.be",
134
- "homepage": "http://seld.be"
135
- }
136
- ],
137
- "description": "Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere.",
138
- "homepage": "https://getcomposer.org/",
139
- "keywords": [
140
- "autoload",
141
- "dependency",
142
- "package"
143
- ],
144
- "time": "2017-08-09T14:23:46+00:00"
145
- },
146
- {
147
- "name": "composer/semver",
148
- "version": "dev-master",
149
- "source": {
150
- "type": "git",
151
- "url": "https://github.com/composer/semver.git",
152
- "reference": "7ea669582e6396857cf6d1c0a6cd2728f4e7e383"
153
- },
154
- "dist": {
155
- "type": "zip",
156
- "url": "https://api.github.com/repos/composer/semver/zipball/7ea669582e6396857cf6d1c0a6cd2728f4e7e383",
157
- "reference": "7ea669582e6396857cf6d1c0a6cd2728f4e7e383",
158
- "shasum": ""
159
- },
160
- "require": {
161
- "php": "^5.3.2 || ^7.0"
162
- },
163
- "require-dev": {
164
- "phpunit/phpunit": "^4.5 || ^5.0.5",
165
- "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
166
- },
167
- "type": "library",
168
- "extra": {
169
- "branch-alias": {
170
- "dev-master": "1.x-dev"
171
- }
172
- },
173
- "autoload": {
174
- "psr-4": {
175
- "Composer\\Semver\\": "src"
176
- }
177
- },
178
- "notification-url": "https://packagist.org/downloads/",
179
- "license": [
180
- "MIT"
181
- ],
182
- "authors": [
183
- {
184
- "name": "Nils Adermann",
185
- "email": "naderman@naderman.de",
186
- "homepage": "http://www.naderman.de"
187
- },
188
- {
189
- "name": "Jordi Boggiano",
190
- "email": "j.boggiano@seld.be",
191
- "homepage": "http://seld.be"
192
- },
193
- {
194
- "name": "Rob Bast",
195
- "email": "rob.bast@gmail.com",
196
- "homepage": "http://robbast.nl"
197
- }
198
- ],
199
- "description": "Semver library that offers utilities, version constraint parsing and validation.",
200
- "keywords": [
201
- "semantic",
202
- "semver",
203
- "validation",
204
- "versioning"
205
- ],
206
- "time": "2017-05-15T12:49:06+00:00"
207
- },
208
- {
209
- "name": "composer/spdx-licenses",
210
- "version": "dev-master",
211
- "source": {
212
- "type": "git",
213
- "url": "https://github.com/composer/spdx-licenses.git",
214
- "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c"
215
- },
216
- "dist": {
217
- "type": "zip",
218
- "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/2603a0d7ddc00a015deb576fa5297ca43dee6b1c",
219
- "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c",
220
- "shasum": ""
221
- },
222
- "require": {
223
- "php": "^5.3.2 || ^7.0"
224
- },
225
- "require-dev": {
226
- "phpunit/phpunit": "^4.5 || ^5.0.5",
227
- "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
228
- },
229
- "type": "library",
230
- "extra": {
231
- "branch-alias": {
232
- "dev-master": "1.x-dev"
233
- }
234
- },
235
- "autoload": {
236
- "psr-4": {
237
- "Composer\\Spdx\\": "src"
238
- }
239
- },
240
- "notification-url": "https://packagist.org/downloads/",
241
- "license": [
242
- "MIT"
243
- ],
244
- "authors": [
245
- {
246
- "name": "Nils Adermann",
247
- "email": "naderman@naderman.de",
248
- "homepage": "http://www.naderman.de"
249
- },
250
- {
251
- "name": "Jordi Boggiano",
252
- "email": "j.boggiano@seld.be",
253
- "homepage": "http://seld.be"
254
- },
255
- {
256
- "name": "Rob Bast",
257
- "email": "rob.bast@gmail.com",
258
- "homepage": "http://robbast.nl"
259
- }
260
- ],
261
- "description": "SPDX licenses list and validation library.",
262
- "keywords": [
263
- "license",
264
- "spdx",
265
- "validator"
266
- ],
267
- "time": "2017-04-03T19:08:52+00:00"
268
- },
269
- {
270
- "name": "justinrainbow/json-schema",
271
- "version": "5.x-dev",
272
- "source": {
273
- "type": "git",
274
- "url": "https://github.com/justinrainbow/json-schema.git",
275
- "reference": "36ed4d935f8f5eb958dbd29e1fa5a241ec3ece4d"
276
- },
277
- "dist": {
278
- "type": "zip",
279
- "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/36ed4d935f8f5eb958dbd29e1fa5a241ec3ece4d",
280
- "reference": "36ed4d935f8f5eb958dbd29e1fa5a241ec3ece4d",
281
- "shasum": ""
282
- },
283
- "require": {
284
- "php": ">=5.3.3"
285
- },
286
- "require-dev": {
287
- "friendsofphp/php-cs-fixer": "^2.1",
288
- "json-schema/json-schema-test-suite": "1.2.0",
289
- "phpunit/phpunit": "^4.8.22"
290
- },
291
- "bin": [
292
- "bin/validate-json"
293
- ],
294
- "type": "library",
295
- "extra": {
296
- "branch-alias": {
297
- "dev-master": "5.0.x-dev"
298
- }
299
- },
300
- "autoload": {
301
- "psr-4": {
302
- "JsonSchema\\": "src/JsonSchema/"
303
- }
304
- },
305
- "notification-url": "https://packagist.org/downloads/",
306
- "license": [
307
- "MIT"
308
- ],
309
- "authors": [
310
- {
311
- "name": "Bruno Prieto Reis",
312
- "email": "bruno.p.reis@gmail.com"
313
- },
314
- {
315
- "name": "Justin Rainbow",
316
- "email": "justin.rainbow@gmail.com"
317
- },
318
- {
319
- "name": "Igor Wiedler",
320
- "email": "igor@wiedler.ch"
321
- },
322
- {
323
- "name": "Robert Schönthal",
324
- "email": "seroscho@googlemail.com"
325
- }
326
- ],
327
- "description": "A library to validate a json schema.",
328
- "homepage": "https://github.com/justinrainbow/json-schema",
329
- "keywords": [
330
- "json",
331
- "schema"
332
- ],
333
- "time": "2017-06-23T11:43:36+00:00"
334
- },
335
- {
336
- "name": "mustache/mustache",
337
- "version": "v2.12.0",
338
- "source": {
339
- "type": "git",
340
- "url": "https://github.com/bobthecow/mustache.php.git",
341
- "reference": "fe8fe72e9d580591854de404cc59a1b83ca4d19e"
342
- },
343
- "dist": {
344
- "type": "zip",
345
- "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/fe8fe72e9d580591854de404cc59a1b83ca4d19e",
346
- "reference": "fe8fe72e9d580591854de404cc59a1b83ca4d19e",
347
- "shasum": ""
348
- },
349
- "require": {
350
- "php": ">=5.2.4"
351
- },
352
- "require-dev": {
353
- "friendsofphp/php-cs-fixer": "~1.11",
354
- "phpunit/phpunit": "~3.7|~4.0|~5.0"
355
- },
356
- "type": "library",
357
- "autoload": {
358
- "psr-0": {
359
- "Mustache": "src/"
360
- }
361
- },
362
- "notification-url": "https://packagist.org/downloads/",
363
- "license": [
364
- "MIT"
365
- ],
366
- "authors": [
367
- {
368
- "name": "Justin Hileman",
369
- "email": "justin@justinhileman.info",
370
- "homepage": "http://justinhileman.com"
371
- }
372
- ],
373
- "description": "A Mustache implementation in PHP.",
374
- "homepage": "https://github.com/bobthecow/mustache.php",
375
- "keywords": [
376
- "mustache",
377
- "templating"
378
- ],
379
- "time": "2017-07-11T12:54:05+00:00"
380
- },
381
- {
382
- "name": "nb/oxymel",
383
- "version": "v0.1.0",
384
- "source": {
385
- "type": "git",
386
- "url": "https://github.com/nb/oxymel.git",
387
- "reference": "cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c"
388
- },
389
- "dist": {
390
- "type": "zip",
391
- "url": "https://api.github.com/repos/nb/oxymel/zipball/cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c",
392
- "reference": "cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c",
393
- "shasum": ""
394
- },
395
- "require": {
396
- "php": ">=5.2.4"
397
- },
398
- "type": "library",
399
- "autoload": {
400
- "psr-0": {
401
- "Oxymel": ""
402
- }
403
- },
404
- "notification-url": "https://packagist.org/downloads/",
405
- "license": [
406
- "MIT"
407
- ],
408
- "authors": [
409
- {
410
- "name": "Nikolay Bachiyski",
411
- "email": "nb@nikolay.bg",
412
- "homepage": "http://extrapolate.me/"
413
- }
414
- ],
415
- "description": "A sweet XML builder",
416
- "homepage": "https://github.com/nb/oxymel",
417
- "keywords": [
418
- "xml"
419
- ],
420
- "time": "2013-02-24T15:01:54+00:00"
421
- },
422
- {
423
- "name": "psr/container",
424
- "version": "dev-master",
425
- "source": {
426
- "type": "git",
427
- "url": "https://github.com/php-fig/container.git",
428
- "reference": "2cc4a01788191489dc7459446ba832fa79a216a7"
429
- },
430
- "dist": {
431
- "type": "zip",
432
- "url": "https://api.github.com/repos/php-fig/container/zipball/2cc4a01788191489dc7459446ba832fa79a216a7",
433
- "reference": "2cc4a01788191489dc7459446ba832fa79a216a7",
434
- "shasum": ""
435
- },
436
- "require": {
437
- "php": ">=5.3.0"
438
- },
439
- "type": "library",
440
- "extra": {
441
- "branch-alias": {
442
- "dev-master": "1.0.x-dev"
443
- }
444
- },
445
- "autoload": {
446
- "psr-4": {
447
- "Psr\\Container\\": "src/"
448
- }
449
- },
450
- "notification-url": "https://packagist.org/downloads/",
451
- "license": [
452
- "MIT"
453
- ],
454
- "authors": [
455
- {
456
- "name": "PHP-FIG",
457
- "homepage": "http://www.php-fig.org/"
458
- }
459
- ],
460
- "description": "Common Container Interface (PHP FIG PSR-11)",
461
- "homepage": "https://github.com/php-fig/container",
462
- "keywords": [
463
- "PSR-11",
464
- "container",
465
- "container-interface",
466
- "container-interop",
467
- "psr"
468
- ],
469
- "time": "2017-06-28T15:35:32+00:00"
470
- },
471
- {
472
- "name": "psr/log",
473
- "version": "dev-master",
474
- "source": {
475
- "type": "git",
476
- "url": "https://github.com/php-fig/log.git",
477
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
478
- },
479
- "dist": {
480
- "type": "zip",
481
- "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
482
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
483
- "shasum": ""
484
- },
485
- "require": {
486
- "php": ">=5.3.0"
487
- },
488
- "type": "library",
489
- "extra": {
490
- "branch-alias": {
491
- "dev-master": "1.0.x-dev"
492
- }
493
- },
494
- "autoload": {
495
- "psr-4": {
496
- "Psr\\Log\\": "Psr/Log/"
497
- }
498
- },
499
- "notification-url": "https://packagist.org/downloads/",
500
- "license": [
501
- "MIT"
502
- ],
503
- "authors": [
504
- {
505
- "name": "PHP-FIG",
506
- "homepage": "http://www.php-fig.org/"
507
- }
508
- ],
509
- "description": "Common interface for logging libraries",
510
- "homepage": "https://github.com/php-fig/log",
511
- "keywords": [
512
- "log",
513
- "psr",
514
- "psr-3"
515
- ],
516
- "time": "2016-10-10T12:19:37+00:00"
517
- },
518
- {
519
- "name": "ramsey/array_column",
520
- "version": "1.1.3",
521
- "source": {
522
- "type": "git",
523
- "url": "https://github.com/ramsey/array_column.git",
524
- "reference": "f8e52eb28e67eb50e613b451dd916abcf783c1db"
525
- },
526
- "dist": {
527
- "type": "zip",
528
- "url": "https://api.github.com/repos/ramsey/array_column/zipball/f8e52eb28e67eb50e613b451dd916abcf783c1db",
529
- "reference": "f8e52eb28e67eb50e613b451dd916abcf783c1db",
530
- "shasum": ""
531
- },
532
- "require-dev": {
533
- "jakub-onderka/php-parallel-lint": "0.8.*",
534
- "phpunit/phpunit": "~4.5",
535
- "satooshi/php-coveralls": "0.6.*",
536
- "squizlabs/php_codesniffer": "~2.2"
537
- },
538
- "type": "library",
539
- "autoload": {
540
- "files": [
541
- "src/array_column.php"
542
- ]
543
- },
544
- "notification-url": "https://packagist.org/downloads/",
545
- "license": [
546
- "MIT"
547
- ],
548
- "authors": [
549
- {
550
- "name": "Ben Ramsey",
551
- "homepage": "http://benramsey.com"
552
- }
553
- ],
554
- "description": "Provides functionality for array_column() to projects using PHP earlier than version 5.5.",
555
- "homepage": "https://github.com/ramsey/array_column",
556
- "keywords": [
557
- "array",
558
- "array_column",
559
- "column"
560
- ],
561
- "time": "2015-03-20T22:07:39+00:00"
562
- },
563
- {
564
- "name": "rmccue/requests",
565
- "version": "v1.7.0",
566
- "source": {
567
- "type": "git",
568
- "url": "https://github.com/rmccue/Requests.git",
569
- "reference": "87932f52ffad70504d93f04f15690cf16a089546"
570
- },
571
- "dist": {
572
- "type": "zip",
573
- "url": "https://api.github.com/repos/rmccue/Requests/zipball/87932f52ffad70504d93f04f15690cf16a089546",
574
- "reference": "87932f52ffad70504d93f04f15690cf16a089546",
575
- "shasum": ""
576
- },
577
- "require": {
578
- "php": ">=5.2"
579
- },
580
- "require-dev": {
581
- "requests/test-server": "dev-master"
582
- },
583
- "type": "library",
584
- "autoload": {
585
- "psr-0": {
586
- "Requests": "library/"
587
- }
588
- },
589
- "notification-url": "https://packagist.org/downloads/",
590
- "license": [
591
- "ISC"
592
- ],
593
- "authors": [
594
- {
595
- "name": "Ryan McCue",
596
- "homepage": "http://ryanmccue.info"
597
- }
598
- ],
599
- "description": "A HTTP library written in PHP, for human beings.",
600
- "homepage": "http://github.com/rmccue/Requests",
601
- "keywords": [
602
- "curl",
603
- "fsockopen",
604
- "http",
605
- "idna",
606
- "ipv6",
607
- "iri",
608
- "sockets"
609
- ],
610
- "time": "2016-10-13T00:11:37+00:00"
611
- },
612
- {
613
- "name": "seld/cli-prompt",
614
- "version": "dev-master",
615
- "source": {
616
- "type": "git",
617
- "url": "https://github.com/Seldaek/cli-prompt.git",
618
- "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd"
619
- },
620
- "dist": {
621
- "type": "zip",
622
- "url": "https://api.github.com/repos/Seldaek/cli-prompt/zipball/a19a7376a4689d4d94cab66ab4f3c816019ba8dd",
623
- "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd",
624
- "shasum": ""
625
- },
626
- "require": {
627
- "php": ">=5.3"
628
- },
629
- "type": "library",
630
- "extra": {
631
- "branch-alias": {
632
- "dev-master": "1.x-dev"
633
- }
634
- },
635
- "autoload": {
636
- "psr-4": {
637
- "Seld\\CliPrompt\\": "src/"
638
- }
639
- },
640
- "notification-url": "https://packagist.org/downloads/",
641
- "license": [
642
- "MIT"
643
- ],
644
- "authors": [
645
- {
646
- "name": "Jordi Boggiano",
647
- "email": "j.boggiano@seld.be"
648
- }
649
- ],
650
- "description": "Allows you to prompt for user input on the command line, and optionally hide the characters they type",
651
- "keywords": [
652
- "cli",
653
- "console",
654
- "hidden",
655
- "input",
656
- "prompt"
657
- ],
658
- "time": "2017-03-18T11:32:45+00:00"
659
- },
660
- {
661
- "name": "seld/jsonlint",
662
- "version": "1.6.1",
663
- "source": {
664
- "type": "git",
665
- "url": "https://github.com/Seldaek/jsonlint.git",
666
- "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77"
667
- },
668
- "dist": {
669
- "type": "zip",
670
- "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
671
- "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77",
672
- "shasum": ""
673
- },
674
- "require": {
675
- "php": "^5.3 || ^7.0"
676
- },
677
- "require-dev": {
678
- "phpunit/phpunit": "^4.5"
679
- },
680
- "bin": [
681
- "bin/jsonlint"
682
- ],
683
- "type": "library",
684
- "autoload": {
685
- "psr-4": {
686
- "Seld\\JsonLint\\": "src/Seld/JsonLint/"
687
- }
688
- },
689
- "notification-url": "https://packagist.org/downloads/",
690
- "license": [
691
- "MIT"
692
- ],
693
- "authors": [
694
- {
695
- "name": "Jordi Boggiano",
696
- "email": "j.boggiano@seld.be",
697
- "homepage": "http://seld.be"
698
- }
699
- ],
700
- "description": "JSON Linter",
701
- "keywords": [
702
- "json",
703
- "linter",
704
- "parser",
705
- "validator"
706
- ],
707
- "time": "2017-06-18T15:11:04+00:00"
708
- },
709
- {
710
- "name": "seld/phar-utils",
711
- "version": "dev-master",
712
- "source": {
713
- "type": "git",
714
- "url": "https://github.com/Seldaek/phar-utils.git",
715
- "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a"
716
- },
717
- "dist": {
718
- "type": "zip",
719
- "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/7009b5139491975ef6486545a39f3e6dad5ac30a",
720
- "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a",
721
- "shasum": ""
722
- },
723
- "require": {
724
- "php": ">=5.3"
725
- },
726
- "type": "library",
727
- "extra": {
728
- "branch-alias": {
729
- "dev-master": "1.x-dev"
730
- }
731
- },
732
- "autoload": {
733
- "psr-4": {
734
- "Seld\\PharUtils\\": "src/"
735
- }
736
- },
737
- "notification-url": "https://packagist.org/downloads/",
738
- "license": [
739
- "MIT"
740
- ],
741
- "authors": [
742
- {
743
- "name": "Jordi Boggiano",
744
- "email": "j.boggiano@seld.be"
745
- }
746
- ],
747
- "description": "PHAR file format utilities, for when PHP phars you up",
748
- "keywords": [
749
- "phra"
750
- ],
751
- "time": "2015-10-13T18:44:15+00:00"
752
- },
753
- {
754
- "name": "symfony/config",
755
- "version": "3.4.x-dev",
756
- "source": {
757
- "type": "git",
758
- "url": "https://github.com/symfony/config.git",
759
- "reference": "d668d8c0502d2b485c00d107db65fdbc56c26282"
760
- },
761
- "dist": {
762
- "type": "zip",
763
- "url": "https://api.github.com/repos/symfony/config/zipball/d668d8c0502d2b485c00d107db65fdbc56c26282",
764
- "reference": "d668d8c0502d2b485c00d107db65fdbc56c26282",
765
- "shasum": ""
766
- },
767
- "require": {
768
- "php": "^5.5.9|>=7.0.8",
769
- "symfony/filesystem": "~2.8|~3.0|~4.0"
770
- },
771
- "conflict": {
772
- "symfony/dependency-injection": "<3.3",
773
- "symfony/finder": "<3.3"
774
- },
775
- "require-dev": {
776
- "symfony/dependency-injection": "~3.3|~4.0",
777
- "symfony/finder": "~3.3|~4.0",
778
- "symfony/yaml": "~3.0|~4.0"
779
- },
780
- "suggest": {
781
- "symfony/yaml": "To use the yaml reference dumper"
782
- },
783
- "type": "library",
784
- "extra": {
785
- "branch-alias": {
786
- "dev-master": "3.4-dev"
787
- }
788
- },
789
- "autoload": {
790
- "psr-4": {
791
- "Symfony\\Component\\Config\\": ""
792
- },
793
- "exclude-from-classmap": [
794
- "/Tests/"
795
- ]
796
- },
797
- "notification-url": "https://packagist.org/downloads/",
798
- "license": [
799
- "MIT"
800
- ],
801
- "authors": [
802
- {
803
- "name": "Fabien Potencier",
804
- "email": "fabien@symfony.com"
805
- },
806
- {
807
- "name": "Symfony Community",
808
- "homepage": "https://symfony.com/contributors"
809
- }
810
- ],
811
- "description": "Symfony Config Component",
812
- "homepage": "https://symfony.com",
813
- "time": "2017-08-05T17:34:46+00:00"
814
- },
815
- {
816
- "name": "symfony/console",
817
- "version": "3.4.x-dev",
818
- "source": {
819
- "type": "git",
820
- "url": "https://github.com/symfony/console.git",
821
- "reference": "0e283478c2d68c9bf9cc52592ad1ef1834083a85"
822
- },
823
- "dist": {
824
- "type": "zip",
825
- "url": "https://api.github.com/repos/symfony/console/zipball/0e283478c2d68c9bf9cc52592ad1ef1834083a85",
826
- "reference": "0e283478c2d68c9bf9cc52592ad1ef1834083a85",
827
- "shasum": ""
828
- },
829
- "require": {
830
- "php": "^5.5.9|>=7.0.8",
831
- "symfony/debug": "~2.8|~3.0|~4.0",
832
- "symfony/polyfill-mbstring": "~1.0"
833
- },
834
- "conflict": {
835
- "symfony/dependency-injection": "<3.3",
836
- "symfony/process": "<3.3"
837
- },
838
- "require-dev": {
839
- "psr/log": "~1.0",
840
- "symfony/config": "~3.3|~4.0",
841
- "symfony/dependency-injection": "~3.3|~4.0",
842
- "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
843
- "symfony/http-kernel": "~2.8|~3.0|~4.0",
844
- "symfony/lock": "~3.4|~4.0",
845
- "symfony/process": "~3.3|~4.0"
846
- },
847
- "suggest": {
848
- "psr/log": "For using the console logger",
849
- "symfony/event-dispatcher": "",
850
- "symfony/lock": "",
851
- "symfony/process": ""
852
- },
853
- "type": "library",
854
- "extra": {
855
- "branch-alias": {
856
- "dev-master": "3.4-dev"
857
- }
858
- },
859
- "autoload": {
860
- "psr-4": {
861
- "Symfony\\Component\\Console\\": ""
862
- },
863
- "exclude-from-classmap": [
864
- "/Tests/"
865
- ]
866
- },
867
- "notification-url": "https://packagist.org/downloads/",
868
- "license": [
869
- "MIT"
870
- ],
871
- "authors": [
872
- {
873
- "name": "Fabien Potencier",
874
- "email": "fabien@symfony.com"
875
- },
876
- {
877
- "name": "Symfony Community",
878
- "homepage": "https://symfony.com/contributors"
879
- }
880
- ],
881
- "description": "Symfony Console Component",
882
- "homepage": "https://symfony.com",
883
- "time": "2017-08-10T07:07:17+00:00"
884
- },
885
- {
886
- "name": "symfony/debug",
887
- "version": "3.4.x-dev",
888
- "source": {
889
- "type": "git",
890
- "url": "https://github.com/symfony/debug.git",
891
- "reference": "50bda5b4b8641616d45254c6855bcd45f2f64187"
892
- },
893
- "dist": {
894
- "type": "zip",
895
- "url": "https://api.github.com/repos/symfony/debug/zipball/50bda5b4b8641616d45254c6855bcd45f2f64187",
896
- "reference": "50bda5b4b8641616d45254c6855bcd45f2f64187",
897
- "shasum": ""
898
- },
899
- "require": {
900
- "php": "^5.5.9|>=7.0.8",
901
- "psr/log": "~1.0"
902
- },
903
- "conflict": {
904
- "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
905
- },
906
- "require-dev": {
907
- "symfony/http-kernel": "~2.8|~3.0|~4.0"
908
- },
909
- "type": "library",
910
- "extra": {
911
- "branch-alias": {
912
- "dev-master": "3.4-dev"
913
- }
914
- },
915
- "autoload": {
916
- "psr-4": {
917
- "Symfony\\Component\\Debug\\": ""
918
- },
919
- "exclude-from-classmap": [
920
- "/Tests/"
921
- ]
922
- },
923
- "notification-url": "https://packagist.org/downloads/",
924
- "license": [
925
- "MIT"
926
- ],
927
- "authors": [
928
- {
929
- "name": "Fabien Potencier",
930
- "email": "fabien@symfony.com"
931
- },
932
- {
933
- "name": "Symfony Community",
934
- "homepage": "https://symfony.com/contributors"
935
- }
936
- ],
937
- "description": "Symfony Debug Component",
938
- "homepage": "https://symfony.com",
939
- "time": "2017-08-10T07:07:17+00:00"
940
- },
941
- {
942
- "name": "symfony/dependency-injection",
943
- "version": "3.4.x-dev",
944
- "source": {
945
- "type": "git",
946
- "url": "https://github.com/symfony/dependency-injection.git",
947
- "reference": "aaee88765cb21a838e8da26d6acda4ca2ae3a2ea"
948
- },
949
- "dist": {
950
- "type": "zip",
951
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/aaee88765cb21a838e8da26d6acda4ca2ae3a2ea",
952
- "reference": "aaee88765cb21a838e8da26d6acda4ca2ae3a2ea",
953
- "shasum": ""
954
- },
955
- "require": {
956
- "php": "^5.5.9|>=7.0.8",
957
- "psr/container": "^1.0"
958
- },
959
- "conflict": {
960
- "symfony/config": "<3.3.1",
961
- "symfony/finder": "<3.3",
962
- "symfony/proxy-manager-bridge": "<3.4",
963
- "symfony/yaml": "<3.4"
964
- },
965
- "provide": {
966
- "psr/container-implementation": "1.0"
967
- },
968
- "require-dev": {
969
- "symfony/config": "~3.3|~4.0",
970
- "symfony/expression-language": "~2.8|~3.0|~4.0",
971
- "symfony/yaml": "~3.4|~4.0"
972
- },
973
- "suggest": {
974
- "symfony/config": "",
975
- "symfony/expression-language": "For using expressions in service container configuration",
976
- "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required",
977
- "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
978
- "symfony/yaml": ""
979
- },
980
- "type": "library",
981
- "extra": {
982
- "branch-alias": {
983
- "dev-master": "3.4-dev"
984
- }
985
- },
986
- "autoload": {
987
- "psr-4": {
988
- "Symfony\\Component\\DependencyInjection\\": ""
989
- },
990
- "exclude-from-classmap": [
991
- "/Tests/"
992
- ]
993
- },
994
- "notification-url": "https://packagist.org/downloads/",
995
- "license": [
996
- "MIT"
997
- ],
998
- "authors": [
999
- {
1000
- "name": "Fabien Potencier",
1001
- "email": "fabien@symfony.com"
1002
- },
1003
- {
1004
- "name": "Symfony Community",
1005
- "homepage": "https://symfony.com/contributors"
1006
- }
1007
- ],
1008
- "description": "Symfony DependencyInjection Component",
1009
- "homepage": "https://symfony.com",
1010
- "time": "2017-08-10T19:43:00+00:00"
1011
- },
1012
- {
1013
- "name": "symfony/event-dispatcher",
1014
- "version": "3.4.x-dev",
1015
- "source": {
1016
- "type": "git",
1017
- "url": "https://github.com/symfony/event-dispatcher.git",
1018
- "reference": "cd8b015f859e6b60933324db00067c2f060b4d18"
1019
- },
1020
- "dist": {
1021
- "type": "zip",
1022
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/cd8b015f859e6b60933324db00067c2f060b4d18",
1023
- "reference": "cd8b015f859e6b60933324db00067c2f060b4d18",
1024
- "shasum": ""
1025
- },
1026
- "require": {
1027
- "php": "^5.5.9|>=7.0.8"
1028
- },
1029
- "conflict": {
1030
- "symfony/dependency-injection": "<3.3"
1031
- },
1032
- "require-dev": {
1033
- "psr/log": "~1.0",
1034
- "symfony/config": "~2.8|~3.0|~4.0",
1035
- "symfony/dependency-injection": "~3.3|~4.0",
1036
- "symfony/expression-language": "~2.8|~3.0|~4.0",
1037
- "symfony/stopwatch": "~2.8|~3.0|~4.0"
1038
- },
1039
- "suggest": {
1040
- "symfony/dependency-injection": "",
1041
- "symfony/http-kernel": ""
1042
- },
1043
- "type": "library",
1044
- "extra": {
1045
- "branch-alias": {
1046
- "dev-master": "3.4-dev"
1047
- }
1048
- },
1049
- "autoload": {
1050
- "psr-4": {
1051
- "Symfony\\Component\\EventDispatcher\\": ""
1052
- },
1053
- "exclude-from-classmap": [
1054
- "/Tests/"
1055
- ]
1056
- },
1057
- "notification-url": "https://packagist.org/downloads/",
1058
- "license": [
1059
- "MIT"
1060
- ],
1061
- "authors": [
1062
- {
1063
- "name": "Fabien Potencier",
1064
- "email": "fabien@symfony.com"
1065
- },
1066
- {
1067
- "name": "Symfony Community",
1068
- "homepage": "https://symfony.com/contributors"
1069
- }
1070
- ],
1071
- "description": "Symfony EventDispatcher Component",
1072
- "homepage": "https://symfony.com",
1073
- "time": "2017-08-03T09:34:20+00:00"
1074
- },
1075
- {
1076
- "name": "symfony/filesystem",
1077
- "version": "3.4.x-dev",
1078
- "source": {
1079
- "type": "git",
1080
- "url": "https://github.com/symfony/filesystem.git",
1081
- "reference": "e4d366b620c8b6e2d4977c154f6a1d5b416db4dd"
1082
- },
1083
- "dist": {
1084
- "type": "zip",
1085
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e4d366b620c8b6e2d4977c154f6a1d5b416db4dd",
1086
- "reference": "e4d366b620c8b6e2d4977c154f6a1d5b416db4dd",
1087
- "shasum": ""
1088
- },
1089
- "require": {
1090
- "php": "^5.5.9|>=7.0.8"
1091
- },
1092
- "type": "library",
1093
- "extra": {
1094
- "branch-alias": {
1095
- "dev-master": "3.4-dev"
1096
- }
1097
- },
1098
- "autoload": {
1099
- "psr-4": {
1100
- "Symfony\\Component\\Filesystem\\": ""
1101
- },
1102
- "exclude-from-classmap": [
1103
- "/Tests/"
1104
- ]
1105
- },
1106
- "notification-url": "https://packagist.org/downloads/",
1107
- "license": [
1108
- "MIT"
1109
- ],
1110
- "authors": [
1111
- {
1112
- "name": "Fabien Potencier",
1113
- "email": "fabien@symfony.com"
1114
- },
1115
- {
1116
- "name": "Symfony Community",
1117
- "homepage": "https://symfony.com/contributors"
1118
- }
1119
- ],
1120
- "description": "Symfony Filesystem Component",
1121
- "homepage": "https://symfony.com",
1122
- "time": "2017-08-03T09:34:20+00:00"
1123
- },
1124
- {
1125
- "name": "symfony/finder",
1126
- "version": "3.4.x-dev",
1127
- "source": {
1128
- "type": "git",
1129
- "url": "https://github.com/symfony/finder.git",
1130
- "reference": "bf0450cfe7282c5f06539c4733ba64273e91e918"
1131
- },
1132
- "dist": {
1133
- "type": "zip",
1134
- "url": "https://api.github.com/repos/symfony/finder/zipball/bf0450cfe7282c5f06539c4733ba64273e91e918",
1135
- "reference": "bf0450cfe7282c5f06539c4733ba64273e91e918",
1136
- "shasum": ""
1137
- },
1138
- "require": {
1139
- "php": "^5.5.9|>=7.0.8"
1140
- },
1141
- "type": "library",
1142
- "extra": {
1143
- "branch-alias": {
1144
- "dev-master": "3.4-dev"
1145
- }
1146
- },
1147
- "autoload": {
1148
- "psr-4": {
1149
- "Symfony\\Component\\Finder\\": ""
1150
- },
1151
- "exclude-from-classmap": [
1152
- "/Tests/"
1153
- ]
1154
- },
1155
- "notification-url": "https://packagist.org/downloads/",
1156
- "license": [
1157
- "MIT"
1158
- ],
1159
- "authors": [
1160
- {
1161
- "name": "Fabien Potencier",
1162
- "email": "fabien@symfony.com"
1163
- },
1164
- {
1165
- "name": "Symfony Community",
1166
- "homepage": "https://symfony.com/contributors"
1167
- }
1168
- ],
1169
- "description": "Symfony Finder Component",
1170
- "homepage": "https://symfony.com",
1171
- "time": "2017-08-03T09:34:20+00:00"
1172
- },
1173
- {
1174
- "name": "symfony/polyfill-mbstring",
1175
- "version": "dev-master",
1176
- "source": {
1177
- "type": "git",
1178
- "url": "https://github.com/symfony/polyfill-mbstring.git",
1179
- "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803"
1180
- },
1181
- "dist": {
1182
- "type": "zip",
1183
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7c8fae0ac1d216eb54349e6a8baa57d515fe8803",
1184
- "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803",
1185
- "shasum": ""
1186
- },
1187
- "require": {
1188
- "php": ">=5.3.3"
1189
- },
1190
- "suggest": {
1191
- "ext-mbstring": "For best performance"
1192
- },
1193
- "type": "library",
1194
- "extra": {
1195
- "branch-alias": {
1196
- "dev-master": "1.5-dev"
1197
- }
1198
- },
1199
- "autoload": {
1200
- "psr-4": {
1201
- "Symfony\\Polyfill\\Mbstring\\": ""
1202
- },
1203
- "files": [
1204
- "bootstrap.php"
1205
- ]
1206
- },
1207
- "notification-url": "https://packagist.org/downloads/",
1208
- "license": [
1209
- "MIT"
1210
- ],
1211
- "authors": [
1212
- {
1213
- "name": "Nicolas Grekas",
1214
- "email": "p@tchwork.com"
1215
- },
1216
- {
1217
- "name": "Symfony Community",
1218
- "homepage": "https://symfony.com/contributors"
1219
- }
1220
- ],
1221
- "description": "Symfony polyfill for the Mbstring extension",
1222
- "homepage": "https://symfony.com",
1223
- "keywords": [
1224
- "compatibility",
1225
- "mbstring",
1226
- "polyfill",
1227
- "portable",
1228
- "shim"
1229
- ],
1230
- "time": "2017-06-14T15:44:48+00:00"
1231
- },
1232
- {
1233
- "name": "symfony/process",
1234
- "version": "3.4.x-dev",
1235
- "source": {
1236
- "type": "git",
1237
- "url": "https://github.com/symfony/process.git",
1238
- "reference": "9794f948d9af3be0157185051275d78b24d68b92"
1239
- },
1240
- "dist": {
1241
- "type": "zip",
1242
- "url": "https://api.github.com/repos/symfony/process/zipball/9794f948d9af3be0157185051275d78b24d68b92",
1243
- "reference": "9794f948d9af3be0157185051275d78b24d68b92",
1244
- "shasum": ""
1245
- },
1246
- "require": {
1247
- "php": "^5.5.9|>=7.0.8"
1248
- },
1249
- "type": "library",
1250
- "extra": {
1251
- "branch-alias": {
1252
- "dev-master": "3.4-dev"
1253
- }
1254
- },
1255
- "autoload": {
1256
- "psr-4": {
1257
- "Symfony\\Component\\Process\\": ""
1258
- },
1259
- "exclude-from-classmap": [
1260
- "/Tests/"
1261
- ]
1262
- },
1263
- "notification-url": "https://packagist.org/downloads/",
1264
- "license": [
1265
- "MIT"
1266
- ],
1267
- "authors": [
1268
- {
1269
- "name": "Fabien Potencier",
1270
- "email": "fabien@symfony.com"
1271
- },
1272
- {
1273
- "name": "Symfony Community",
1274
- "homepage": "https://symfony.com/contributors"
1275
- }
1276
- ],
1277
- "description": "Symfony Process Component",
1278
- "homepage": "https://symfony.com",
1279
- "time": "2017-08-03T09:34:20+00:00"
1280
- },
1281
- {
1282
- "name": "symfony/translation",
1283
- "version": "3.4.x-dev",
1284
- "source": {
1285
- "type": "git",
1286
- "url": "https://github.com/symfony/translation.git",
1287
- "reference": "62bb068e004874bbe39624101e1aae70ca7c05cd"
1288
- },
1289
- "dist": {
1290
- "type": "zip",
1291
- "url": "https://api.github.com/repos/symfony/translation/zipball/62bb068e004874bbe39624101e1aae70ca7c05cd",
1292
- "reference": "62bb068e004874bbe39624101e1aae70ca7c05cd",
1293
- "shasum": ""
1294
- },
1295
- "require": {
1296
- "php": "^5.5.9|>=7.0.8",
1297
- "symfony/polyfill-mbstring": "~1.0"
1298
- },
1299
- "conflict": {
1300
- "symfony/config": "<2.8",
1301
- "symfony/dependency-injection": "<3.4",
1302
- "symfony/yaml": "<3.3"
1303
- },
1304
- "require-dev": {
1305
- "psr/log": "~1.0",
1306
- "symfony/config": "~2.8|~3.0|~4.0",
1307
- "symfony/dependency-injection": "~3.4|~4.0",
1308
- "symfony/intl": "^2.8.18|^3.2.5|~4.0",
1309
- "symfony/yaml": "~3.3|~4.0"
1310
- },
1311
- "suggest": {
1312
- "psr/log": "To use logging capability in translator",
1313
- "symfony/config": "",
1314
- "symfony/yaml": ""
1315
- },
1316
- "type": "library",
1317
- "extra": {
1318
- "branch-alias": {
1319
- "dev-master": "3.4-dev"
1320
- }
1321
- },
1322
- "autoload": {
1323
- "psr-4": {
1324
- "Symfony\\Component\\Translation\\": ""
1325
- },
1326
- "exclude-from-classmap": [
1327
- "/Tests/"
1328
- ]
1329
- },
1330
- "notification-url": "https://packagist.org/downloads/",
1331
- "license": [
1332
- "MIT"
1333
- ],
1334
- "authors": [
1335
- {
1336
- "name": "Fabien Potencier",
1337
- "email": "fabien@symfony.com"
1338
- },
1339
- {
1340
- "name": "Symfony Community",
1341
- "homepage": "https://symfony.com/contributors"
1342
- }
1343
- ],
1344
- "description": "Symfony Translation Component",
1345
- "homepage": "https://symfony.com",
1346
- "time": "2017-08-03T12:04:31+00:00"
1347
- },
1348
- {
1349
- "name": "symfony/yaml",
1350
- "version": "3.4.x-dev",
1351
- "source": {
1352
- "type": "git",
1353
- "url": "https://github.com/symfony/yaml.git",
1354
- "reference": "1395ddba6f65bf46cdf1d80d59223cbab8ff3ccc"
1355
- },
1356
- "dist": {
1357
- "type": "zip",
1358
- "url": "https://api.github.com/repos/symfony/yaml/zipball/1395ddba6f65bf46cdf1d80d59223cbab8ff3ccc",
1359
- "reference": "1395ddba6f65bf46cdf1d80d59223cbab8ff3ccc",
1360
- "shasum": ""
1361
- },
1362
- "require": {
1363
- "php": "^5.5.9|>=7.0.8"
1364
- },
1365
- "require-dev": {
1366
- "symfony/console": "~2.8|~3.0|~4.0"
1367
- },
1368
- "suggest": {
1369
- "symfony/console": "For validating YAML files using the lint command"
1370
- },
1371
- "type": "library",
1372
- "extra": {
1373
- "branch-alias": {
1374
- "dev-master": "3.4-dev"
1375
- }
1376
- },
1377
- "autoload": {
1378
- "psr-4": {
1379
- "Symfony\\Component\\Yaml\\": ""
1380
- },
1381
- "exclude-from-classmap": [
1382
- "/Tests/"
1383
- ]
1384
- },
1385
- "notification-url": "https://packagist.org/downloads/",
1386
- "license": [
1387
- "MIT"
1388
- ],
1389
- "authors": [
1390
- {
1391
- "name": "Fabien Potencier",
1392
- "email": "fabien@symfony.com"
1393
- },
1394
- {
1395
- "name": "Symfony Community",
1396
- "homepage": "https://symfony.com/contributors"
1397
- }
1398
- ],
1399
- "description": "Symfony Yaml Component",
1400
- "homepage": "https://symfony.com",
1401
- "time": "2017-08-04T13:29:48+00:00"
1402
- },
1403
- {
1404
- "name": "wp-cli/autoload-splitter",
1405
- "version": "v0.1.5",
1406
- "source": {
1407
- "type": "git",
1408
- "url": "https://github.com/wp-cli/autoload-splitter.git",
1409
- "reference": "fb4302da26390811d2631c62b42b75976d224bb8"
1410
- },
1411
- "dist": {
1412
- "type": "zip",
1413
- "url": "https://api.github.com/repos/wp-cli/autoload-splitter/zipball/fb4302da26390811d2631c62b42b75976d224bb8",
1414
- "reference": "fb4302da26390811d2631c62b42b75976d224bb8",
1415
- "shasum": ""
1416
- },
1417
- "require": {
1418
- "composer-plugin-api": "^1.1"
1419
- },
1420
- "type": "composer-plugin",
1421
- "extra": {
1422
- "class": "WP_CLI\\AutoloadSplitter\\ComposerPlugin"
1423
- },
1424
- "autoload": {
1425
- "psr-4": {
1426
- "WP_CLI\\AutoloadSplitter\\": "src"
1427
- }
1428
- },
1429
- "notification-url": "https://packagist.org/downloads/",
1430
- "license": [
1431
- "MIT"
1432
- ],
1433
- "authors": [
1434
- {
1435
- "name": "Alain Schlesser",
1436
- "email": "alain.schlesser@gmail.com",
1437
- "homepage": "https://www.alainschlesser.com"
1438
- }
1439
- ],
1440
- "description": "Composer plugin for splitting a generated autoloader into two distinct parts.",
1441
- "homepage": "https://wp-cli.org",
1442
- "time": "2017-08-03T08:40:16+00:00"
1443
- },
1444
- {
1445
- "name": "wp-cli/cache-command",
1446
- "version": "dev-master",
1447
- "source": {
1448
- "type": "git",
1449
- "url": "https://github.com/wp-cli/cache-command.git",
1450
- "reference": "485f7cc6630ecabe22bbf9fa9e827958e95a2d21"
1451
- },
1452
- "dist": {
1453
- "type": "zip",
1454
- "url": "https://api.github.com/repos/wp-cli/cache-command/zipball/485f7cc6630ecabe22bbf9fa9e827958e95a2d21",
1455
- "reference": "485f7cc6630ecabe22bbf9fa9e827958e95a2d21",
1456
- "shasum": ""
1457
- },
1458
- "require-dev": {
1459
- "behat/behat": "~2.5",
1460
- "wp-cli/wp-cli": "*"
1461
- },
1462
- "type": "wp-cli-package",
1463
- "extra": {
1464
- "branch-alias": {
1465
- "dev-master": "1.x-dev"
1466
- },
1467
- "bundled": true,
1468
- "commands": [
1469
- "cache",
1470
- "transient"
1471
- ]
1472
- },
1473
- "autoload": {
1474
- "psr-4": {
1475
- "": "src/"
1476
- },
1477
- "files": [
1478
- "cache-command.php"
1479
- ]
1480
- },
1481
- "notification-url": "https://packagist.org/downloads/",
1482
- "license": [
1483
- "MIT"
1484
- ],
1485
- "authors": [
1486
- {
1487
- "name": "Daniel Bachhuber",
1488
- "email": "daniel@runcommand.io",
1489
- "homepage": "https://runcommand.io"
1490
- }
1491
- ],
1492
- "description": "Manage object and transient caches.",
1493
- "homepage": "https://github.com/wp-cli/cache-command",
1494
- "time": "2017-08-04T11:37:19+00:00"
1495
- },
1496
- {
1497
- "name": "wp-cli/checksum-command",
1498
- "version": "dev-master",
1499
- "source": {
1500
- "type": "git",
1501
- "url": "https://github.com/wp-cli/checksum-command.git",
1502
- "reference": "88ccde2e82de5c2232842a9fccc2e6ade232dec6"
1503
- },
1504
- "dist": {
1505
- "type": "zip",
1506
- "url": "https://api.github.com/repos/wp-cli/checksum-command/zipball/88ccde2e82de5c2232842a9fccc2e6ade232dec6",
1507
- "reference": "88ccde2e82de5c2232842a9fccc2e6ade232dec6",
1508
- "shasum": ""
1509
- },
1510
- "require-dev": {
1511
- "behat/behat": "~2.5",
1512
- "wp-cli/wp-cli": "*"
1513
- },
1514
- "type": "wp-cli-package",
1515
- "extra": {
1516
- "branch-alias": {
1517
- "dev-master": "1.x-dev"
1518
- },
1519
- "bundled": true,
1520
- "commands": [
1521
- "checksum core"
1522
- ]
1523
- },
1524
- "autoload": {
1525
- "psr-4": {
1526
- "": "src/"
1527
- },
1528
- "files": [
1529
- "checksum-command.php"
1530
- ]
1531
- },
1532
- "notification-url": "https://packagist.org/downloads/",
1533
- "license": [
1534
- "MIT"
1535
- ],
1536
- "authors": [
1537
- {
1538
- "name": "Daniel Bachhuber",
1539
- "email": "daniel@runcommand.io",
1540
- "homepage": "https://runcommand.io"
1541
- }
1542
- ],
1543
- "description": "Verify WordPress core checksums.",
1544
- "homepage": "https://github.com/wp-cli/checksum-command",
1545
- "time": "2017-08-09T23:34:29+00:00"
1546
- },
1547
- {
1548
- "name": "wp-cli/config-command",
1549
- "version": "dev-master",
1550
- "source": {
1551
- "type": "git",
1552
- "url": "https://github.com/wp-cli/config-command.git",
1553
- "reference": "ca83ade8fb2d059b561744610947e38123b10c22"
1554
- },
1555
- "dist": {
1556
- "type": "zip",
1557
- "url": "https://api.github.com/repos/wp-cli/config-command/zipball/ca83ade8fb2d059b561744610947e38123b10c22",
1558
- "reference": "ca83ade8fb2d059b561744610947e38123b10c22",
1559
- "shasum": ""
1560
- },
1561
- "require-dev": {
1562
- "behat/behat": "~2.5",
1563
- "wp-cli/wp-cli": "*"
1564
- },
1565
- "type": "wp-cli-package",
1566
- "extra": {
1567
- "branch-alias": {
1568
- "dev-master": "1.x-dev"
1569
- },
1570
- "bundled": true,
1571
- "commands": [
1572
- "config",
1573
- "config create",
1574
- "config get",
1575
- "config path"
1576
- ]
1577
- },
1578
- "autoload": {
1579
- "psr-4": {
1580
- "": "src/"
1581
- },
1582
- "files": [
1583
- "config-command.php"
1584
- ]
1585
- },
1586
- "notification-url": "https://packagist.org/downloads/",
1587
- "license": [
1588
- "MIT"
1589
- ],
1590
- "authors": [
1591
- {
1592
- "name": "Daniel Bachhuber",
1593
- "email": "daniel@runcommand.io",
1594
- "homepage": "https://runcommand.io"
1595
- }
1596
- ],
1597
- "description": "Manage the wp-config.php file.",
1598
- "homepage": "https://github.com/wp-cli/config-command",
1599
- "time": "2017-08-04T23:41:35+00:00"
1600
- },
1601
- {
1602
- "name": "wp-cli/core-command",
1603
- "version": "dev-master",
1604
- "source": {
1605
- "type": "git",
1606
- "url": "https://github.com/wp-cli/core-command.git",
1607
- "reference": "fb743dab792e21b57163c5c0f563987d1471c152"
1608
- },
1609
- "dist": {
1610
- "type": "zip",
1611
- "url": "https://api.github.com/repos/wp-cli/core-command/zipball/fb743dab792e21b57163c5c0f563987d1471c152",
1612
- "reference": "fb743dab792e21b57163c5c0f563987d1471c152",
1613
- "shasum": ""
1614
- },
1615
- "require-dev": {
1616
- "behat/behat": "~2.5",
1617
- "wp-cli/wp-cli": "*"
1618
- },
1619
- "type": "wp-cli-package",
1620
- "extra": {
1621
- "branch-alias": {
1622
- "dev-master": "1.x-dev"
1623
- },
1624
- "bundled": true,
1625
- "commands": [
1626
- "core check-update",
1627
- "core download",
1628
- "core install",
1629
- "core is-installed",
1630
- "core multisite-convert",
1631
- "core multisite-install",
1632
- "core update",
1633
- "core update-db",
1634
- "core version"
1635
- ]
1636
- },
1637
- "autoload": {
1638
- "psr-4": {
1639
- "": "src/"
1640
- },
1641
- "files": [
1642
- "core-command.php"
1643
- ]
1644
- },
1645
- "notification-url": "https://packagist.org/downloads/",
1646
- "license": [
1647
- "MIT"
1648
- ],
1649
- "authors": [
1650
- {
1651
- "name": "Daniel Bachhuber",
1652
- "email": "daniel@runcommand.io",
1653
- "homepage": "https://runcommand.io"
1654
- }
1655
- ],
1656
- "description": "Download, install, update and manage a WordPress install.",
1657
- "homepage": "https://github.com/wp-cli/core-command",
1658
- "time": "2017-08-04T12:31:18+00:00"
1659
- },
1660
- {
1661
- "name": "wp-cli/cron-command",
1662
- "version": "dev-master",
1663
- "source": {
1664
- "type": "git",
1665
- "url": "https://github.com/wp-cli/cron-command.git",
1666
- "reference": "92114b695ab0253bb705d9bd3e6d2fb47b51fad2"
1667
- },
1668
- "dist": {
1669
- "type": "zip",
1670
- "url": "https://api.github.com/repos/wp-cli/cron-command/zipball/92114b695ab0253bb705d9bd3e6d2fb47b51fad2",
1671
- "reference": "92114b695ab0253bb705d9bd3e6d2fb47b51fad2",
1672
- "shasum": ""
1673
- },
1674
- "require-dev": {
1675
- "behat/behat": "~2.5",
1676
- "wp-cli/wp-cli": "*"
1677
- },
1678
- "type": "wp-cli-package",
1679
- "extra": {
1680
- "branch-alias": {
1681
- "dev-master": "1.x-dev"
1682
- },
1683
- "bundled": true,
1684
- "commands": [
1685
- "cron test",
1686
- "cron event delete",
1687
- "cron event list",
1688
- "cron event run",
1689
- "cron event schedule",
1690
- "cron schedule list"
1691
- ]
1692
- },
1693
- "autoload": {
1694
- "psr-4": {
1695
- "": "src/"
1696
- },
1697
- "files": [
1698
- "cron-command.php"
1699
- ]
1700
- },
1701
- "notification-url": "https://packagist.org/downloads/",
1702
- "license": [
1703
- "MIT"
1704
- ],
1705
- "authors": [
1706
- {
1707
- "name": "Daniel Bachhuber",
1708
- "email": "daniel@runcommand.io",
1709
- "homepage": "https://runcommand.io"
1710
- }
1711
- ],
1712
- "description": "Manage WP-Cron events and schedules.",
1713
- "homepage": "https://github.com/wp-cli/cron-command",
1714
- "time": "2017-08-04T12:45:50+00:00"
1715
- },
1716
- {
1717
- "name": "wp-cli/db-command",
1718
- "version": "dev-master",
1719
- "source": {
1720
- "type": "git",
1721
- "url": "https://github.com/wp-cli/db-command.git",
1722
- "reference": "5c597abb642bcaf329e7da0801c69f4405d41c23"
1723
- },
1724
- "dist": {
1725
- "type": "zip",
1726
- "url": "https://api.github.com/repos/wp-cli/db-command/zipball/5c597abb642bcaf329e7da0801c69f4405d41c23",
1727
- "reference": "5c597abb642bcaf329e7da0801c69f4405d41c23",
1728
- "shasum": ""
1729
- },
1730
- "require": {
1731
- "wp-cli/wp-cli": "*"
1732
- },
1733
- "require-dev": {
1734
- "behat/behat": "~2.5"
1735
- },
1736
- "type": "wp-cli-package",
1737
- "extra": {
1738
- "branch-alias": {
1739
- "dev-master": "1.x-dev"
1740
- },
1741
- "bundled": true,
1742
- "commands": [
1743
- "db create",
1744
- "db drop",
1745
- "db reset",
1746
- "db check",
1747
- "db optimize",
1748
- "db prefix",
1749
- "db repair",
1750
- "db cli",
1751
- "db query",
1752
- "db export",
1753
- "db import",
1754
- "db search",
1755
- "db tables",
1756
- "db size"
1757
- ]
1758
- },
1759
- "autoload": {
1760
- "psr-4": {
1761
- "": "src/"
1762
- },
1763
- "files": [
1764
- "db-command.php"
1765
- ]
1766
- },
1767
- "notification-url": "https://packagist.org/downloads/",
1768
- "license": [
1769
- "MIT"
1770
- ],
1771
- "authors": [
1772
- {
1773
- "name": "Daniel Bachhuber",
1774
- "email": "daniel@runcommand.io",
1775
- "homepage": "https://runcommand.io"
1776
- }
1777
- ],
1778
- "description": "Perform basic database operations using credentials stored in wp-config.php.",
1779
- "homepage": "https://github.com/wp-cli/db-command",
1780
- "time": "2017-08-04T23:21:46+00:00"
1781
- },
1782
- {
1783
- "name": "wp-cli/entity-command",
1784
- "version": "dev-master",
1785
- "source": {
1786
- "type": "git",
1787
- "url": "https://github.com/wp-cli/entity-command.git",
1788
- "reference": "d0cd99c14e4d01aad368328da97231df0c01f9dc"
1789
- },
1790
- "dist": {
1791
- "type": "zip",
1792
- "url": "https://api.github.com/repos/wp-cli/entity-command/zipball/d0cd99c14e4d01aad368328da97231df0c01f9dc",
1793
- "reference": "d0cd99c14e4d01aad368328da97231df0c01f9dc",
1794
- "shasum": ""
1795
- },
1796
- "require-dev": {
1797
- "behat/behat": "~2.5",
1798
- "phpunit/phpunit": "^4.8",
1799
- "wp-cli/wp-cli": "*"
1800
- },
1801
- "type": "wp-cli-package",
1802
- "extra": {
1803
- "branch-alias": {
1804
- "dev-master": "1.x-dev"
1805
- },
1806
- "bundled": true,
1807
- "commands": [
1808
- "comment",
1809
- "comment meta",
1810
- "menu",
1811
- "menu item",
1812
- "menu location",
1813
- "network meta",
1814
- "option",
1815
- "option add",
1816
- "option delete",
1817
- "option get",
1818
- "option list",
1819
- "option update",
1820
- "post",
1821
- "post meta",
1822
- "post term",
1823
- "post-type",
1824
- "site",
1825
- "taxonomy",
1826
- "term",
1827
- "term meta",
1828
- "user",
1829
- "user meta",
1830
- "user term"
1831
- ]
1832
- },
1833
- "autoload": {
1834
- "psr-4": {
1835
- "": "src/",
1836
- "WP_CLI\\": "src/WP_CLI"
1837
- },
1838
- "files": [
1839
- "entity-command.php"
1840
- ]
1841
- },
1842
- "notification-url": "https://packagist.org/downloads/",
1843
- "license": [
1844
- "MIT"
1845
- ],
1846
- "authors": [
1847
- {
1848
- "name": "Daniel Bachhuber",
1849
- "email": "daniel@runcommand.io",
1850
- "homepage": "https://runcommand.io"
1851
- }
1852
- ],
1853
- "description": "Manage WordPress core entities.",
1854
- "homepage": "https://github.com/wp-cli/entity-command",
1855
- "time": "2017-08-11T11:53:04+00:00"
1856
- },
1857
- {
1858
- "name": "wp-cli/eval-command",
1859
- "version": "dev-master",
1860
- "source": {
1861
- "type": "git",
1862
- "url": "https://github.com/wp-cli/eval-command.git",
1863
- "reference": "e3d9502a4f8b8f582130dbb3b8ede76e17ac05a4"
1864
- },
1865
- "dist": {
1866
- "type": "zip",
1867
- "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/e3d9502a4f8b8f582130dbb3b8ede76e17ac05a4",
1868
- "reference": "e3d9502a4f8b8f582130dbb3b8ede76e17ac05a4",
1869
- "shasum": ""
1870
- },
1871
- "require": {
1872
- "wp-cli/wp-cli": "*"
1873
- },
1874
- "require-dev": {
1875
- "behat/behat": "~2.5"
1876
- },
1877
- "type": "wp-cli-package",
1878
- "extra": {
1879
- "branch-alias": {
1880
- "dev-master": "1.x-dev"
1881
- },
1882
- "bundled": true,
1883
- "commands": [
1884
- "eval",
1885
- "eval-file"
1886
- ]
1887
- },
1888
- "autoload": {
1889
- "psr-4": {
1890
- "": "src/"
1891
- },
1892
- "files": [
1893
- "eval-command.php"
1894
- ]
1895
- },
1896
- "notification-url": "https://packagist.org/downloads/",
1897
- "license": [
1898
- "MIT"
1899
- ],
1900
- "authors": [
1901
- {
1902
- "name": "Daniel Bachhuber",
1903
- "email": "daniel@runcommand.io",
1904
- "homepage": "https://runcommand.io"
1905
- }
1906
- ],
1907
- "description": "Execute arbitrary PHP code.",
1908
- "homepage": "https://github.com/wp-cli/eval-command",
1909
- "time": "2017-08-04T12:46:58+00:00"
1910
- },
1911
- {
1912
- "name": "wp-cli/export-command",
1913
- "version": "dev-master",
1914
- "source": {
1915
- "type": "git",
1916
- "url": "https://github.com/wp-cli/export-command.git",
1917
- "reference": "f5647155830d1275de4cb69cfb79748b9449b8ab"
1918
- },
1919
- "dist": {
1920
- "type": "zip",
1921
- "url": "https://api.github.com/repos/wp-cli/export-command/zipball/f5647155830d1275de4cb69cfb79748b9449b8ab",
1922
- "reference": "f5647155830d1275de4cb69cfb79748b9449b8ab",
1923
- "shasum": ""
1924
- },
1925
- "require": {
1926
- "nb/oxymel": "~0.1.0",
1927
- "wp-cli/wp-cli": "*"
1928
- },
1929
- "require-dev": {
1930
- "behat/behat": "~2.5"
1931
- },
1932
- "type": "wp-cli-package",
1933
- "extra": {
1934
- "branch-alias": {
1935
- "dev-master": "1.x-dev"
1936
- },
1937
- "bundled": true,
1938
- "commands": [
1939
- "export"
1940
- ]
1941
- },
1942
- "autoload": {
1943
- "psr-4": {
1944
- "": "src/"
1945
- },
1946
- "files": [
1947
- "export-command.php"
1948
- ]
1949
- },
1950
- "notification-url": "https://packagist.org/downloads/",
1951
- "license": [
1952
- "MIT"
1953
- ],
1954
- "authors": [
1955
- {
1956
- "name": "Daniel Bachhuber",
1957
- "email": "daniel@runcommand.io",
1958
- "homepage": "https://runcommand.io"
1959
- }
1960
- ],
1961
- "description": "Export WordPress content to a WXR file.",
1962
- "homepage": "https://github.com/wp-cli/export-command",
1963
- "time": "2017-08-04T13:13:08+00:00"
1964
- },
1965
- {
1966
- "name": "wp-cli/extension-command",
1967
- "version": "dev-master",
1968
- "source": {
1969
- "type": "git",
1970
- "url": "https://github.com/wp-cli/extension-command.git",
1971
- "reference": "08bf48e842b9e1cb579b50cec1b6897cebf65bda"
1972
- },
1973
- "dist": {
1974
- "type": "zip",
1975
- "url": "https://api.github.com/repos/wp-cli/extension-command/zipball/08bf48e842b9e1cb579b50cec1b6897cebf65bda",
1976
- "reference": "08bf48e842b9e1cb579b50cec1b6897cebf65bda",
1977
- "shasum": ""
1978
- },
1979
- "require-dev": {
1980
- "behat/behat": "~2.5",
1981
- "wp-cli/wp-cli": "*"
1982
- },
1983
- "type": "wp-cli-package",
1984
- "extra": {
1985
- "branch-alias": {
1986
- "dev-master": "1.x-dev"
1987
- },
1988
- "bundled": true,
1989
- "commands": [
1990
- "plugin activate",
1991
- "plugin deactivate",
1992
- "plugin delete",
1993
- "plugin get",
1994
- "plugin install",
1995
- "plugin is-installed",
1996
- "plugin list",
1997
- "plugin path",
1998
- "plugin search",
1999
- "plugin status",
2000
- "plugin toggle",
2001
- "plugin uninstall",
2002
- "plugin update",
2003
- "theme activate",
2004
- "theme delete",
2005
- "theme disable",
2006
- "theme enable",
2007
- "theme get",
2008
- "theme install",
2009
- "theme is-installed",
2010
- "theme list",
2011
- "theme mod get",
2012
- "theme mod set",
2013
- "theme mod remove",
2014
- "theme path",
2015
- "theme search",
2016
- "theme status",
2017
- "theme update"
2018
- ]
2019
- },
2020
- "autoload": {
2021
- "psr-4": {
2022
- "": "src/",
2023
- "WP_CLI\\": "src/WP_CLI"
2024
- },
2025
- "files": [
2026
- "extension-command.php"
2027
- ]
2028
- },
2029
- "notification-url": "https://packagist.org/downloads/",
2030
- "license": [
2031
- "MIT"
2032
- ],
2033
- "authors": [
2034
- {
2035
- "name": "Daniel Bachhuber",
2036
- "email": "daniel@runcommand.io",
2037
- "homepage": "https://runcommand.io"
2038
- }
2039
- ],
2040
- "description": "Manage WordPress plugins and themes.",
2041
- "homepage": "https://github.com/wp-cli/extension-command",
2042
- "time": "2017-08-04T13:43:53+00:00"
2043
- },
2044
- {
2045
- "name": "wp-cli/import-command",
2046
- "version": "dev-master",
2047
- "source": {
2048
- "type": "git",
2049
- "url": "https://github.com/wp-cli/import-command.git",
2050
- "reference": "89d14aa4b8b621effbe7f9bacad2ea8a096598a7"
2051
- },
2052
- "dist": {
2053
- "type": "zip",
2054
- "url": "https://api.github.com/repos/wp-cli/import-command/zipball/89d14aa4b8b621effbe7f9bacad2ea8a096598a7",
2055
- "reference": "89d14aa4b8b621effbe7f9bacad2ea8a096598a7",
2056
- "shasum": ""
2057
- },
2058
- "require": {
2059
- "wp-cli/wp-cli": "*"
2060
- },
2061
- "require-dev": {
2062
- "behat/behat": "~2.5"
2063
- },
2064
- "type": "wp-cli-package",
2065
- "extra": {
2066
- "branch-alias": {
2067
- "dev-master": "1.x-dev"
2068
- },
2069
- "bundled": true,
2070
- "commands": [
2071
- "import"
2072
- ]
2073
- },
2074
- "autoload": {
2075
- "psr-4": {
2076
- "": "src/"
2077
- },
2078
- "files": [
2079
- "import-command.php"
2080
- ]
2081
- },
2082
- "notification-url": "https://packagist.org/downloads/",
2083
- "license": [
2084
- "MIT"
2085
- ],
2086
- "authors": [
2087
- {
2088
- "name": "Daniel Bachhuber",
2089
- "email": "daniel@runcommand.io",
2090
- "homepage": "https://runcommand.io"
2091
- }
2092
- ],
2093
- "description": "Import content from a WXR file.",
2094
- "homepage": "https://github.com/wp-cli/import-command",
2095
- "time": "2017-08-04T13:45:57+00:00"
2096
- },
2097
- {
2098
- "name": "wp-cli/language-command",
2099
- "version": "dev-master",
2100
- "source": {
2101
- "type": "git",
2102
- "url": "https://github.com/wp-cli/language-command.git",
2103
- "reference": "aff3fb6c6d7698008c7e5d33a97b25457091ae1b"
2104
- },
2105
- "dist": {
2106
- "type": "zip",
2107
- "url": "https://api.github.com/repos/wp-cli/language-command/zipball/aff3fb6c6d7698008c7e5d33a97b25457091ae1b",
2108
- "reference": "aff3fb6c6d7698008c7e5d33a97b25457091ae1b",
2109
- "shasum": ""
2110
- },
2111
- "require-dev": {
2112
- "behat/behat": "~2.5",
2113
- "wp-cli/wp-cli": "*"
2114
- },
2115
- "type": "wp-cli-package",
2116
- "extra": {
2117
- "branch-alias": {
2118
- "dev-master": "1.x-dev"
2119
- },
2120
- "commands": [
2121
- "language core activate",
2122
- "language core install",
2123
- "language core list",
2124
- "language core uninstall",
2125
- "language core update"
2126
- ],
2127
- "bundled": true
2128
- },
2129
- "autoload": {
2130
- "psr-4": {
2131
- "": "src/"
2132
- },
2133
- "files": [
2134
- "language-command.php"
2135
- ]
2136
- },
2137
- "notification-url": "https://packagist.org/downloads/",
2138
- "license": [
2139
- "MIT"
2140
- ],
2141
- "authors": [
2142
- {
2143
- "name": "Daniel Bachhuber",
2144
- "email": "daniel@runcommand.io",
2145
- "homepage": "https://runcommand.io"
2146
- }
2147
- ],
2148
- "description": "Manage language packs.",
2149
- "homepage": "https://github.com/wp-cli/language-command",
2150
- "time": "2017-08-04T23:23:03+00:00"
2151
- },
2152
- {
2153
- "name": "wp-cli/media-command",
2154
- "version": "dev-master",
2155
- "source": {
2156
- "type": "git",
2157
- "url": "https://github.com/wp-cli/media-command.git",
2158
- "reference": "4a19de54a11c96b21c10719e2b7f9dd131c4261e"
2159
- },
2160
- "dist": {
2161
- "type": "zip",
2162
- "url": "https://api.github.com/repos/wp-cli/media-command/zipball/4a19de54a11c96b21c10719e2b7f9dd131c4261e",
2163
- "reference": "4a19de54a11c96b21c10719e2b7f9dd131c4261e",
2164
- "shasum": ""
2165
- },
2166
- "require": {
2167
- "wp-cli/wp-cli": "*"
2168
- },
2169
- "require-dev": {
2170
- "behat/behat": "~2.5"
2171
- },
2172
- "type": "wp-cli-package",
2173
- "extra": {
2174
- "branch-alias": {
2175
- "dev-master": "1.x-dev"
2176
- },
2177
- "commands": [
2178
- "media import",
2179
- "media regenerate"
2180
- ],
2181
- "bundled": true
2182
- },
2183
- "autoload": {
2184
- "psr-4": {
2185
- "": "src/"
2186
- },
2187
- "files": [
2188
- "media-command.php"
2189
- ]
2190
- },
2191
- "notification-url": "https://packagist.org/downloads/",
2192
- "license": [
2193
- "MIT"
2194
- ],
2195
- "authors": [
2196
- {
2197
- "name": "Daniel Bachhuber",
2198
- "email": "daniel@runcommand.io",
2199
- "homepage": "https://runcommand.io"
2200
- }
2201
- ],
2202
- "description": "Import new attachments or regenerate existing ones.",
2203
- "homepage": "https://github.com/wp-cli/media-command",
2204
- "time": "2017-08-05T04:54:48+00:00"
2205
- },
2206
- {
2207
- "name": "wp-cli/mustangostang-spyc",
2208
- "version": "0.6.3",
2209
- "source": {
2210
- "type": "git",
2211
- "url": "https://github.com/wp-cli/spyc.git",
2212
- "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7"
2213
- },
2214
- "dist": {
2215
- "type": "zip",
2216
- "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7",
2217
- "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7",
2218
- "shasum": ""
2219
- },
2220
- "require": {
2221
- "php": ">=5.3.1"
2222
- },
2223
- "require-dev": {
2224
- "phpunit/phpunit": "4.3.*@dev"
2225
- },
2226
- "type": "library",
2227
- "extra": {
2228
- "branch-alias": {
2229
- "dev-master": "0.5.x-dev"
2230
- }
2231
- },
2232
- "autoload": {
2233
- "psr-4": {
2234
- "Mustangostang\\": "src/"
2235
- },
2236
- "files": [
2237
- "includes/functions.php"
2238
- ]
2239
- },
2240
- "notification-url": "https://packagist.org/downloads/",
2241
- "license": [
2242
- "MIT"
2243
- ],
2244
- "authors": [
2245
- {
2246
- "name": "mustangostang",
2247
- "email": "vlad.andersen@gmail.com"
2248
- }
2249
- ],
2250
- "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)",
2251
- "homepage": "https://github.com/mustangostang/spyc/",
2252
- "time": "2017-04-25T11:26:20+00:00"
2253
- },
2254
- {
2255
- "name": "wp-cli/package-command",
2256
- "version": "dev-master",
2257
- "source": {
2258
- "type": "git",
2259
- "url": "https://github.com/wp-cli/package-command.git",
2260
- "reference": "744692180a4240ddc75a3196934cafe396dd9178"
2261
- },
2262
- "dist": {
2263
- "type": "zip",
2264
- "url": "https://api.github.com/repos/wp-cli/package-command/zipball/744692180a4240ddc75a3196934cafe396dd9178",
2265
- "reference": "744692180a4240ddc75a3196934cafe396dd9178",
2266
- "shasum": ""
2267
- },
2268
- "require": {
2269
- "composer/composer": "^1.2.0",
2270
- "wp-cli/wp-cli": "*"
2271
- },
2272
- "require-dev": {
2273
- "behat/behat": "~2.5"
2274
- },
2275
- "type": "wp-cli-package",
2276
- "extra": {
2277
- "branch-alias": {
2278
- "dev-master": "1.x-dev"
2279
- },
2280
- "commands": [
2281
- "package browse",
2282
- "package install",
2283
- "package list",
2284
- "package update",
2285
- "package uninstall"
2286
- ],
2287
- "bundled": true
2288
- },
2289
- "autoload": {
2290
- "psr-4": {
2291
- "": "src/"
2292
- },
2293
- "files": [
2294
- "package-command.php"
2295
- ]
2296
- },
2297
- "notification-url": "https://packagist.org/downloads/",
2298
- "license": [
2299
- "MIT"
2300
- ],
2301
- "authors": [
2302
- {
2303
- "name": "Daniel Bachhuber",
2304
- "email": "daniel@runcommand.io",
2305
- "homepage": "https://runcommand.io"
2306
- }
2307
- ],
2308
- "description": "Manage WP-CLI packages.",
2309
- "homepage": "https://github.com/wp-cli/package-command",
2310
- "time": "2017-08-07T12:21:11+00:00"
2311
- },
2312
- {
2313
- "name": "wp-cli/php-cli-tools",
2314
- "version": "v0.11.6",
2315
- "source": {
2316
- "type": "git",
2317
- "url": "https://github.com/wp-cli/php-cli-tools.git",
2318
- "reference": "d2a4e2eca9f1cd62a5d30f192d10f74e73eb3a05"
2319
- },
2320
- "dist": {
2321
- "type": "zip",
2322
- "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/d2a4e2eca9f1cd62a5d30f192d10f74e73eb3a05",
2323
- "reference": "d2a4e2eca9f1cd62a5d30f192d10f74e73eb3a05",
2324
- "shasum": ""
2325
- },
2326
- "require": {
2327
- "php": ">= 5.3.0"
2328
- },
2329
- "type": "library",
2330
- "autoload": {
2331
- "psr-0": {
2332
- "cli": "lib/"
2333
- },
2334
- "files": [
2335
- "lib/cli/cli.php"
2336
- ]
2337
- },
2338
- "notification-url": "https://packagist.org/downloads/",
2339
- "license": [
2340
- "MIT"
2341
- ],
2342
- "authors": [
2343
- {
2344
- "name": "James Logsdon",
2345
- "email": "jlogsdon@php.net",
2346
- "role": "Developer"
2347
- },
2348
- {
2349
- "name": "Daniel Bachhuber",
2350
- "email": "daniel@handbuilt.co",
2351
- "role": "Maintainer"
2352
- }
2353
- ],
2354
- "description": "Console utilities for PHP",
2355
- "homepage": "http://github.com/wp-cli/php-cli-tools",
2356
- "keywords": [
2357
- "cli",
2358
- "console"
2359
- ],
2360
- "time": "2017-08-04T10:42:04+00:00"
2361
- },
2362
- {
2363
- "name": "wp-cli/rewrite-command",
2364
- "version": "dev-master",
2365
- "source": {
2366
- "type": "git",
2367
- "url": "https://github.com/wp-cli/rewrite-command.git",
2368
- "reference": "e858feac8d3fe053e052d8af43c090ff0b2a4e8a"
2369
- },
2370
- "dist": {
2371
- "type": "zip",
2372
- "url": "https://api.github.com/repos/wp-cli/rewrite-command/zipball/e858feac8d3fe053e052d8af43c090ff0b2a4e8a",
2373
- "reference": "e858feac8d3fe053e052d8af43c090ff0b2a4e8a",
2374
- "shasum": ""
2375
- },
2376
- "require-dev": {
2377
- "behat/behat": "~2.5",
2378
- "wp-cli/wp-cli": "*"
2379
- },
2380
- "type": "wp-cli-package",
2381
- "extra": {
2382
- "branch-alias": {
2383
- "dev-master": "1.x-dev"
2384
- },
2385
- "commands": [
2386
- "rewrite flush",
2387
- "rewrite list",
2388
- "rewrite structure"
2389
- ],
2390
- "bundled": true
2391
- },
2392
- "autoload": {
2393
- "psr-4": {
2394
- "": "src/"
2395
- },
2396
- "files": [
2397
- "rewrite-command.php"
2398
- ]
2399
- },
2400
- "notification-url": "https://packagist.org/downloads/",
2401
- "license": [
2402
- "MIT"
2403
- ],
2404
- "authors": [
2405
- {
2406
- "name": "Daniel Bachhuber",
2407
- "email": "daniel@runcommand.io",
2408
- "homepage": "https://runcommand.io"
2409
- }
2410
- ],
2411
- "description": "Manage rewrite rules.",
2412
- "homepage": "https://github.com/wp-cli/rewrite-command",
2413
- "time": "2017-08-04T15:15:53+00:00"
2414
- },
2415
- {
2416
- "name": "wp-cli/role-command",
2417
- "version": "dev-master",
2418
- "source": {
2419
- "type": "git",
2420
- "url": "https://github.com/wp-cli/role-command.git",
2421
- "reference": "85ddf53525b14ab040830f385710f4493058d295"
2422
- },
2423
- "dist": {
2424
- "type": "zip",
2425
- "url": "https://api.github.com/repos/wp-cli/role-command/zipball/85ddf53525b14ab040830f385710f4493058d295",
2426
- "reference": "85ddf53525b14ab040830f385710f4493058d295",
2427
- "shasum": ""
2428
- },
2429
- "require-dev": {
2430
- "behat/behat": "~2.5",
2431
- "wp-cli/wp-cli": "*"
2432
- },
2433
- "type": "wp-cli-package",
2434
- "extra": {
2435
- "branch-alias": {
2436
- "dev-master": "1.x-dev"
2437
- },
2438
- "commands": [
2439
- "role create",
2440
- "role delete",
2441
- "role exists",
2442
- "role list",
2443
- "role reset",
2444
- "cap add",
2445
- "cap list",
2446
- "cap remove"
2447
- ],
2448
- "bundled": true
2449
- },
2450
- "autoload": {
2451
- "psr-4": {
2452
- "": "src/"
2453
- },
2454
- "files": [
2455
- "role-command.php"
2456
- ]
2457
- },
2458
- "notification-url": "https://packagist.org/downloads/",
2459
- "license": [
2460
- "MIT"
2461
- ],
2462
- "authors": [
2463
- {
2464
- "name": "Daniel Bachhuber",
2465
- "email": "daniel@runcommand.io",
2466
- "homepage": "https://runcommand.io"
2467
- }
2468
- ],
2469
- "description": "Manage user roles and capabilities.",
2470
- "homepage": "https://github.com/wp-cli/role-command",
2471
- "time": "2017-08-04T15:17:29+00:00"
2472
- },
2473
- {
2474
- "name": "wp-cli/scaffold-command",
2475
- "version": "dev-master",
2476
- "source": {
2477
- "type": "git",
2478
- "url": "https://github.com/wp-cli/scaffold-command.git",
2479
- "reference": "41f1e1aa41af76b70d6cf3d21d52995e854acf4c"
2480
- },
2481
- "dist": {
2482
- "type": "zip",
2483
- "url": "https://api.github.com/repos/wp-cli/scaffold-command/zipball/41f1e1aa41af76b70d6cf3d21d52995e854acf4c",
2484
- "reference": "41f1e1aa41af76b70d6cf3d21d52995e854acf4c",
2485
- "shasum": ""
2486
- },
2487
- "require-dev": {
2488
- "behat/behat": "~2.5",
2489
- "wp-cli/wp-cli": "*"
2490
- },
2491
- "type": "wp-cli-package",
2492
- "extra": {
2493
- "branch-alias": {
2494
- "dev-master": "1.x-dev"
2495
- },
2496
- "commands": [
2497
- "scaffold",
2498
- "scaffold _s",
2499
- "scaffold child-theme",
2500
- "scaffold plugin",
2501
- "scaffold plugin-tests",
2502
- "scaffold post-type",
2503
- "scaffold taxonomy",
2504
- "scaffold theme-tests"
2505
- ],
2506
- "bundled": true
2507
- },
2508
- "autoload": {
2509
- "psr-4": {
2510
- "": "src/"
2511
- },
2512
- "files": [
2513
- "scaffold-command.php"
2514
- ]
2515
- },
2516
- "notification-url": "https://packagist.org/downloads/",
2517
- "license": [
2518
- "MIT"
2519
- ],
2520
- "authors": [
2521
- {
2522
- "name": "Daniel Bachhuber",
2523
- "email": "daniel@runcommand.io",
2524
- "homepage": "https://runcommand.io"
2525
- }
2526
- ],
2527
- "description": "Generate code for post types, taxonomies, plugins, child themes, etc.",
2528
- "homepage": "https://github.com/wp-cli/scaffold-command",
2529
- "time": "2017-08-11T08:07:10+00:00"
2530
- },
2531
- {
2532
- "name": "wp-cli/search-replace-command",
2533
- "version": "dev-master",
2534
- "source": {
2535
- "type": "git",
2536
- "url": "https://github.com/wp-cli/search-replace-command.git",
2537
- "reference": "3e7499a65354e3a322d4d1043123b3fa55ef4f12"
2538
- },
2539
- "dist": {
2540
- "type": "zip",
2541
- "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/3e7499a65354e3a322d4d1043123b3fa55ef4f12",
2542
- "reference": "3e7499a65354e3a322d4d1043123b3fa55ef4f12",
2543
- "shasum": ""
2544
- },
2545
- "require": {
2546
- "wp-cli/wp-cli": "*"
2547
- },
2548
- "require-dev": {
2549
- "behat/behat": "~2.5"
2550
- },
2551
- "type": "wp-cli-package",
2552
- "extra": {
2553
- "branch-alias": {
2554
- "dev-master": "1.x-dev"
2555
- },
2556
- "commands": [
2557
- "search-replace"
2558
- ],
2559
- "bundled": true
2560
- },
2561
- "autoload": {
2562
- "psr-4": {
2563
- "": "src/",
2564
- "WP_CLI\\": "src/WP_CLI"
2565
- },
2566
- "files": [
2567
- "search-replace-command.php"
2568
- ]
2569
- },
2570
- "notification-url": "https://packagist.org/downloads/",
2571
- "license": [
2572
- "MIT"
2573
- ],
2574
- "authors": [
2575
- {
2576
- "name": "Daniel Bachhuber",
2577
- "email": "daniel@runcommand.io",
2578
- "homepage": "https://runcommand.io"
2579
- }
2580
- ],
2581
- "description": "Search/replace strings in the database.",
2582
- "homepage": "https://github.com/wp-cli/search-replace-command",
2583
- "time": "2017-08-08T16:41:49+00:00"
2584
- },
2585
- {
2586
- "name": "wp-cli/server-command",
2587
- "version": "dev-master",
2588
- "source": {
2589
- "type": "git",
2590
- "url": "https://github.com/wp-cli/server-command.git",
2591
- "reference": "ce93df07c33e716adbbd2d329c311a3c1dd3a0b0"
2592
- },
2593
- "dist": {
2594
- "type": "zip",
2595
- "url": "https://api.github.com/repos/wp-cli/server-command/zipball/ce93df07c33e716adbbd2d329c311a3c1dd3a0b0",
2596
- "reference": "ce93df07c33e716adbbd2d329c311a3c1dd3a0b0",
2597
- "shasum": ""
2598
- },
2599
- "require": {
2600
- "wp-cli/wp-cli": "*"
2601
- },
2602
- "require-dev": {
2603
- "behat/behat": "~2.5"
2604
- },
2605
- "type": "wp-cli-package",
2606
- "extra": {
2607
- "branch-alias": {
2608
- "dev-master": "1.x-dev"
2609
- },
2610
- "commands": [
2611
- "server"
2612
- ],
2613
- "bundled": true
2614
- },
2615
- "autoload": {
2616
- "psr-4": {
2617
- "": "src/"
2618
- },
2619
- "files": [
2620
- "server-command.php"
2621
- ]
2622
- },
2623
- "notification-url": "https://packagist.org/downloads/",
2624
- "license": [
2625
- "MIT"
2626
- ],
2627
- "authors": [
2628
- {
2629
- "name": "Daniel Bachhuber",
2630
- "email": "daniel@runcommand.io",
2631
- "homepage": "https://runcommand.io"
2632
- }
2633
- ],
2634
- "description": "Launch PHP's built-in web server for this specific WordPress installation.",
2635
- "homepage": "https://github.com/wp-cli/server-command",
2636
- "time": "2017-08-04T15:19:26+00:00"
2637
- },
2638
- {
2639
- "name": "wp-cli/shell-command",
2640
- "version": "dev-master",
2641
- "source": {
2642
- "type": "git",
2643
- "url": "https://github.com/wp-cli/shell-command.git",
2644
- "reference": "70681666302cc193a1bd41bade9ecc61e74a8c83"
2645
- },
2646
- "dist": {
2647
- "type": "zip",
2648
- "url": "https://api.github.com/repos/wp-cli/shell-command/zipball/70681666302cc193a1bd41bade9ecc61e74a8c83",
2649
- "reference": "70681666302cc193a1bd41bade9ecc61e74a8c83",
2650
- "shasum": ""
2651
- },
2652
- "require": {
2653
- "wp-cli/wp-cli": "*"
2654
- },
2655
- "require-dev": {
2656
- "behat/behat": "~2.5"
2657
- },
2658
- "type": "wp-cli-package",
2659
- "extra": {
2660
- "branch-alias": {
2661
- "dev-master": "1.x-dev"
2662
- },
2663
- "commands": [
2664
- "shell"
2665
- ],
2666
- "bundled": true
2667
- },
2668
- "autoload": {
2669
- "psr-4": {
2670
- "": "src/",
2671
- "WP_CLI\\": "src/WP_CLI"
2672
- },
2673
- "files": [
2674
- "shell-command.php"
2675
- ]
2676
- },
2677
- "notification-url": "https://packagist.org/downloads/",
2678
- "license": [
2679
- "MIT"
2680
- ],
2681
- "authors": [
2682
- {
2683
- "name": "Daniel Bachhuber",
2684
- "email": "daniel@runcommand.io",
2685
- "homepage": "https://runcommand.io"
2686
- }
2687
- ],
2688
- "description": "Interactive PHP console.",
2689
- "homepage": "https://github.com/wp-cli/shell-command",
2690
- "time": "2017-08-04T15:21:52+00:00"
2691
- },
2692
- {
2693
- "name": "wp-cli/super-admin-command",
2694
- "version": "dev-master",
2695
- "source": {
2696
- "type": "git",
2697
- "url": "https://github.com/wp-cli/super-admin-command.git",
2698
- "reference": "b650836d13762c764df2bbe70ad34212c0b773cd"
2699
- },
2700
- "dist": {
2701
- "type": "zip",
2702
- "url": "https://api.github.com/repos/wp-cli/super-admin-command/zipball/b650836d13762c764df2bbe70ad34212c0b773cd",
2703
- "reference": "b650836d13762c764df2bbe70ad34212c0b773cd",
2704
- "shasum": ""
2705
- },
2706
- "require-dev": {
2707
- "behat/behat": "~2.5",
2708
- "wp-cli/wp-cli": "*"
2709
- },
2710
- "type": "wp-cli-package",
2711
- "extra": {
2712
- "branch-alias": {
2713
- "dev-master": "1.x-dev"
2714
- },
2715
- "commands": [
2716
- "super-admin add",
2717
- "super-admin list",
2718
- "super-admin remove"
2719
- ],
2720
- "bundled": true
2721
- },
2722
- "autoload": {
2723
- "psr-4": {
2724
- "": "src/"
2725
- },
2726
- "files": [
2727
- "super-admin-command.php"
2728
- ]
2729
- },
2730
- "notification-url": "https://packagist.org/downloads/",
2731
- "license": [
2732
- "MIT"
2733
- ],
2734
- "authors": [
2735
- {
2736
- "name": "Daniel Bachhuber",
2737
- "email": "daniel@runcommand.io",
2738
- "homepage": "https://runcommand.io"
2739
- }
2740
- ],
2741
- "description": "Manage super admins on WordPress multisite.",
2742
- "homepage": "https://github.com/wp-cli/super-admin-command",
2743
- "time": "2017-08-04T15:45:41+00:00"
2744
- },
2745
- {
2746
- "name": "wp-cli/widget-command",
2747
- "version": "dev-master",
2748
- "source": {
2749
- "type": "git",
2750
- "url": "https://github.com/wp-cli/widget-command.git",
2751
- "reference": "727af7c7b661031bc8c04ad176d4f24b862e3402"
2752
- },
2753
- "dist": {
2754
- "type": "zip",
2755
- "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/727af7c7b661031bc8c04ad176d4f24b862e3402",
2756
- "reference": "727af7c7b661031bc8c04ad176d4f24b862e3402",
2757
- "shasum": ""
2758
- },
2759
- "require-dev": {
2760
- "behat/behat": "~2.5",
2761
- "wp-cli/wp-cli": "*"
2762
- },
2763
- "type": "wp-cli-package",
2764
- "extra": {
2765
- "branch-alias": {
2766
- "dev-master": "1.x-dev"
2767
- },
2768
- "commands": [
2769
- "widget add",
2770
- "widget deactivate",
2771
- "widget delete",
2772
- "widget list",
2773
- "widget move",
2774
- "widget reset",
2775
- "widget update",
2776
- "sidebar list"
2777
- ],
2778
- "bundled": true
2779
- },
2780
- "autoload": {
2781
- "psr-4": {
2782
- "": "src/"
2783
- },
2784
- "files": [
2785
- "widget-command.php"
2786
- ]
2787
- },
2788
- "notification-url": "https://packagist.org/downloads/",
2789
- "license": [
2790
- "MIT"
2791
- ],
2792
- "authors": [
2793
- {
2794
- "name": "Daniel Bachhuber",
2795
- "email": "daniel@runcommand.io",
2796
- "homepage": "https://runcommand.io"
2797
- }
2798
- ],
2799
- "description": "Manage widgets and sidebars.",
2800
- "homepage": "https://github.com/wp-cli/widget-command",
2801
- "time": "2017-08-04T15:24:29+00:00"
2802
- },
2803
- {
2804
- "name": "wp-cli/wp-cli",
2805
- "version": "v1.3.0",
2806
- "source": {
2807
- "type": "git",
2808
- "url": "https://github.com/wp-cli/wp-cli.git",
2809
- "reference": "4ab0d99da0ad5e6ca39453ff5c82d4f06aecb086"
2810
- },
2811
- "dist": {
2812
- "type": "zip",
2813
- "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/4ab0d99da0ad5e6ca39453ff5c82d4f06aecb086",
2814
- "reference": "4ab0d99da0ad5e6ca39453ff5c82d4f06aecb086",
2815
- "shasum": ""
2816
- },
2817
- "require": {
2818
- "composer/composer": "^1.2.0",
2819
- "composer/semver": "~1.0",
2820
- "mustache/mustache": "~2.4",
2821
- "php": ">=5.3.29",
2822
- "ramsey/array_column": "~1.1",
2823
- "rmccue/requests": "~1.6",
2824
- "symfony/config": "^2.7|^3.0",
2825
- "symfony/console": "^2.7|^3.0",
2826
- "symfony/debug": "^2.7|^3.0",
2827
- "symfony/dependency-injection": "^2.7|^3.0",
2828
- "symfony/event-dispatcher": "^2.7|^3.0",
2829
- "symfony/filesystem": "^2.7|^3.0",
2830
- "symfony/finder": "^2.7|^3.0",
2831
- "symfony/process": "^2.1|^3.0",
2832
- "symfony/translation": "^2.7|^3.0",
2833
- "symfony/yaml": "^2.7|^3.0",
2834
- "wp-cli/autoload-splitter": "^0.1.5",
2835
- "wp-cli/cache-command": "^1.0",
2836
- "wp-cli/checksum-command": "^1.0",
2837
- "wp-cli/config-command": "^1.0",
2838
- "wp-cli/core-command": "^1.0",
2839
- "wp-cli/cron-command": "^1.0",
2840
- "wp-cli/db-command": "^1.0",
2841
- "wp-cli/entity-command": "^1.0",
2842
- "wp-cli/eval-command": "^1.0",
2843
- "wp-cli/export-command": "^1.0",
2844
- "wp-cli/extension-command": "^1.0",
2845
- "wp-cli/import-command": "^1.0",
2846
- "wp-cli/language-command": "^1.0",
2847
- "wp-cli/media-command": "^1.0",
2848
- "wp-cli/mustangostang-spyc": "^0.6.3",
2849
- "wp-cli/package-command": "^1.0",
2850
- "wp-cli/php-cli-tools": "~0.11.2",
2851
- "wp-cli/rewrite-command": "^1.0",
2852
- "wp-cli/role-command": "^1.0",
2853
- "wp-cli/scaffold-command": "^1.0",
2854
- "wp-cli/search-replace-command": "^1.0",
2855
- "wp-cli/server-command": "^1.0",
2856
- "wp-cli/shell-command": "^1.0",
2857
- "wp-cli/super-admin-command": "^1.0",
2858
- "wp-cli/widget-command": "^1.0"
2859
- },
2860
- "require-dev": {
2861
- "behat/behat": "2.5.*",
2862
- "phpunit/phpunit": "3.7.*",
2863
- "roave/security-advisories": "dev-master"
2864
- },
2865
- "suggest": {
2866
- "psy/psysh": "Enhanced `wp shell` functionality"
2867
- },
2868
- "bin": [
2869
- "bin/wp.bat",
2870
- "bin/wp"
2871
- ],
2872
- "type": "library",
2873
- "extra": {
2874
- "autoload-splitter": {
2875
- "splitter-logic": "WP_CLI\\AutoloadSplitter",
2876
- "splitter-location": "php/WP_CLI/AutoloadSplitter.php",
2877
- "split-target-prefix-true": "autoload_commands",
2878
- "split-target-prefix-false": "autoload_framework"
2879
- }
2880
- },
2881
- "autoload": {
2882
- "psr-0": {
2883
- "WP_CLI": "php"
2884
- },
2885
- "psr-4": {
2886
- "": "php/commands/src"
2887
- }
2888
- },
2889
- "notification-url": "https://packagist.org/downloads/",
2890
- "license": [
2891
- "MIT"
2892
- ],
2893
- "description": "A command line interface for WordPress",
2894
- "homepage": "http://wp-cli.org",
2895
- "keywords": [
2896
- "cli",
2897
- "wordpress"
2898
- ],
2899
- "time": "2017-08-08T14:28:58+00:00"
2900
- }
2901
- ],
2902
- "aliases": [],
2903
- "minimum-stability": "dev",
2904
- "stability-flags": [],
2905
- "prefer-stable": false,
2906
- "prefer-lowest": false,
2907
- "platform": [],
2908
- "platform-dev": []
2909
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/CNAME DELETED
@@ -1 +0,0 @@
1
- actionscheduler.org
 
includes/lib/action-scheduler/docs/_config.yml DELETED
@@ -1,7 +0,0 @@
1
- title: Action Scheduler - Job Queue for WordPress
2
- description: A scalable, traceable job queue for background processing large queues of tasks in WordPress. Designed for distribution in WordPress plugins - no server access required.
3
- theme: jekyll-theme-hacker
4
- permalink: /:slug/
5
- plugins:
6
- - jekyll-seo-tag
7
- - jekyll-sitemap
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/_layouts/default.html DELETED
@@ -1,62 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="{{ site.lang | default: "en-US" }}">
3
- <head>
4
- <meta charset='utf-8'>
5
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
- <meta name="viewport" content="width=device-width, initial-scale=1">
7
- <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}">
8
-
9
- <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
10
- <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
11
- <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
12
- <link rel="manifest" href="/site.webmanifest">
13
- <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#63c0f5">
14
- <meta name="msapplication-TileColor" content="#151515">
15
- <meta name="theme-color" content="#ffffff">
16
-
17
-
18
- {% seo %}
19
- </head>
20
-
21
- <body>
22
-
23
- <header>
24
- <a class="github-corner" href="https://github.com/Prospress/action-scheduler/" aria-label="View on GitHub">
25
- <svg width="80" height="80" viewBox="0 0 250 250" style="fill:#b5e853; color:#151513; position: fixed; top: 0; border: 0; right: 0;" aria-hidden="true">
26
- <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>
27
- </svg>
28
- </a>
29
- <div class="container">
30
- <p><a href="/usage/">Usage</a> | <a href="/admin/">Admin</a> | <a href="/wp-cli/">WP-CLI</a> | <a href="/perf/">Background Processing at Scale</a> | <a href="/api/">API</a> | <a href="/faq/">FAQ</a>
31
- <h1><a href="/">action-scheduler</a></h1>
32
- <h2>A scalable, traceable job queue for background processing large queues of tasks in WordPress. Designed for distribution in WordPress plugins - no server access required.</h2>
33
- </div>
34
- </header>
35
-
36
- <div class="container">
37
- <section id="main_content">
38
- {{ content }}
39
- </section>
40
- </div>
41
-
42
- <footer>
43
- <div class="container">
44
- <p><a href="/usage/">Usage</a> | <a href="/admin/">Admin</a> | <a href="/wp-cli/">WP-CLI</a> | <a href="/perf/">Background Processing at Scale</a> | <a href="/api/">API</a> | <a href="/faq/">FAQ</a>
45
- <p class="footer-image">
46
- <a href="https://prospress.com"><img src="http://pic.pros.pr/eb8dcec9bd54/prospress-hacker-green-logo.png" width="120"></a>
47
- </p>
48
- </div>
49
- </footer>
50
-
51
- {% if site.google_analytics %}
52
- <script>
53
- (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
54
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
55
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
56
- })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
57
- ga('create', '{{ site.google_analytics }}', 'auto');
58
- ga('send', 'pageview');
59
- </script>
60
- {% endif %}
61
- </body>
62
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/admin.md DELETED
@@ -1,22 +0,0 @@
1
- ---
2
- description: Learn how to administer background jobs with the Action Scheduler job queue for WordPress.
3
- ---
4
- # Scheduled Actions Administration Screen
5
-
6
- Action Scheduler has a built in administration screen for monitoring, debugging and manually triggering scheduled actions.
7
-
8
- The administration interface is accesible through both:
9
-
10
- 1. **Tools > Scheduled Actions**
11
- 1. **WooCommerce > Status > Scheduled Actions**, when WooCommerce is installed.
12
-
13
- Among other tasks, from the admin screen you can:
14
-
15
- * run a pending action
16
- * view the scheduled actions with a specific status, like the all actions which have failed or are in-progress (https://cldup.com/NNTwE88Xl8.png).
17
- * view the log entries for a specific action to find out why it failed.
18
- * sort scheduled actions by hook name, scheduled date, claim ID or group name.
19
-
20
- Still have questions? Check out the [FAQ](/faq).
21
-
22
- ![](https://cldup.com/5BA2BNB1sw.png)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/android-chrome-192x192.png DELETED
Binary file
includes/lib/action-scheduler/docs/android-chrome-256x256.png DELETED
Binary file
includes/lib/action-scheduler/docs/api.md DELETED
@@ -1,179 +0,0 @@
1
- ---
2
- description: Reference guide for background processing functions provided by the Action Scheduler job queue for WordPress.
3
- ---
4
- # API Reference
5
-
6
- Action Scheduler provides a range of functions for scheduling hooks to run at some time in the future on one or more occassions.
7
-
8
- To understand the scheduling functoins, it can help to think of them as extensions to WordPress' `do_action()` function that add the ability to delay and repeat when the hook will be triggered.
9
-
10
- ## WP-Cron APIs vs. Action Scheduler APIs
11
-
12
- The Action Scheduler API functions are designed to mirror the WordPress [WP-Cron API functions](http://codex.wordpress.org/Category:WP-Cron_Functions).
13
-
14
- Functions return similar values and accept similar arguments to their WP-Cron counterparts. The notable differences are:
15
-
16
- * `as_schedule_single_action()` & `as_schedule_recurring_action()` will return the post ID of the scheduled action rather than boolean indicating whether the event was scheduled
17
- * `as_schedule_recurring_action()` takes an interval in seconds as the recurring interval rather than an arbitrary string
18
- * `as_schedule_single_action()` & `as_schedule_recurring_action()` can accept a `$group` parameter to group different actions for the one plugin together.
19
- * the `wp_` prefix is substituted with `as_` and the term `event` is replaced with `action`
20
-
21
- ## API Function Availability
22
-
23
- As mentioned in the [Usage - Load Order](/usage/#load-order) section, Action Scheduler will initialize itself on the `'init'` hook with priority `1`. While API functions are loaded prior to this and call be called, they should not be called until after `'init'` with priority `1`, because each component, like the data store, has not yet been initialized.
24
-
25
- Do not use Action Scheduler API functions prior to `'init'` hook with priority `1`. Doing so could lead to unexpected results, like data being stored in the incorrect location.
26
-
27
- ## Function Reference / `as_schedule_single_action()`
28
-
29
- ### Description
30
-
31
- Schedule an action to run one time.
32
-
33
- ### Usage
34
-
35
- ```php
36
- as_schedule_single_action( $timestamp, $hook, $args, $group )
37
- ````
38
-
39
- ### Parameters
40
-
41
- - **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run. Default: _none_.
42
- - **$hook** (string)(required) Name of the action hook. Default: _none_.
43
- - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
44
- - **$group** (array) The group to assign this job to. Default: _''_.
45
-
46
- ### Return value
47
-
48
- (integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table.
49
-
50
-
51
- ## Function Reference / `as_schedule_recurring_action()`
52
-
53
- ### Description
54
-
55
- Schedule an action to run repeatedly with a specified interval in seconds.
56
-
57
- ### Usage
58
-
59
- ```php
60
- as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args, $group )
61
- ````
62
-
63
- ### Parameters
64
-
65
- - **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run. Default: _none_.
66
- - **$interval_in_seconds** (integer)(required) How long to wait between runs. Default: _none_.
67
- - **$hook** (string)(required) Name of the action hook. Default: _none_.
68
- - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
69
- - **$group** (array) The group to assign this job to. Default: _''_.
70
-
71
- ### Return value
72
-
73
- (integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table.
74
-
75
-
76
- ## Function Reference / `as_schedule_cron_action()`
77
-
78
- ### Description
79
-
80
- Schedule an action that recurs on a cron-like schedule.
81
-
82
- ### Usage
83
-
84
- ```php
85
- as_schedule_cron_action( $timestamp, $schedule, $hook, $args, $group )
86
- ````
87
-
88
- ### Parameters
89
-
90
- - **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run. Default: _none_.
91
- - **$schedule** (string)(required) $schedule A cron-link schedule string, see http://en.wikipedia.org/wiki/Cron. Default: _none_.
92
- - **$hook** (string)(required) Name of the action hook. Default: _none_.
93
- - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
94
- - **$group** (array) The group to assign this job to. Default: _''_.
95
-
96
- ### Return value
97
-
98
- (integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table.
99
-
100
-
101
- ## Function Reference / `as_unschedule_action()`
102
-
103
- ### Description
104
-
105
- Cancel the next occurrence of a job.
106
-
107
- ### Usage
108
-
109
- ```php
110
- as_unschedule_action( $hook, $args, $group )
111
- ````
112
-
113
- ### Parameters
114
-
115
- - **$hook** (string)(required) Name of the action hook. Default: _none_.
116
- - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
117
- - **$group** (array) The group to assign this job to. Default: _''_.
118
-
119
- ### Return value
120
-
121
- (null)
122
-
123
-
124
- ## Function Reference / `as_next_scheduled_action()`
125
-
126
- ### Description
127
-
128
- Returns the next timestamp for a scheduled action.
129
-
130
- ### Usage
131
-
132
- ```php
133
- as_next_scheduled_action( $hook, $args, $group )
134
- ````
135
-
136
- ### Parameters
137
-
138
- - **$hook** (string)(required) Name of the action hook. Default: _none_.
139
- - **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_.
140
- - **$group** (array) The group to assign this job to. Default: _''_.
141
-
142
- ### Return value
143
-
144
- (integer|boolean) The timestamp for the next occurrence, or false if nothing was found.
145
-
146
-
147
- ## Function Reference / `as_get_scheduled_actions()`
148
-
149
- ### Description
150
-
151
- Find scheduled actions.
152
-
153
- ### Usage
154
-
155
- ```php
156
- as_get_scheduled_actions( $args, $return_format )
157
- ````
158
-
159
- ### Parameters
160
-
161
- - **$args** (array) Arguments to search and filter results by. Possible arguments, with their default values:
162
- * `'hook' => ''` - the name of the action that will be triggered
163
- * `'args' => NULL` - the args array that will be passed with the action
164
- * `'date' => NULL` - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime().
165
- * `'date_compare' => '<=`' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '='
166
- * `'modified' => NULL` - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime().
167
- * `'modified_compare' => '<='` - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '='
168
- * `'group' => ''` - the group the action belongs to
169
- * `'status' => ''` - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING
170
- * `'claimed' => NULL` - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID
171
- * `'per_page' => 5` - Number of results to return
172
- * `'offset' => 0`
173
- * `'orderby' => 'date'` - accepted values are 'hook', 'group', 'modified', or 'date'
174
- * `'order' => 'ASC'`
175
- - **$return_format** (string) The format in which to return the scheduled actions: 'OBJECT', 'ARRAY_A', or 'ids'. Default: _'OBJECT'_.
176
-
177
- ### Return value
178
-
179
- (array) Array of the actions matching the criteria specified with `$args`.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/apple-touch-icon.png DELETED
Binary file
includes/lib/action-scheduler/docs/assets/css/style.scss DELETED
@@ -1,57 +0,0 @@
1
- ---
2
- ---
3
-
4
- @import "{{ site.theme }}";
5
-
6
- a {
7
- text-shadow: none;
8
- text-decoration: none;
9
- }
10
-
11
- a:hover {
12
- text-decoration: underline;
13
- }
14
-
15
- header h1 a {
16
- color: #b5e853;
17
- }
18
-
19
- .container {
20
- max-width: 700px;
21
- }
22
-
23
- footer {
24
- margin-top: 6em;
25
- padding: 1.6em 0;
26
- border-top: 1px dashed #b5e853;
27
- }
28
-
29
- .footer-image {
30
- text-align: center;
31
- padding-top: 1em;
32
- }
33
-
34
- .github-corner:hover .octo-arm {
35
- animation:octocat-wave 560ms ease-in-out
36
- }
37
-
38
- @keyframes octocat-wave {
39
- 0%,100%{
40
- transform:rotate(0)
41
- }
42
- 20%,60%{
43
- transform:rotate(-25deg)
44
- }
45
- 40%,80%{
46
- transform:rotate(10deg)
47
- }
48
- }
49
-
50
- @media (max-width:500px){
51
- .github-corner:hover .octo-arm {
52
- animation:none
53
- }
54
- .github-corner .octo-arm {
55
- animation:octocat-wave 560ms ease-in-out
56
- }
57
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/browserconfig.xml DELETED
@@ -1,9 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <browserconfig>
3
- <msapplication>
4
- <tile>
5
- <square150x150logo src="/mstile-150x150.png"/>
6
- <TileColor>#151515</TileColor>
7
- </tile>
8
- </msapplication>
9
- </browserconfig>
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/faq.md DELETED
@@ -1,101 +0,0 @@
1
- ## FAQ
2
-
3
- ### Is it safe to release Action Scheduler in my plugin? Won't its functions conflict with another copy of the library?
4
-
5
- Action Scheduler is designed to be used and released in plugins. It avoids redeclaring public API functions when more than one copy of the library is being loaded by different plugins. It will also load only the most recent version of itself (by checking registered versions after all plugins are loaded on the `'plugins_loaded'` hook).
6
-
7
- To use it in your plugin, simply require the `action-scheduler/action-scheduler.php` file. Action Scheduler will take care of the rest.
8
-
9
- ### I don't want to use WP-Cron. Does Action Scheduler depend on WP-Cron?
10
-
11
- By default, Action Scheduler is initiated by WP-Cron. However, it has no dependency on the WP-Cron system. You can initiate the Action Scheduler queue in other ways with just one or two lines of code.
12
-
13
- For example, you can start a queue directly by calling:
14
-
15
- ```php
16
- ActionScheduler::runner()->run();
17
- ```
18
-
19
- Or trigger the `'action_scheduler_run_queue'` hook and let Action Scheduler do it for you:
20
-
21
- ```php
22
- do_action( 'action_scheduler_run_queue' );
23
- ```
24
-
25
- Further customization can be done by extending the `ActionScheduler_Abstract_QueueRunner` class to create a custom Queue Runner. For an example of a customized queue runner, see the [`ActionScheduler_WPCLI_QueueRunner`](https://github.com/Prospress/action-scheduler/blob/master/classes/ActionScheduler_WPCLI_QueueRunner.php), which is used when running WP CLI.
26
-
27
- Want to create some other method for initiating Action Scheduler? [Open a new issue](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it.
28
-
29
- ### I don't want to use WP-Cron, ever. Does Action Scheduler replace WP-Cron?
30
-
31
- By default, Action Scheduler is designed to work alongside WP-Cron and not change any of its behaviour. This helps avoid unexpectedly overriding WP-Cron on sites installing your plugin, which may have nothing to do with WP-Cron.
32
-
33
- However, we can understand why you might want to replace WP-Cron completely in environments within your control, especially as it gets you the advantages of Action Scheduler. This should be possible without too much code.
34
-
35
- You could use the `'schedule_event'` hook in WordPress to use Action Scheduler for only newly scheduled WP-Cron jobs and map the `$event` param to Action Scheduler API functions.
36
-
37
- Alternatively, you can use a combination of the `'pre_update_option_cron'` and `'pre_option_cron'` hooks to override all new and previously scheduled WP-Cron jobs (similar to the way [Cavalcade](https://github.com/humanmade/Cavalcade) does it).
38
-
39
- If you'd like to create a plugin to do this automatically and want to share your work with others, [open a new issue to let us know](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it.
40
-
41
- ### Eww gross, Custom Post Types! That's _so_ 2010. Can I use a different storage scheme?
42
-
43
- Of course! Action Scheduler data storage is completely swappable, and always has been.
44
-
45
- You can store scheduled actions in custom tables in the WordPress site's database. Some sites using it already are. You can actually store them anywhere for that matter, like in a remote storage service from Amazon Web Services.
46
-
47
- To implement a custom store:
48
-
49
- 1. extend the abstract `ActionScheduler_Store` class, being careful to implement each of its methods
50
- 2. attach a callback to `'action_scheduler_store_class'` to tell Action Scheduler your class is the one which should be used to manage storage, e.g.
51
-
52
- ```
53
- function eg_define_custom_store( $existing_storage_class ) {
54
- return 'My_Radical_Action_Scheduler_Store';
55
- }
56
- add_filter( 'action_scheduler_store_class', 'eg_define_custom_store', 10, 1 );
57
- ```
58
-
59
- Take a look at the `ActionScheduler_wpPostStore` class for an example implementation of `ActionScheduler_Store`.
60
-
61
- If you'd like to create a plugin to do this automatically and release it publicly to help others, [open a new issue to let us know](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it.
62
-
63
- > Note: we're also moving Action Scheduler itself to use [custom tables for better scalability](https://github.com/Prospress/action-scheduler/issues/77).
64
-
65
- ### Can I use a different storage scheme just for logging?
66
-
67
- Of course! Action Scheduler's logger is completely swappable, and always has been. You can also customise where logs are stored, and the storage mechanism.
68
-
69
- To implement a custom logger:
70
-
71
- 1. extend the abstract `ActionScheduler_Logger` class, being careful to implement each of its methods
72
- 2. attach a callback to `'action_scheduler_logger_class'` to tell Action Scheduler your class is the one which should be used to manage logging, e.g.
73
-
74
- ```
75
- function eg_define_custom_logger( $existing_storage_class ) {
76
- return 'My_Radical_Action_Scheduler_Logger';
77
- }
78
- add_filter( 'action_scheduler_logger_class', 'eg_define_custom_logger', 10, 1 );
79
- ```
80
-
81
- Take a look at the `ActionScheduler_wpCommentLogger` class for an example implementation of `ActionScheduler_Logger`.
82
-
83
- ### I want to run Action Scheduler only on a dedicated application server in my cluster. Can I do that?
84
-
85
- Wow, now you're really asking the tough questions. In theory, yes, this is possible. The `ActionScheduler_QueueRunner` class, which is responsible for running queues, is swappable via the `'action_scheduler_queue_runner_class'` filter.
86
-
87
- Because of this, you can effectively customise queue running however you need. Whether that means tweaking minor things, like not using WP-Cron at all to initiate queues by overriding `ActionScheduler_QueueRunner::init()`, or completely changing how and where queues are run, by overriding `ActionScheduler_QueueRunner::run()`.
88
-
89
- ### Is Action Scheduler safe to use on my production site?
90
-
91
- Yes, absolutely! Action Scheduler is actively used on tens of thousands of production sites already. Right now it's responsible for scheduling everything from emails to payments.
92
-
93
- In fact, every month, Action Scheduler processes millions of payments as part of the [WooCommerce Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/) extension.
94
-
95
- It requires no setup, and won't override any WordPress APIs (unless you want it to).
96
-
97
- ### How does Action Scheduler work on WordPress Multisite?
98
-
99
- Action Scheduler is designed to manage the scheduled actions on a single site. It has no special handling for running queues across multiple sites in a multisite network. That said, because its storage and Queue Runner are completely swappable, it would be possible to write multisite handling classes to use with it.
100
-
101
- If you'd like to create a multisite plugin to do this and release it publicly to help others, [open a new issue to let us know](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/favicon-16x16.png DELETED
Binary file
includes/lib/action-scheduler/docs/favicon-32x32.png DELETED
Binary file
includes/lib/action-scheduler/docs/favicon.ico DELETED
Binary file
includes/lib/action-scheduler/docs/google14ef723abb376cd3.html DELETED
@@ -1 +0,0 @@
1
- google-site-verification: google14ef723abb376cd3.html
 
includes/lib/action-scheduler/docs/index.md DELETED
@@ -1,68 +0,0 @@
1
- ---
2
- title: Action Scheduler - Background Processing Job Queue for WordPress
3
- ---
4
- ## WordPress Job Queue with Background Processing
5
-
6
- Action Scheduler is a library for triggering a WordPress hook to run at some time in the future. Each hook can be scheduled with unique data, to allow callbacks to perform operations on that data. The hook can also be scheduled to run on one or more occassions.
7
-
8
- Think of it like an extension to `do_action()` which adds the ability to delay and repeat a hook.
9
-
10
- It just so happens, this functionality also creates a robust job queue for background processing large queues of tasks in WordPress. With the additional of logging and an [administration interface](/admin/), that also provide tracability on your tasks processed in the background.
11
-
12
- ### Battle-Tested Background Processing
13
-
14
- Every month, Action Scheduler processes millions of payments for [Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/), webhooks for [WooCommerce](https://wordpress.org/plugins/woocommerce/), as well as emails and other events for a range of other plugins.
15
-
16
- It's been seen on live sites processing queues in excess of 50,000 jobs and doing resource intensive operations, like processing payments and creating orders, in 10 concurrent queues at a rate of over 10,000 actions / hour without negatively impacting normal site operations.
17
-
18
- This is all possible on infrastructure and WordPress sites outside the control of the plugin author.
19
-
20
- Action Scheduler is specifically designed for distribution in WordPress plugins (and themes) - no server access required. If your plugin needs background processing, especially of large sets of tasks, Action Scheduler can help.
21
-
22
- ### How it Works
23
-
24
- Action Scheduler uses a WordPress [custom post type](http://codex.wordpress.org/Post_Types), creatively named `scheduled-action`, to store the hook name, arguments and scheduled date for an action that should be triggered at some time in the future.
25
-
26
- The scheduler will attempt to run every minute by attaching itself as a callback to the `'action_scheduler_run_schedule'` hook, which is scheduled using WordPress's built-in [WP-Cron](http://codex.wordpress.org/Function_Reference/wp_cron) system.
27
-
28
- When triggered, Action Scheduler will check for posts of the `scheduled-action` type that have a `post_date` at or before this point in time i.e. actions scheduled to run now or at sometime in the past.
29
-
30
- ### Batch Processing Background Jobs
31
-
32
- If there are actions to be processed, Action Scheduler will stake a unique claim for a batch of 20 actions and begin processing that batch. The PHP process spawned to run the batch will then continue processing batches of 20 actions until it times out or exhausts available memory.
33
-
34
- If your site has a large number of actions scheduled to run at the same time, Action Scheduler will process more than one batch at a time. Specifically, when the `'action_scheduler_run_schedule'` hook is triggered approximately one minute after the first batch began processing, a new PHP process will stake a new claim to a batch of actions which were not claimed by the previous process. It will then begin to process that batch.
35
-
36
- This will continue until all actions are processed using a maximum of 5 concurrent queues.
37
-
38
- ### Housekeeping
39
-
40
- Before processing a batch, the scheduler will remove any existing claims on actions which have been sitting in a queue for more than five minutes.
41
-
42
- Action Scheduler will also trash any actions which were completed more than a month ago.
43
-
44
- If an action runs for more than 5 minutes, Action Scheduler will assume the action has timed out and will mark it as failed. However, if all callbacks attached to the action were to successfully complete sometime after that 5 minute timeout, its status would later be updated to completed.
45
-
46
- ### Traceable Background Processing
47
-
48
- Did your background job run?
49
-
50
- Never be left wondering with Action Scheduler's built-in record keeping.
51
-
52
- All events for each action are logged in the [comments table](http://codex.wordpress.org/Database_Description#Table_Overview) and displayed in the [administration interface](/admin/).
53
-
54
- The events logged by default include when an action:
55
- * is created
56
- * starts
57
- * completes
58
- * fails
59
-
60
- If it fails with an error that can be recorded, that error will be recorded in the log and visible in administration interface, making it possible to trace what went wrong at some point in the past on a site you didn't have access to in the past.
61
-
62
- Actions can also be grouped together using a custom taxonomy named `action-group`.
63
-
64
- ## Credits
65
-
66
- Developed and maintained by [Prospress](http://prospress.com/) in collaboration with [Flightless](https://flightless.us/).
67
-
68
- Collaboration is cool. We'd love to work with you to improve Action Scheduler. [Pull Requests](https://github.com/prospress/action-scheduler/pulls) welcome.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/mstile-150x150.png DELETED
Binary file
includes/lib/action-scheduler/docs/perf.md DELETED
@@ -1,127 +0,0 @@
1
- ---
2
- title: WordPress Background Processing at Scale - Action Scheduler Job Queue
3
- description: Learn how to do WordPress background processing at scale by tuning the Action Scheduler job queue's default WP Cron runner.
4
- ---
5
- # Background Processing at Scale
6
-
7
- Action Scheduler's default processing is designed to work reliably across all different hosting environments. In order to achieve that, the default processing thresholds are very conservative.
8
-
9
- Specifically, Action Scheduler will only process actions until:
10
-
11
- * 90% of available memory is used
12
- * processing another 3 actions would exceed 30 seconds of total request time, based on the average processing time for the current batch
13
-
14
- On sites with large queues, this can result in very slow processing time.
15
-
16
- While using [WP CLI to process queues](/wp-cli/) is the best approach to increasing processing speed, on occasion, that is not a viable option. In these cases, it's also possible to increase the processing thresholds in Action Scheduler to increase the rate at which actions are processed by the default WP Cron queue runner.
17
-
18
- ## Increasing Time Limit
19
-
20
- By default, Action Scheduler will only process actions for a maximum of 30 seconds. This time limit minimises the risk of a script timeout on unknown hosting environments, some of which enforce 30 second timeouts.
21
-
22
- If you know your host supports longer than this time limit for web requests, you can increase this time limit. This allows more actions to be processed in each request and reduces the lag between processing each queue, greating speeding up the processing rate of scheduled actions.
23
-
24
- For example, the following snippet will increase the timelimit to 2 minutes (120 seconds):
25
-
26
- ```php
27
- function eg_increase_time_limit( $time_limit ) {
28
- return 120;
29
- }
30
- add_filter( 'action_scheduler_queue_runner_time_limit', 'eg_increase_time_limit' );
31
- ```
32
-
33
- Some of the known host time limits are:
34
-
35
- * 60 second on WP Engine
36
- * 120 seconds on Pantheon
37
- * 120 seconds on SiteGround
38
-
39
- ## Increasing Batch Size
40
-
41
- By default, Action Scheduler will claim a batch of 25 actions. This small batch size is because the default time limit is only 30 seconds; however, if you know your actions are processing very quickly, e.g. taking microseconds not seconds, or that you have more than 30 second available to process each batch, increasing the batch size can improve performance.
42
-
43
- This is because claiming a batch has some overhead, so the less often a batch needs to be claimed, the faster actions can be processed.
44
-
45
- For example, to increase the batch size to 100, we can use the following function:
46
-
47
- ```php
48
- function eg_increase_action_scheduler_batch_size( $batch_size ) {
49
- return 100;
50
- }
51
- add_filter( 'action_scheduler_queue_runner_batch_size', 'eg_increase_action_scheduler_batch_size' );
52
- ```
53
-
54
- ## Increasing Concurrent Batches
55
-
56
- By default, Action Scheduler will run up to 5 concurrent batches of actions. This is to prevent consuming all the available connections or processes on your webserver.
57
-
58
- However, your server may allow a large number of connection, for example, because it has a high value for Apache's `MaxClients` setting or PHP-FPM's `pm.max_children` setting.
59
-
60
- If this is the case, you can use the `'action_scheduler_queue_runner_concurrent_batches'` filter to increase the number of conncurrent batches allowed, and therefore speed up processing large numbers of actions scheduled to be processed simultaneously.
61
-
62
- For example, to increase the allowed number of concurrent queues to 10, we can use the following code:
63
-
64
- ```php
65
- function eg_increase_action_scheduler_concurrent_batches( $concurrent_batches ) {
66
- return 10;
67
- }
68
- add_filter( 'action_scheduler_queue_runner_concurrent_batches', 'eg_increase_action_scheduler_concurrent_batches' );
69
- ```
70
-
71
- ## Increasing Initialisation Rate of Runners
72
-
73
- By default, Action scheduler initiates at most, one queue runner every time the `'action_scheduler_run_queue'` action is triggered by WP Cron.
74
-
75
- Because this action is only triggered at most once every minute, if a queue is only allowed to process for one minute, then there will never be more than one queue processing actions, greatly reducing the processing rate.
76
-
77
- To handle larger queues on more powerful servers, it's a good idea to initiate additional queue runners whenever the `'action_scheduler_run_queue'` action is run.
78
-
79
- That can be done by initiated additional secure requests to our server via loopback requests.
80
-
81
- The code below demonstrates how to create 5 loopback requests each time a queue begins
82
-
83
- ```php
84
- /**
85
- * Trigger 5 additional loopback requests with unique URL params.
86
- */
87
- function eg_request_additional_runners() {
88
-
89
- // allow self-signed SSL certificates
90
- add_filter( 'https_local_ssl_verify', '__return_false', 100 );
91
-
92
- for ( $i = 0; $i < 5; $i++ ) {
93
- $response = wp_remote_post( admin_url( 'admin-ajax.php' ), array(
94
- 'method' => 'POST',
95
- 'timeout' => 45,
96
- 'redirection' => 5,
97
- 'httpversion' => '1.0',
98
- 'blocking' => false,
99
- 'headers' => array(),
100
- 'body' => array(
101
- 'action' => 'eg_create_additional_runners',
102
- 'instance' => $i,
103
- 'eg_nonce' => wp_create_nonce( 'eg_additional_runner_' . $i ),
104
- ),
105
- 'cookies' => array(),
106
- ) );
107
- }
108
- }
109
- add_action( 'action_scheduler_run_queue', 'eg_request_additional_runners', 0 );
110
-
111
- /**
112
- * Handle requests initiated by eg_request_additional_runners() and start a queue runner if the request is valid.
113
- */
114
- function eg_create_additional_runners() {
115
-
116
- if ( isset( $_POST['eg_nonce'] ) && isset( $_POST['instance'] ) && wp_verify_nonce( $_POST['eg_nonce'], 'eg_additional_runner_' . $_POST['instance'] ) ) {
117
- ActionScheduler_QueueRunner::instance()->run();
118
- }
119
-
120
- wp_die();
121
- }
122
- add_action( 'wp_ajax_nopriv_eg_create_additional_runners', 'eg_create_additional_runners', 0 );
123
- ```
124
-
125
- ## High Volume Plugin
126
-
127
- It's not necessary to add all of this code yourself, the folks at [Prospress](https://prospress.com) have created a handy plugin to get access to each of these increases - the [Action Scheduler - High Volume](https://github.com/prospress/action-scheduler-high-volume) plugin.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/safari-pinned-tab.svg DELETED
@@ -1,40 +0,0 @@
1
- <?xml version="1.0" standalone="no"?>
2
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3
- "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4
- <svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5
- width="312.000000pt" height="312.000000pt" viewBox="0 0 312.000000 312.000000"
6
- preserveAspectRatio="xMidYMid meet">
7
- <metadata>
8
- Created by potrace 1.11, written by Peter Selinger 2001-2013
9
- </metadata>
10
- <g transform="translate(0.000000,312.000000) scale(0.100000,-0.100000)"
11
- fill="#000000" stroke="none">
12
- <path d="M1837 2924 c-1 -1 -54 -5 -117 -8 -63 -4 -128 -9 -145 -11 -16 -2
13
- -46 -6 -65 -9 -19 -3 -57 -8 -85 -11 -27 -3 -70 -10 -95 -16 -25 -5 -58 -11
14
- -75 -13 -98 -13 -360 -73 -565 -130 -236 -65 -584 -172 -609 -187 -105 -67 24
15
- -294 221 -387 77 -37 152 -61 206 -65 16 -1 22 -8 22 -23 0 -34 35 -107 70
16
- -147 62 -71 161 -119 265 -130 34 -4 40 -8 46 -33 25 -122 151 -205 301 -198
17
- 122 5 254 44 270 80 6 13 8 27 5 30 -3 4 -41 1 -84 -5 -119 -18 -155 -19 -217
18
- -9 -74 11 -123 47 -132 94 -7 40 -4 46 28 49 94 12 238 52 260 72 35 32 23 46
19
- -34 38 -29 -4 -62 -9 -73 -11 -45 -10 -255 -11 -320 -2 -81 11 -154 40 -185
20
- 73 -24 26 -52 97 -42 106 4 4 45 9 92 12 93 7 90 6 269 43 69 14 134 30 145
21
- 36 29 15 56 39 56 50 0 10 -74 3 -144 -12 -22 -5 -144 -8 -270 -6 -251 3 -327
22
- 15 -443 71 -47 23 -133 97 -133 115 0 6 150 49 225 64 11 3 83 20 160 39 77
23
- 19 154 38 170 41 17 4 39 8 50 10 11 3 56 12 100 21 98 21 104 22 146 29 19 3
24
- 43 7 54 10 28 5 94 16 130 20 17 3 44 7 60 10 17 2 50 7 75 11 41 5 87 11 150
25
- 20 111 16 452 23 509 11 14 -3 47 -8 75 -11 28 -3 78 -13 111 -21 365 -92 513
26
- -289 509 -679 -1 -102 -35 -265 -56 -265 -5 0 -7 -4 -4 -9 3 -4 -12 -41 -33
27
- -81 -144 -277 -468 -551 -794 -671 -107 -39 -317 -88 -317 -73 0 2 50 118 111
28
- 257 61 138 131 299 156 357 25 58 49 114 54 125 5 11 52 119 104 240 90 208
29
- 94 221 84 255 -19 58 -67 147 -99 183 -33 38 -86 65 -99 51 -5 -5 -23 -43 -41
30
- -84 -50 -116 -179 -408 -211 -478 -16 -35 -29 -65 -29 -67 0 -2 -18 -43 -40
31
- -90 -22 -47 -40 -88 -40 -90 0 -4 -92 -211 -156 -353 -13 -29 -24 -55 -24 -57
32
- 0 -2 -15 -37 -34 -77 -18 -40 -46 -102 -61 -138 -16 -36 -45 -102 -67 -148
33
- -21 -46 -38 -85 -38 -87 0 -2 -34 -81 -76 -175 -55 -124 -74 -178 -70 -196 16
34
- -62 116 -134 207 -148 36 -5 37 -5 63 53 14 32 51 112 82 177 31 66 74 160 96
35
- 209 22 50 43 93 47 98 7 7 19 10 82 21 19 3 44 8 55 10 12 2 38 7 57 10 480
36
- 76 883 299 1117 618 100 135 202 363 224 498 1 8 5 35 9 60 16 95 13 216 -7
37
- 340 -10 59 -60 190 -97 252 -45 76 -151 190 -219 235 -127 85 -324 159 -475
38
- 179 -27 3 -53 8 -56 9 -12 8 -344 25 -352 19z"/>
39
- </g>
40
- </svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/site.webmanifest DELETED
@@ -1,19 +0,0 @@
1
- {
2
- "name": "",
3
- "short_name": "",
4
- "icons": [
5
- {
6
- "src": "/android-chrome-192x192.png",
7
- "sizes": "192x192",
8
- "type": "image/png"
9
- },
10
- {
11
- "src": "/android-chrome-256x256.png",
12
- "sizes": "256x256",
13
- "type": "image/png"
14
- }
15
- ],
16
- "theme_color": "#ffffff",
17
- "background_color": "#ffffff",
18
- "display": "standalone"
19
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/usage.md DELETED
@@ -1,123 +0,0 @@
1
- ---
2
- description: Learn how to use the Action Scheduler background processing job queue for WordPress in your WordPress plugin.
3
- ---
4
- # Usage
5
-
6
- Using Action Scheduler requires:
7
-
8
- 1. installing the library
9
- 1. scheduling and action
10
- 1. attaching a callback to that action
11
-
12
- ## Scheduling an Action
13
-
14
- To schedule an action, call the [API function](/api/) for the desired schedule type passing in the required parameters.
15
-
16
- The example code below shows everything needed to schedule a function to run at midnight, if it's not already scheduled:
17
-
18
- ```php
19
- require_once( plugin_dir_path( __FILE__ ) . '/libraries/action-scheduler/action-scheduler.php' );
20
-
21
- /**
22
- * Schedule an action with the hook 'eg_midnight_log' to run at midnight each day
23
- * so that our callback is run then.
24
- */
25
- function eg_schedule_midnight_log() {
26
- if ( false === as_next_scheduled_action( 'eg_midnight_log' ) ) {
27
- as_schedule_recurring_action( strtotime( 'midnight tonight' ), DAY_IN_SECONDS, 'eg_midnight_log' );
28
- }
29
- }
30
- add_action( 'init', 'eg_schedule_midnight_log' );
31
-
32
- /**
33
- * A callback to run when the 'eg_midnight_log' scheduled action is run.
34
- */
35
- function eg_log_action_data() {
36
- error_log( 'It is just after midnight on ' . date( 'Y-m-d' ) );
37
- }
38
- add_action( 'eg_midnight_log', 'eg_log_action_data' );
39
- ```
40
-
41
- For more details on all available API functions, and the data they accept, refer to the [API Reference](/api/).
42
-
43
- ## Installation
44
-
45
- There are two ways to install Action Scheduler:
46
-
47
- 1. regular WordPress plugin; or
48
- 1. a library within your plugin's codebase.
49
-
50
- ### Usage as a Plugin
51
-
52
- Action Scheduler includes the necessary file headers to be used as a standard WordPress plugin.
53
-
54
- To install it as a plugin:
55
-
56
- 1. Download the .zip archive of the latest [stable release](https://github.com/Prospress/action-scheduler/releases)
57
- 1. Go to the **Plugins > Add New > Upload** administration screen on your WordPress site
58
- 1. Select the archive file you just downloaded
59
- 1. Click **Install Now**
60
- 1. Click **Activate**
61
-
62
- Or clone the Git repository into your site's `wp-content/plugins` folder.
63
-
64
- Using Action Scheduler as a plugin can be handy for developing against newer versions, rather than having to update the subtree in your codebase. **When installed as a plugin, Action Scheduler does not provide any user interfaces for scheduling actions**. The only way to interact with Action Scheduler is via code.
65
-
66
- ### Usage as a Library
67
-
68
- To use Action Scheduler as a library:
69
-
70
- 1. include the Action Scheduler codebase
71
- 1. load the library by including the `action-scheduler.php` file
72
-
73
- Using a [subtree in your plugin, theme or site's Git repository](https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree) to include Action Scheduler is the recommended method. Composer can also be used.
74
-
75
- To include Action Scheduler as a git subtree:
76
-
77
- #### Step 1. Add the Repository as a Remote
78
-
79
- ```
80
- git remote add -f subtree-action-scheduler https://github.com/Prospress/action-scheduler.git
81
- ```
82
-
83
- Adding the subtree as a remote allows us to refer to it in short from via the name `subtree-action-scheduler`, instead of the full GitHub URL.
84
-
85
- #### Step 2. Add the Repo as a Subtree
86
-
87
- ```
88
- git subtree add --prefix libraries/action-scheduler subtree-action-scheduler master --squash
89
- ```
90
-
91
- This will add the `master` branch of Action Scheduler to your repository in the folder `libraries/action-scheduler`.
92
-
93
- You can change the `--prefix` to change where the code is included. Or change the `master` branch to a tag, like `2.1.0` to include only a stable version.
94
-
95
- #### Step 3. Update the Subtree
96
-
97
- To update Action Scheduler to a new version, use the commands:
98
-
99
- ```
100
- git fetch subtree-action-scheduler master
101
- git subtree pull --prefix libraries/action-scheduler subtree-action-scheduler master --squash
102
- ```
103
-
104
- ### Loading Action Scheduler
105
-
106
- Regardless of how it is installed, to load Action Scheduler, you only need to include the `action-scheduler.php` file, e.g.
107
-
108
- ```php
109
- <?php
110
- require_once( plugin_dir_path( __FILE__ ) . '/libraries/action-scheduler/action-scheduler.php' );
111
- ```
112
-
113
- There is no need to call any functions or do else to initialize Action Scheduler.
114
-
115
- When the `action-scheduler.php` file is included, Action Scheduler will register the version in that file and then load the most recent version of itself on the site. It will also load the most recent version of [all API functions](https://github.com/prospress/action-scheduler#api-functions).
116
-
117
- ### Load Order
118
-
119
- Action Scheduler will register its version on `'plugins_loaded'` with priority `0` - after all other plugin codebases has been loaded. Therefore **the `action-scheduler.php` file must be included before `'plugins_loaded'` priority `0`**.
120
-
121
- It is recommended to load it _when the file including it is included_. However, if you need to load it on a hook, then the hook must occur before `'plugins_loaded'`, or you can use `'plugins_loaded'` with negative priority, like `-10`.
122
-
123
- Action Scheduler will later initialize itself on `'init'` with priority `1`. Action Scheduler APIs should not be used until after `'init'` with priority `1`.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/docs/wp-cli.md DELETED
@@ -1,73 +0,0 @@
1
- ---
2
- description: Learn how to do WordPress background processing at scale with WP CLI and the Action Scheduler job queue.
3
- ---
4
- # WP CLI
5
-
6
- Action Scheduler has custom [WP CLI](http://wp-cli.org) commands available for processing actions.
7
-
8
- For large sites, WP CLI is a much better choice for running queues of actions than the default WP Cron runner. These are some common cases where WP CLI is a better option:
9
-
10
- * long-running tasks - Tasks that take a significant amount of time to run
11
- * large queues - A large number of tasks will naturally take a longer time
12
- * other plugins with extensive WP Cron usage - WP Cron's limited resources are spread across more tasks
13
-
14
- With a regular web request, you may have to deal with script timeouts enforced by hosts, or other restraints that make it more challenging to run Action Scheduler tasks. Utilizing WP CLI to run commands directly on the server give you more freedom. This means that you typically don't have the same constraints of a normal web request.
15
-
16
- If you choose to utilize WP CLI exclusively, you can disable the normal WP CLI queue runner by installing the [Action Scheduler - Disable Default Queue Runner](https://github.com/Prospress/action-scheduler-disable-default-runner) plugin. Note that if you do this, you **must** run Action Scheduler via WP CLI or another method, otherwise no scheduled actions will be processed.
17
-
18
- ## Commands
19
-
20
- These are the commands available to use with Action Scheduler:
21
-
22
- * `action-scheduler run`
23
-
24
- Options:
25
- * `--batch-size` - This is the number of actions to run in a single batch. The default is `100`.
26
- * `--batches` - This is the number of batches to run. Using 0 means that batches will continue running until there are no more actions to run.
27
- * `--hooks` - Process only actions with specific hook or hooks, like `'woocommerce_scheduled_subscription_payment'`. By default, actions with any hook will be processed. Define multiple hooks as a comma separated string (without spaces), e.g. `--hooks=woocommerce_scheduled_subscription_trial_end,woocommerce_scheduled_subscription_payment,woocommerce_scheduled_subscription_expiration`
28
- * `--group` - Process only actions in a specific group, like `'woocommerce-memberships'`. By default, actions in any group (or no group) will be processed.
29
- * `--force` - By default, Action Scheduler limits the number of concurrent batches that can be run at once to ensure the server does not get overwhelmed. Using the `--force` flag overrides this behavior to force the WP CLI queue to run.
30
-
31
- The best way to get a full list of commands and their available options is to use WP CLI itself. This can be done by running `wp action-scheduler` to list all Action Scheduler commands, or by including the `--help` flag with any of the individual commands. This will provide all relevant parameters and flags for the command.
32
-
33
- ## Cautionary Note on Action Dependencies when using `--group` or `--hooks` Options
34
-
35
- The `--group` and `--hooks` options should be used with caution if you have an implicit dependency between scheduled actions based on their schedule.
36
-
37
- For example, consider two scheduled actions for the same subscription:
38
-
39
- * `scheduled_payment` scheduled for `2015-11-13 00:00:00` and
40
- * `scheduled_expiration` scheduled for `2015-11-13 00:01:00`.
41
-
42
- Under normal conditions, Action Scheduler will ensure the `scheduled_payment` action is run before the `scheduled_expiration` action. Becuase that's how they are scheduled.
43
-
44
- However, when using the `--hooks` option, the `scheduled_payment` and `scheduled_expiration` actions will be processed in separate queues. As a result, this dependency is not guaranteed.
45
-
46
- For example, consider a site with both:
47
-
48
- * 100,000 `scheduled_payment` actions, scheduled for `2015-11-13 00:00:00`
49
- * 100 `scheduled_expiration` actions, scheduled for `2015-11-13 00:01:00`
50
-
51
- If two queue runners are running alongside each other with each runner dedicated to just one of these hooks, the queue runner handling expiration hooks will complete the processing of the expiration hooks more quickly than the queue runner handling all the payment actions.
52
-
53
- **Because of this, the `--group` and `--hooks` options should be used with caution to avoid processing actions with an implicit dependency based on their schedule in separate queues.**
54
-
55
- ## Improving Performance with `--group` or `--hooks`
56
-
57
- Being able to run queues for specific hooks or groups of actions is valuable at scale. Why? Because it means you can restrict the concurrency for similar actions.
58
-
59
- For example, let's say you have 300,000 actions queued up comprised of:
60
-
61
- * 100,000 renewals payments
62
- * 100,000 email notifications
63
- * 100,000 membership status updates
64
-
65
- Action Scheduler's default WP Cron queue runner will process them all together. e.g. when it claims a batch of actions, some may be emails, some membership updates and some renewals.
66
-
67
- When you add concurrency to that, you can end up with issues. For example, if you have 3 queues running, they may all be attempting to process similar actions at the same time, which can lead to querying the same database tables with similar queries. Depending on the code/queries running, this can lead to database locks or other issues.
68
-
69
- If you can batch based on each action's group, then you can improve performance by processing like actions consecutively, but still processing the full set of actions concurrently.
70
-
71
- For example, if one queue is created to process emails, another to process membership updates, and another to process renewal payments, then the same queries won't be run at the same time, and 3 separate queues will be able to run more efficiently.
72
-
73
- The WP CLI runner can achieve this using the `--group` option.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/lib/cron-expression/README.md DELETED
@@ -1,92 +0,0 @@
1
- PHP Cron Expression Parser
2
- ==========================
3
-
4
- [![Latest Stable Version](https://poser.pugx.org/mtdowling/cron-expression/v/stable.png)](https://packagist.org/packages/mtdowling/cron-expression) [![Total Downloads](https://poser.pugx.org/mtdowling/cron-expression/downloads.png)](https://packagist.org/packages/mtdowling/cron-expression) [![Build Status](https://secure.travis-ci.org/mtdowling/cron-expression.png)](http://travis-ci.org/mtdowling/cron-expression)
5
-
6
- The PHP cron expression parser can parse a CRON expression, determine if it is
7
- due to run, calculate the next run date of the expression, and calculate the previous
8
- run date of the expression. You can calculate dates far into the future or past by
9
- skipping n number of matching dates.
10
-
11
- The parser can handle increments of ranges (e.g. */12, 2-59/3), intervals (e.g. 0-9),
12
- lists (e.g. 1,2,3), W to find the nearest weekday for a given day of the month, L to
13
- find the last day of the month, L to find the last given weekday of a month, and hash
14
- (#) to find the nth weekday of a given month.
15
-
16
- Credits
17
- ==========
18
-
19
- Created by Micheal Dowling. Ported to PHP 5.2 by Flightless, Inc.
20
- Based on version 1.0.3: https://github.com/mtdowling/cron-expression/tree/v1.0.3
21
-
22
- Installing
23
- ==========
24
-
25
- Add the following to your project's composer.json:
26
-
27
- ```javascript
28
- {
29
- "require": {
30
- "mtdowling/cron-expression": "1.0.*"
31
- }
32
- }
33
- ```
34
-
35
- Usage
36
- =====
37
- ```php
38
- <?php
39
-
40
- require_once '/vendor/autoload.php';
41
-
42
- // Works with predefined scheduling definitions
43
- $cron = Cron\CronExpression::factory('@daily');
44
- $cron->isDue();
45
- echo $cron->getNextRunDate()->format('Y-m-d H:i:s');
46
- echo $cron->getPreviousRunDate()->format('Y-m-d H:i:s');
47
-
48
- // Works with complex expressions
49
- $cron = Cron\CronExpression::factory('3-59/15 2,6-12 */15 1 2-5');
50
- echo $cron->getNextRunDate()->format('Y-m-d H:i:s');
51
-
52
- // Calculate a run date two iterations into the future
53
- $cron = Cron\CronExpression::factory('@daily');
54
- echo $cron->getNextRunDate(null, 2)->format('Y-m-d H:i:s');
55
-
56
- // Calculate a run date relative to a specific time
57
- $cron = Cron\CronExpression::factory('@monthly');
58
- echo $cron->getNextRunDate('2010-01-12 00:00:00')->format('Y-m-d H:i:s');
59
- ```
60
-
61
- CRON Expressions
62
- ================
63
-
64
- A CRON expression is a string representing the schedule for a particular command to execute. The parts of a CRON schedule are as follows:
65
-
66
- * * * * * *
67
- - - - - - -
68
- | | | | | |
69
- | | | | | + year [optional]
70
- | | | | +----- day of week (0 - 7) (Sunday=0 or 7)
71
- | | | +---------- month (1 - 12)
72
- | | +--------------- day of month (1 - 31)
73
- | +-------------------- hour (0 - 23)
74
- +------------------------- min (0 - 59)
75
-
76
- Requirements
77
- ============
78
-
79
- - PHP 5.3+
80
- - PHPUnit is required to run the unit tests
81
- - Composer is required to run the unit tests
82
-
83
- CHANGELOG
84
- =========
85
-
86
- 1.0.3 (2013-11-23)
87
- ------------------
88
-
89
- * Only set default timezone if the given $currentTime is not a DateTime instance (#34)
90
- * Fixes issue #28 where PHP increments of ranges were failing due to PHP casting hyphens to 0
91
- * Now supports expressions with any number of extra spaces, tabs, or newlines
92
- * Using static instead of self in `CronExpression::factory`
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/ActionScheduler_UnitTestCase.php DELETED
@@ -1,44 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_UnitTestCase
5
- */
6
- class ActionScheduler_UnitTestCase extends WP_UnitTestCase {
7
-
8
- protected $existing_timezone;
9
-
10
- /**
11
- * Counts the number of test cases executed by run(TestResult result).
12
- *
13
- * @return int
14
- */
15
- public function count() {
16
- return 'UTC' == date_default_timezone_get() ? 2 : 3;
17
- }
18
-
19
- /**
20
- * We want to run every test multiple times using a different timezone to make sure
21
- * that they are unaffected by changes to PHP's timezone.
22
- */
23
- public function run( PHPUnit\Framework\TestResult $result = NULL ){
24
-
25
- if ($result === NULL) {
26
- $result = $this->createResult();
27
- }
28
-
29
- if ( 'UTC' != ( $this->existing_timezone = date_default_timezone_get() ) ) {
30
- date_default_timezone_set( 'UTC' );
31
- $result->run( $this );
32
- }
33
-
34
- date_default_timezone_set( 'Pacific/Fiji' ); // UTC+12
35
- $result->run( $this );
36
-
37
- date_default_timezone_set( 'Pacific/Tahiti' ); // UTC-10: it's a magical place
38
- $result->run( $this );
39
-
40
- date_default_timezone_set( $this->existing_timezone );
41
-
42
- return $result;
43
- }
44
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/bootstrap.php DELETED
@@ -1,31 +0,0 @@
1
- <?php
2
-
3
- $GLOBALS['wp_tests_options'][ 'template' ] = 'twentyseventeen';
4
- $GLOBALS['wp_tests_options'][ 'stylesheet' ] = 'twentyseventeen';
5
- $GLOBALS['wp_tests_options'][ 'active_plugins' ][] = basename( dirname( __DIR__ ) ) .'/action-scheduler.php';
6
-
7
- // Check for select constants defined as environment variables
8
- foreach ( array('WP_CONTENT_DIR', 'WP_CONTENT_URL', 'WP_PLUGIN_DIR', 'WP_PLUGIN_URL', 'WPMU_PLUGIN_DIR') as $env_constant ) {
9
- if ( false !== getenv( $env_constant ) && !defined( $env_constant ) ) {
10
- define( $env_constant, getenv( $env_constant ));
11
- }
12
- }
13
-
14
- // If the wordpress-tests repo location has been customized (and specified
15
- // with WP_TESTS_DIR), use that location. This will most commonly be the case
16
- // when configured for use with Travis CI.
17
-
18
- // Otherwise, we'll just assume that this plugin is installed in the WordPress
19
- // SVN external checkout configured in the wordpress-tests repo.
20
-
21
- if( false !== getenv( 'WP_TESTS_DIR' ) ) {
22
- require getenv( 'WP_TESTS_DIR' ) . '/includes/bootstrap.php';
23
- } else {
24
- require dirname( dirname( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) ) ) . '/tests/phpunit/includes/bootstrap.php';
25
- }
26
-
27
- if ( class_exists( 'PHPUnit\Framework\TestResult' ) ) { // PHPUnit 6.0 or newer
28
- include_once('ActionScheduler_UnitTestCase.php');
29
- } else {
30
- include_once('phpunit/deprecated/ActionScheduler_UnitTestCase.php');
31
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit.xml.dist DELETED
@@ -1,32 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
-
3
- <phpunit backupGlobals="false"
4
- backupStaticAttributes="false"
5
- colors="true"
6
- convertErrorsToExceptions="true"
7
- convertNoticesToExceptions="true"
8
- convertWarningsToExceptions="true"
9
- processIsolation="false"
10
- stopOnFailure="false"
11
- syntaxCheck="false"
12
- bootstrap="bootstrap.php"
13
- >
14
- <testsuites>
15
- <testsuite name="Action Scheduler">
16
- <directory>./phpunit</directory>
17
- </testsuite>
18
- </testsuites>
19
- <groups>
20
- <exclude>
21
- <group>ignore</group>
22
- </exclude>
23
- </groups>
24
- <filter>
25
- <whitelist processsUncoveredFilesFromWhitelist="true">
26
- <directory suffix=".php">..</directory>
27
- <exclude>
28
- <directory>.</directory>
29
- </exclude>
30
- </whitelist>
31
- </filter>
32
- </phpunit>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/deprecated/ActionScheduler_UnitTestCase.php DELETED
@@ -1,44 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_UnitTestCase
5
- */
6
- class ActionScheduler_UnitTestCase extends WP_UnitTestCase {
7
-
8
- protected $existing_timezone;
9
-
10
- /**
11
- * Counts the number of test cases executed by run(TestResult result).
12
- *
13
- * @return int
14
- */
15
- public function count() {
16
- return 'UTC' == date_default_timezone_get() ? 2 : 3;
17
- }
18
-
19
- /**
20
- * We want to run every test multiple times using a different timezone to make sure
21
- * that they are unaffected by changes to PHP's timezone.
22
- */
23
- public function run( PHPUnit_Framework_TestResult $result = NULL ){
24
-
25
- if ($result === NULL) {
26
- $result = $this->createResult();
27
- }
28
-
29
- if ( 'UTC' != ( $this->existing_timezone = date_default_timezone_get() ) ) {
30
- date_default_timezone_set( 'UTC' );
31
- $result->run( $this );
32
- }
33
-
34
- date_default_timezone_set( 'Pacific/Fiji' ); // UTC+12
35
- $result->run( $this );
36
-
37
- date_default_timezone_set( 'Pacific/Tahiti' ); // UTC-10: it's a magical place
38
- $result->run( $this );
39
-
40
- date_default_timezone_set( $this->existing_timezone );
41
-
42
- return $result;
43
- }
44
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/helpers/ActionScheduler_TimezoneHelper_Test.php DELETED
@@ -1,100 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * @group timezone
5
- */
6
- class ActionScheduler_TimezoneHelper_Test extends ActionScheduler_UnitTestCase {
7
-
8
- /**
9
- * Ensure that the timezone string we expect works properly.
10
- *
11
- * @dataProvider local_timezone_provider
12
- *
13
- * @param $timezone_string
14
- */
15
- public function test_local_timezone_strings( $timezone_string ) {
16
- $timezone_filter = function ( $tz ) use ( $timezone_string ) {
17
- return $timezone_string;
18
- };
19
-
20
- add_filter( 'option_timezone_string', $timezone_filter );
21
-
22
- $date = new ActionScheduler_DateTime();
23
- $timezone = ActionScheduler_TimezoneHelper::set_local_timezone( $date )->getTimezone();
24
- $this->assertInstanceOf( 'DateTimeZone', $timezone );
25
- $this->assertEquals( $timezone_string, $timezone->getName() );
26
-
27
- remove_filter( 'option_timezone_string', $timezone_filter );
28
- }
29
-
30
- public function local_timezone_provider() {
31
- return array(
32
- array( 'America/New_York' ),
33
- array( 'Australia/Melbourne' ),
34
- array( 'UTC' ),
35
- );
36
- }
37
-
38
- /**
39
- * Ensure that most GMT offsets don't return UTC as the timezone.
40
- *
41
- * @dataProvider local_timezone_offsets_provider
42
- *
43
- * @param $gmt_offset
44
- */
45
- public function test_local_timezone_offsets( $gmt_offset ) {
46
- $gmt_filter = function ( $gmt ) use ( $gmt_offset ) {
47
- return $gmt_offset;
48
- };
49
-
50
- $date = new ActionScheduler_DateTime();
51
-
52
- add_filter( 'option_gmt_offset', $gmt_filter );
53
- ActionScheduler_TimezoneHelper::set_local_timezone( $date );
54
- remove_filter( 'option_gmt_offset', $gmt_filter );
55
-
56
- $offset_in_seconds = $gmt_offset * HOUR_IN_SECONDS;
57
-
58
- $this->assertEquals( $offset_in_seconds, $date->getOffset() );
59
- $this->assertEquals( $offset_in_seconds, $date->getOffsetTimestamp() - $date->getTimestamp() );
60
- }
61
-
62
- public function local_timezone_offsets_provider() {
63
- return array(
64
- array( '-11' ),
65
- array( '-10.5' ),
66
- array( '-10' ),
67
- array( '-9' ),
68
- array( '-8' ),
69
- array( '-7' ),
70
- array( '-6' ),
71
- array( '-5' ),
72
- array( '-4.5' ),
73
- array( '-4' ),
74
- array( '-3.5' ),
75
- array( '-3' ),
76
- array( '-2' ),
77
- array( '-1' ),
78
- array( '1' ),
79
- array( '1.5' ),
80
- array( '2' ),
81
- array( '3' ),
82
- array( '4' ),
83
- array( '5' ),
84
- array( '5.5' ),
85
- array( '5.75' ),
86
- array( '6' ),
87
- array( '7' ),
88
- array( '8' ),
89
- array( '8.5' ),
90
- array( '9' ),
91
- array( '9.5' ),
92
- array( '10' ),
93
- array( '10.5' ),
94
- array( '11' ),
95
- array( '11.5' ),
96
- array( '12' ),
97
- array( '13' ),
98
- );
99
- }
100
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/jobs/ActionScheduler_Action_Test.php DELETED
@@ -1,55 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_Action_Test
5
- * @group actions
6
- */
7
- class ActionScheduler_Action_Test extends ActionScheduler_UnitTestCase {
8
- public function test_set_schedule() {
9
- $time = as_get_datetime_object();
10
- $schedule = new ActionScheduler_SimpleSchedule($time);
11
- $action = new ActionScheduler_Action('my_hook', array(), $schedule);
12
- $this->assertEquals( $schedule, $action->get_schedule() );
13
- }
14
-
15
- public function test_null_schedule() {
16
- $action = new ActionScheduler_Action('my_hook');
17
- $this->assertInstanceOf( 'ActionScheduler_NullSchedule', $action->get_schedule() );
18
- }
19
-
20
- public function test_set_hook() {
21
- $action = new ActionScheduler_Action('my_hook');
22
- $this->assertEquals( 'my_hook', $action->get_hook() );
23
- }
24
-
25
- public function test_args() {
26
- $action = new ActionScheduler_Action('my_hook');
27
- $this->assertEmpty($action->get_args());
28
-
29
- $action = new ActionScheduler_Action('my_hook', array(5,10,15));
30
- $this->assertEqualSets(array(5,10,15), $action->get_args());
31
- }
32
-
33
- public function test_set_group() {
34
- $action = new ActionScheduler_Action('my_hook', array(), NULL, 'my_group');
35
- $this->assertEquals('my_group', $action->get_group());
36
- }
37
-
38
- public function test_execute() {
39
- $mock = new MockAction();
40
-
41
- $random = md5(rand());
42
- add_action( $random, array( $mock, 'action' ) );
43
-
44
- $action = new ActionScheduler_Action( $random, array($random) );
45
- $action->execute();
46
-
47
- remove_action( $random, array( $mock, 'action' ) );
48
-
49
- $this->assertEquals( 1, $mock->get_call_count() );
50
- $events = $mock->get_events();
51
- $event = reset($events);
52
- $this->assertEquals( $random, reset($event['args']) );
53
- }
54
- }
55
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/jobs/ActionScheduler_NullAction_Test.php DELETED
@@ -1,16 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_NullAction_Test
5
- * @group actions
6
- */
7
- class ActionScheduler_NullAction_Test extends ActionScheduler_UnitTestCase {
8
- public function test_null_action() {
9
- $action = new ActionScheduler_NullAction();
10
-
11
- $this->assertEmpty($action->get_hook());
12
- $this->assertEmpty($action->get_args());
13
- $this->assertNull($action->get_schedule()->next());
14
- }
15
- }
16
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php DELETED
@@ -1,375 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_wpPostStore_Test
5
- * @group stores
6
- */
7
- class ActionScheduler_wpPostStore_Test extends ActionScheduler_UnitTestCase {
8
-
9
- public function test_create_action() {
10
- $time = as_get_datetime_object();
11
- $schedule = new ActionScheduler_SimpleSchedule($time);
12
- $action = new ActionScheduler_Action('my_hook', array(), $schedule);
13
- $store = new ActionScheduler_wpPostStore();
14
- $action_id = $store->save_action($action);
15
-
16
- $this->assertNotEmpty($action_id);
17
- }
18
-
19
- public function test_create_action_with_scheduled_date() {
20
- $time = as_get_datetime_object( strtotime( '-1 week' ) );
21
- $action = new ActionScheduler_Action( 'my_hook', array(), new ActionScheduler_SimpleSchedule( $time ) );
22
- $store = new ActionScheduler_wpPostStore();
23
-
24
- $action_id = $store->save_action( $action, $time );
25
- $action_date = $store->get_date( $action_id );
26
-
27
- $this->assertEquals( $time->getTimestamp(), $action_date->getTimestamp() );
28
- }
29
-
30
- public function test_retrieve_action() {
31
- $time = as_get_datetime_object();
32
- $schedule = new ActionScheduler_SimpleSchedule($time);
33
- $action = new ActionScheduler_Action('my_hook', array(), $schedule, 'my_group');
34
- $store = new ActionScheduler_wpPostStore();
35
- $action_id = $store->save_action($action);
36
-
37
- $retrieved = $store->fetch_action($action_id);
38
- $this->assertEquals($action->get_hook(), $retrieved->get_hook());
39
- $this->assertEqualSets($action->get_args(), $retrieved->get_args());
40
- $this->assertEquals($action->get_schedule()->next()->getTimestamp(), $retrieved->get_schedule()->next()->getTimestamp());
41
- $this->assertEquals($action->get_group(), $retrieved->get_group());
42
- }
43
-
44
- /**
45
- * @dataProvider provide_bad_args
46
- *
47
- * @param string $content
48
- */
49
- public function test_action_bad_args( $content ) {
50
- $store = new ActionScheduler_wpPostStore();
51
- $post_id = wp_insert_post( array(
52
- 'post_type' => ActionScheduler_wpPostStore::POST_TYPE,
53
- 'post_status' => ActionScheduler_Store::STATUS_PENDING,
54
- 'post_content' => $content,
55
- ) );
56
-
57
- $fetched = $store->fetch_action( $post_id );
58
- $this->assertInstanceOf( 'ActionScheduler_NullSchedule', $fetched->get_schedule() );
59
- }
60
-
61
- public function provide_bad_args() {
62
- return array(
63
- array( '{"bad_json":true}}' ),
64
- );
65
- }
66
-
67
- public function test_cancel_action() {
68
- $time = as_get_datetime_object();
69
- $schedule = new ActionScheduler_SimpleSchedule($time);
70
- $action = new ActionScheduler_Action('my_hook', array(), $schedule, 'my_group');
71
- $store = new ActionScheduler_wpPostStore();
72
- $action_id = $store->save_action($action);
73
- $store->cancel_action( $action_id );
74
-
75
- $fetched = $store->fetch_action( $action_id );
76
- $this->assertInstanceOf( 'ActionScheduler_CanceledAction', $fetched );
77
- }
78
-
79
- public function test_claim_actions() {
80
- $created_actions = array();
81
- $store = new ActionScheduler_wpPostStore();
82
- for ( $i = 3 ; $i > -3 ; $i-- ) {
83
- $time = as_get_datetime_object($i.' hours');
84
- $schedule = new ActionScheduler_SimpleSchedule($time);
85
- $action = new ActionScheduler_Action('my_hook', array($i), $schedule, 'my_group');
86
- $created_actions[] = $store->save_action($action);
87
- }
88
-
89
- $claim = $store->stake_claim();
90
- $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
91
-
92
- $this->assertCount( 3, $claim->get_actions() );
93
- $this->assertEqualSets( array_slice( $created_actions, 3, 3 ), $claim->get_actions() );
94
- }
95
-
96
- public function test_claim_actions_order() {
97
- $store = new ActionScheduler_wpPostStore();
98
- $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( '-1 hour' ) );
99
- $created_actions = array(
100
- $store->save_action( new ActionScheduler_Action( 'my_hook', array( 1 ), $schedule, 'my_group' ) ),
101
- $store->save_action( new ActionScheduler_Action( 'my_hook', array( 1 ), $schedule, 'my_group' ) ),
102
- );
103
-
104
- $claim = $store->stake_claim();
105
- $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim );
106
-
107
- // Verify uniqueness of action IDs.
108
- $this->assertEquals( 2, count( array_unique( $created_actions ) ) );
109
-
110
- // Verify the count and order of the actions.
111
- $claimed_actions = $claim->get_actions();
112
- $this->assertCount( 2, $claimed_actions );
113
- $this->assertEquals( $created_actions, $claimed_actions );
114
-
115
- // Verify the reversed order doesn't pass.
116
- $reversed_actions = array_reverse( $created_actions );
117
- $this->assertNotEquals( $reversed_actions, $claimed_actions );
118
- }
119
-
120
- public function test_duplicate_claim() {
121
- $created_actions = array();
122
- $store = new ActionScheduler_wpPostStore();
123
- for ( $i = 0 ; $i > -3 ; $i-- ) {
124
- $time = as_get_datetime_object($i.' hours');
125
- $schedule = new ActionScheduler_SimpleSchedule($time);
126
- $action = new ActionScheduler_Action('my_hook', array($i), $schedule, 'my_group');
127
- $created_actions[] = $store->save_action($action);
128
- }
129
-
130
- $claim1 = $store->stake_claim();
131
- $claim2 = $store->stake_claim();
132
- $this->assertCount( 3, $claim1->get_actions() );
133
- $this->assertCount( 0, $claim2->get_actions() );
134
- }
135
-
136
- public function test_release_claim() {
137
- $created_actions = array();
138
- $store = new ActionScheduler_wpPostStore();
139
- for ( $i = 0 ; $i > -3 ; $i-- ) {
140
- $time = as_get_datetime_object($i.' hours');
141
- $schedule = new ActionScheduler_SimpleSchedule($time);
142
- $action = new ActionScheduler_Action('my_hook', array($i), $schedule, 'my_group');
143
- $created_actions[] = $store->save_action($action);
144
- }
145
-
146
- $claim1 = $store->stake_claim();
147
-
148
- $store->release_claim( $claim1 );
149
-
150
- $claim2 = $store->stake_claim();
151
- $this->assertCount( 3, $claim2->get_actions() );
152
- }
153
-
154
- public function test_search() {
155
- $created_actions = array();
156
- $store = new ActionScheduler_wpPostStore();
157
- for ( $i = -3 ; $i <= 3 ; $i++ ) {
158
- $time = as_get_datetime_object($i.' hours');
159
- $schedule = new ActionScheduler_SimpleSchedule($time);
160
- $action = new ActionScheduler_Action('my_hook', array($i), $schedule, 'my_group');
161
- $created_actions[] = $store->save_action($action);
162
- }
163
-
164
- $next_no_args = $store->find_action( 'my_hook' );
165
- $this->assertEquals( $created_actions[0], $next_no_args );
166
-
167
- $next_with_args = $store->find_action( 'my_hook', array( 'args' => array( 1 ) ) );
168
- $this->assertEquals( $created_actions[4], $next_with_args );
169
-
170
- $non_existent = $store->find_action( 'my_hook', array( 'args' => array( 17 ) ) );
171
- $this->assertNull( $non_existent );
172
- }
173
-
174
- public function test_search_by_group() {
175
- $store = new ActionScheduler_wpPostStore();
176
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('tomorrow'));
177
- $abc = $store->save_action(new ActionScheduler_Action('my_hook', array(1), $schedule, 'abc'));
178
- $def = $store->save_action(new ActionScheduler_Action('my_hook', array(1), $schedule, 'def'));
179
- $ghi = $store->save_action(new ActionScheduler_Action('my_hook', array(1), $schedule, 'ghi'));
180
-
181
- $this->assertEquals( $abc, $store->find_action('my_hook', array('group' => 'abc')));
182
- $this->assertEquals( $def, $store->find_action('my_hook', array('group' => 'def')));
183
- $this->assertEquals( $ghi, $store->find_action('my_hook', array('group' => 'ghi')));
184
- }
185
-
186
- public function test_post_author() {
187
- $current_user = get_current_user_id();
188
-
189
- $time = as_get_datetime_object();
190
- $schedule = new ActionScheduler_SimpleSchedule($time);
191
- $action = new ActionScheduler_Action('my_hook', array(), $schedule);
192
- $store = new ActionScheduler_wpPostStore();
193
- $action_id = $store->save_action($action);
194
-
195
- $post = get_post($action_id);
196
- $this->assertEquals(0, $post->post_author);
197
-
198
- $new_user = $this->factory->user->create_object(array(
199
- 'user_login' => __FUNCTION__,
200
- 'user_pass' => md5(rand()),
201
- ));
202
- wp_set_current_user( $new_user );
203
-
204
-
205
- $schedule = new ActionScheduler_SimpleSchedule($time);
206
- $action = new ActionScheduler_Action('my_hook', array(), $schedule);
207
- $action_id = $store->save_action($action);
208
- $post = get_post($action_id);
209
- $this->assertEquals(0, $post->post_author);
210
-
211
- wp_set_current_user($current_user);
212
- }
213
-
214
- /**
215
- * @issue 13
216
- */
217
- public function test_post_status_for_recurring_action() {
218
- $time = as_get_datetime_object('10 minutes');
219
- $schedule = new ActionScheduler_IntervalSchedule($time, HOUR_IN_SECONDS);
220
- $action = new ActionScheduler_Action('my_hook', array(), $schedule);
221
- $store = new ActionScheduler_wpPostStore();
222
- $action_id = $store->save_action($action);
223
-
224
- $action = $store->fetch_action($action_id);
225
- $action->execute();
226
- $store->mark_complete( $action_id );
227
-
228
- $next = $action->get_schedule()->next( as_get_datetime_object() );
229
- $new_action_id = $store->save_action( $action, $next );
230
-
231
- $this->assertEquals('publish', get_post_status($action_id));
232
- $this->assertEquals('pending', get_post_status($new_action_id));
233
- }
234
-
235
- public function test_get_run_date() {
236
- $time = as_get_datetime_object('-10 minutes');
237
- $schedule = new ActionScheduler_IntervalSchedule($time, HOUR_IN_SECONDS);
238
- $action = new ActionScheduler_Action('my_hook', array(), $schedule);
239
- $store = new ActionScheduler_wpPostStore();
240
- $action_id = $store->save_action($action);
241
-
242
- $this->assertEquals( $store->get_date($action_id)->getTimestamp(), $time->getTimestamp() );
243
-
244
- $action = $store->fetch_action($action_id);
245
- $action->execute();
246
- $now = as_get_datetime_object();
247
- $store->mark_complete( $action_id );
248
-
249
- $this->assertEquals( $store->get_date( $action_id )->getTimestamp(), $now->getTimestamp(), '', 1 );
250
-
251
- $next = $action->get_schedule()->next( $now );
252
- $new_action_id = $store->save_action( $action, $next );
253
-
254
- $this->assertEquals( (int)($now->getTimestamp()) + HOUR_IN_SECONDS, $store->get_date($new_action_id)->getTimestamp() );
255
- }
256
-
257
- public function test_get_status() {
258
- $time = as_get_datetime_object('-10 minutes');
259
- $schedule = new ActionScheduler_IntervalSchedule($time, HOUR_IN_SECONDS);
260
- $action = new ActionScheduler_Action('my_hook', array(), $schedule);
261
- $store = new ActionScheduler_wpPostStore();
262
- $action_id = $store->save_action($action);
263
-
264
- $this->assertEquals( ActionScheduler_Store::STATUS_PENDING, $store->get_status( $action_id ) );
265
-
266
- $store->mark_complete( $action_id );
267
- $this->assertEquals( ActionScheduler_Store::STATUS_COMPLETE, $store->get_status( $action_id ) );
268
-
269
- $store->mark_failure( $action_id );
270
- $this->assertEquals( ActionScheduler_Store::STATUS_FAILED, $store->get_status( $action_id ) );
271
- }
272
-
273
- public function test_claim_actions_by_hooks() {
274
- $hook1 = __FUNCTION__ . '_hook_1';
275
- $hook2 = __FUNCTION__ . '_hook_2';
276
- $store = new ActionScheduler_wpPostStore();
277
- $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( '-1 hour' ) );
278
-
279
- $action1 = $store->save_action( new ActionScheduler_Action( $hook1, array(), $schedule ) );
280
- $action2 = $store->save_action( new ActionScheduler_Action( $hook2, array(), $schedule ) );
281
-
282
- // Claiming no hooks should include all actions.
283
- $claim = $store->stake_claim( 10 );
284
- $this->assertEquals( 2, count( $claim->get_actions() ) );
285
- $this->assertTrue( in_array( $action1, $claim->get_actions() ) );
286
- $this->assertTrue( in_array( $action2, $claim->get_actions() ) );
287
- $store->release_claim( $claim );
288
-
289
- // Claiming a hook should claim only actions with that hook
290
- $claim = $store->stake_claim( 10, null, array( $hook1 ) );
291
- $this->assertEquals( 1, count( $claim->get_actions() ) );
292
- $this->assertTrue( in_array( $action1, $claim->get_actions() ) );
293
- $store->release_claim( $claim );
294
-
295
- // Claiming two hooks should claim actions with either of those hooks
296
- $claim = $store->stake_claim( 10, null, array( $hook1, $hook2 ) );
297
- $this->assertEquals( 2, count( $claim->get_actions() ) );
298
- $this->assertTrue( in_array( $action1, $claim->get_actions() ) );
299
- $this->assertTrue( in_array( $action2, $claim->get_actions() ) );
300
- $store->release_claim( $claim );
301
-
302
- // Claiming two hooks should claim actions with either of those hooks
303
- $claim = $store->stake_claim( 10, null, array( __METHOD__ . '_hook_3' ) );
304
- $this->assertEquals( 0, count( $claim->get_actions() ) );
305
- $this->assertFalse( in_array( $action1, $claim->get_actions() ) );
306
- $this->assertFalse( in_array( $action2, $claim->get_actions() ) );
307
- $store->release_claim( $claim );
308
- }
309
-
310
- /**
311
- * @issue 121
312
- */
313
- public function test_claim_actions_by_group() {
314
- $group1 = md5( rand() );
315
- $store = new ActionScheduler_wpPostStore();
316
- $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( '-1 hour' ) );
317
-
318
- $action1 = $store->save_action( new ActionScheduler_Action( __METHOD__, array(), $schedule, $group1 ) );
319
- $action2 = $store->save_action( new ActionScheduler_Action( __METHOD__, array(), $schedule ) );
320
-
321
- // Claiming no group should include all actions.
322
- $claim = $store->stake_claim( 10 );
323
- $this->assertEquals( 2, count( $claim->get_actions() ) );
324
- $this->assertTrue( in_array( $action1, $claim->get_actions() ) );
325
- $this->assertTrue( in_array( $action2, $claim->get_actions() ) );
326
- $store->release_claim( $claim );
327
-
328
- // Claiming a group should claim only actions in that group.
329
- $claim = $store->stake_claim( 10, null, array(), $group1 );
330
- $this->assertEquals( 1, count( $claim->get_actions() ) );
331
- $this->assertTrue( in_array( $action1, $claim->get_actions() ) );
332
- $store->release_claim( $claim );
333
- }
334
-
335
- public function test_claim_actions_by_hook_and_group() {
336
- $hook1 = __FUNCTION__ . '_hook_1';
337
- $hook2 = __FUNCTION__ . '_hook_2';
338
- $hook3 = __FUNCTION__ . '_hook_3';
339
- $group1 = 'group_' . md5( rand() );
340
- $group2 = 'group_' . md5( rand() );
341
- $store = new ActionScheduler_wpPostStore();
342
- $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( '-1 hour' ) );
343
-
344
- $action1 = $store->save_action( new ActionScheduler_Action( $hook1, array(), $schedule, $group1 ) );
345
- $action2 = $store->save_action( new ActionScheduler_Action( $hook2, array(), $schedule ) );
346
- $action3 = $store->save_action( new ActionScheduler_Action( $hook3, array(), $schedule, $group2 ) );
347
-
348
- // Claiming no hooks or group should include all actions.
349
- $claim = $store->stake_claim( 10 );
350
- $this->assertEquals( 3, count( $claim->get_actions() ) );
351
- $this->assertTrue( in_array( $action1, $claim->get_actions() ) );
352
- $this->assertTrue( in_array( $action2, $claim->get_actions() ) );
353
- $store->release_claim( $claim );
354
-
355
- // Claiming a group and hook should claim only actions in that group.
356
- $claim = $store->stake_claim( 10, null, array( $hook1 ), $group1 );
357
- $this->assertEquals( 1, count( $claim->get_actions() ) );
358
- $this->assertTrue( in_array( $action1, $claim->get_actions() ) );
359
- $store->release_claim( $claim );
360
-
361
- // Claiming a group and hook should claim only actions with that hook in that group.
362
- $claim = $store->stake_claim( 10, null, array( $hook2 ), $group1 );
363
- $this->assertEquals( 0, count( $claim->get_actions() ) );
364
- $this->assertFalse( in_array( $action1, $claim->get_actions() ) );
365
- $this->assertFalse( in_array( $action2, $claim->get_actions() ) );
366
- $store->release_claim( $claim );
367
-
368
- // Claiming a group and hook should claim only actions with that hook in that group.
369
- $claim = $store->stake_claim( 10, null, array( $hook1, $hook2 ), $group2 );
370
- $this->assertEquals( 0, count( $claim->get_actions() ) );
371
- $this->assertFalse( in_array( $action1, $claim->get_actions() ) );
372
- $this->assertFalse( in_array( $action2, $claim->get_actions() ) );
373
- $store->release_claim( $claim );
374
- }
375
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php DELETED
@@ -1,185 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_wpCommentLogger_Test
5
- * @package test_cases\logging
6
- */
7
- class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase {
8
- public function test_default_logger() {
9
- $logger = ActionScheduler::logger();
10
- $this->assertInstanceOf( 'ActionScheduler_Logger', $logger );
11
- $this->assertInstanceOf( 'ActionScheduler_wpCommentLogger', $logger );
12
- }
13
-
14
- public function test_add_log_entry() {
15
- $action_id = as_schedule_single_action( time(), 'a hook' );
16
- $logger = ActionScheduler::logger();
17
- $message = 'Logging that something happened';
18
- $log_id = $logger->log( $action_id, $message );
19
- $entry = $logger->get_entry( $log_id );
20
-
21
- $this->assertEquals( $action_id, $entry->get_action_id() );
22
- $this->assertEquals( $message, $entry->get_message() );
23
- }
24
-
25
- public function test_add_log_datetime() {
26
- $action_id = as_schedule_single_action( time(), 'a hook' );
27
- $logger = ActionScheduler::logger();
28
- $message = 'Logging that something happened';
29
- $date = new DateTime( 'now', new DateTimeZone( 'UTC' ) );
30
- $log_id = $logger->log( $action_id, $message, $date );
31
- $entry = $logger->get_entry( $log_id );
32
-
33
- $this->assertEquals( $action_id, $entry->get_action_id() );
34
- $this->assertEquals( $message, $entry->get_message() );
35
-
36
- $date = new ActionScheduler_DateTime( 'now', new DateTimeZone( 'UTC' ) );
37
- $log_id = $logger->log( $action_id, $message, $date );
38
- $entry = $logger->get_entry( $log_id );
39
-
40
- $this->assertEquals( $action_id, $entry->get_action_id() );
41
- $this->assertEquals( $message, $entry->get_message() );
42
- }
43
-
44
- public function test_null_log_entry() {
45
- $logger = ActionScheduler::logger();
46
- $entry = $logger->get_entry( 1 );
47
- $this->assertEquals( '', $entry->get_action_id() );
48
- $this->assertEquals( '', $entry->get_message() );
49
- }
50
-
51
- public function test_erroneous_entry_id() {
52
- $comment = wp_insert_comment(array(
53
- 'comment_post_ID' => 1,
54
- 'comment_author' => 'test',
55
- 'comment_content' => 'this is not a log entry',
56
- ));
57
- $logger = ActionScheduler::logger();
58
- $entry = $logger->get_entry( $comment );
59
- $this->assertEquals( '', $entry->get_action_id() );
60
- $this->assertEquals( '', $entry->get_message() );
61
- }
62
-
63
- public function test_storage_comments() {
64
- $action_id = as_schedule_single_action( time(), 'a hook' );
65
- $logger = ActionScheduler::logger();
66
- $logs = $logger->get_logs( $action_id );
67
- $expected = new ActionScheduler_LogEntry( $action_id, 'action created' );
68
- $this->assertTrue( in_array( $this->log_entry_to_array( $expected ) , $this->log_entry_to_array( $logs ) ) );
69
- }
70
-
71
- protected function log_entry_to_array( $logs ) {
72
- if ( $logs instanceof ActionScheduler_LogEntry ) {
73
- return array( 'action_id' => $logs->get_action_id(), 'message' => $logs->get_message() );
74
- }
75
-
76
- foreach ( $logs as $id => $log) {
77
- $logs[ $id ] = array( 'action_id' => $log->get_action_id(), 'message' => $log->get_message() );
78
- }
79
-
80
- return $logs;
81
- }
82
-
83
- public function test_execution_comments() {
84
- $action_id = as_schedule_single_action( time(), 'a hook' );
85
- $logger = ActionScheduler::logger();
86
- $started = new ActionScheduler_LogEntry( $action_id, 'action started' );
87
- $finished = new ActionScheduler_LogEntry( $action_id, 'action complete' );
88
-
89
- $runner = new ActionScheduler_QueueRunner();
90
- $runner->run();
91
-
92
- $logs = $logger->get_logs( $action_id );
93
- $this->assertTrue( in_array( $this->log_entry_to_array( $started ), $this->log_entry_to_array( $logs ) ) );
94
- $this->assertTrue( in_array( $this->log_entry_to_array( $finished ), $this->log_entry_to_array( $logs ) ) );
95
- }
96
-
97
- public function test_failed_execution_comments() {
98
- $hook = md5(rand());
99
- add_action( $hook, array( $this, '_a_hook_callback_that_throws_an_exception' ) );
100
- $action_id = as_schedule_single_action( time(), $hook );
101
- $logger = ActionScheduler::logger();
102
- $started = new ActionScheduler_LogEntry( $action_id, 'action started' );
103
- $finished = new ActionScheduler_LogEntry( $action_id, 'action complete' );
104
- $failed = new ActionScheduler_LogEntry( $action_id, 'action failed: Execution failed' );
105
-
106
- $runner = new ActionScheduler_QueueRunner();
107
- $runner->run();
108
-
109
- $logs = $logger->get_logs( $action_id );
110
- $this->assertTrue( in_array( $this->log_entry_to_array( $started ), $this->log_entry_to_array( $logs ) ) );
111
- $this->assertFalse( in_array( $this->log_entry_to_array( $finished ), $this->log_entry_to_array( $logs ) ) );
112
- $this->assertTrue( in_array( $this->log_entry_to_array( $failed ), $this->log_entry_to_array( $logs ) ) );
113
- }
114
-
115
- public function test_fatal_error_comments() {
116
- $hook = md5(rand());
117
- $action_id = as_schedule_single_action( time(), $hook );
118
- $logger = ActionScheduler::logger();
119
- do_action( 'action_scheduler_unexpected_shutdown', $action_id, array(
120
- 'type' => E_ERROR,
121
- 'message' => 'Test error',
122
- 'file' => __FILE__,
123
- 'line' => __LINE__,
124
- ));
125
-
126
- $logs = $logger->get_logs( $action_id );
127
- $found_log = FALSE;
128
- foreach ( $logs as $l ) {
129
- if ( strpos( $l->get_message(), 'unexpected shutdown' ) === 0 ) {
130
- $found_log = TRUE;
131
- }
132
- }
133
- $this->assertTrue( $found_log, 'Unexpected shutdown log not found' );
134
- }
135
-
136
- public function test_canceled_action_comments() {
137
- $action_id = as_schedule_single_action( time(), 'a hook' );
138
- as_unschedule_action( 'a hook' );
139
- $logger = ActionScheduler::logger();
140
- $logs = $logger->get_logs( $action_id );
141
- $expected = new ActionScheduler_LogEntry( $action_id, 'action canceled' );
142
- $this->assertTrue( in_array( $this->log_entry_to_array( $expected ), $this->log_entry_to_array( $logs ) ) );
143
- }
144
-
145
- public function _a_hook_callback_that_throws_an_exception() {
146
- throw new RuntimeException('Execution failed');
147
- }
148
-
149
- public function test_filtering_of_get_comments() {
150
- $post_id = $this->factory->post->create_object(array(
151
- 'post_title' => __FUNCTION__,
152
- ));
153
- $comment_id = $this->factory->comment->create_object(array(
154
- 'comment_post_ID' => $post_id,
155
- 'comment_author' => __CLASS__,
156
- 'comment_content' => __FUNCTION__,
157
- ));
158
-
159
- // Verify that we're getting the expected comment before we add logging comments
160
- $comments = get_comments();
161
- $this->assertCount( 1, $comments );
162
- $this->assertEquals( $comment_id, $comments[0]->comment_ID );
163
-
164
-
165
- $action_id = as_schedule_single_action( time(), 'a hook' );
166
- $logger = ActionScheduler::logger();
167
- $message = 'Logging that something happened';
168
- $log_id = $logger->log( $action_id, $message );
169
-
170
-
171
- // Verify that logging comments are excluded from general comment queries
172
- $comments = get_comments();
173
- $this->assertCount( 1, $comments );
174
- $this->assertEquals( $comment_id, $comments[0]->comment_ID );
175
-
176
- // Verify that logging comments are returned when asking for them specifically
177
- $comments = get_comments(array(
178
- 'type' => ActionScheduler_wpCommentLogger::TYPE,
179
- ));
180
- // Expecting two: one when the action is created, another when we added our custom log
181
- $this->assertCount( 2, $comments );
182
- $this->assertContains( $log_id, wp_list_pluck($comments, 'comment_ID'));
183
- }
184
- }
185
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/procedural_api/procedural_api_Test.php DELETED
@@ -1,222 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class procedural_api_Test
5
- */
6
- class procedural_api_Test extends ActionScheduler_UnitTestCase {
7
-
8
- public function test_schedule_action() {
9
- $time = time();
10
- $hook = md5(rand());
11
- $action_id = as_schedule_single_action( $time, $hook );
12
-
13
- $store = ActionScheduler::store();
14
- $action = $store->fetch_action($action_id);
15
- $this->assertEquals( $time, $action->get_schedule()->next()->getTimestamp() );
16
- $this->assertEquals( $hook, $action->get_hook() );
17
- }
18
-
19
- public function test_recurring_action() {
20
- $time = time();
21
- $hook = md5(rand());
22
- $action_id = as_schedule_recurring_action( $time, HOUR_IN_SECONDS, $hook );
23
-
24
- $store = ActionScheduler::store();
25
- $action = $store->fetch_action($action_id);
26
- $this->assertEquals( $time, $action->get_schedule()->next()->getTimestamp() );
27
- $this->assertEquals( $time + HOUR_IN_SECONDS + 2, $action->get_schedule()->next(as_get_datetime_object($time + 2))->getTimestamp());
28
- $this->assertEquals( $hook, $action->get_hook() );
29
- }
30
-
31
- public function test_cron_schedule() {
32
- $time = as_get_datetime_object('2014-01-01');
33
- $hook = md5(rand());
34
- $action_id = as_schedule_cron_action( $time->getTimestamp(), '0 0 10 10 *', $hook );
35
-
36
- $store = ActionScheduler::store();
37
- $action = $store->fetch_action($action_id);
38
- $expected_date = as_get_datetime_object('2014-10-10');
39
- $this->assertEquals( $expected_date->getTimestamp(), $action->get_schedule()->next()->getTimestamp() );
40
- $this->assertEquals( $hook, $action->get_hook() );
41
- }
42
-
43
- public function test_get_next() {
44
- $time = as_get_datetime_object('tomorrow');
45
- $hook = md5(rand());
46
- as_schedule_recurring_action( $time->getTimestamp(), HOUR_IN_SECONDS, $hook );
47
-
48
- $next = as_next_scheduled_action( $hook );
49
-
50
- $this->assertEquals( $time->getTimestamp(), $next );
51
- }
52
-
53
- public function provider_time_hook_args_group() {
54
- $time = time() + 60 * 2;
55
- $hook = md5( rand() );
56
- $args = array( rand(), rand() );
57
- $group = 'test_group';
58
-
59
- return array(
60
-
61
- // Test with no args or group
62
- array(
63
- 'time' => $time,
64
- 'hook' => $hook,
65
- 'args' => array(),
66
- 'group' => '',
67
- ),
68
-
69
- // Test with args but no group
70
- array(
71
- 'time' => $time,
72
- 'hook' => $hook,
73
- 'args' => $args,
74
- 'group' => '',
75
- ),
76
-
77
- // Test with group but no args
78
- array(
79
- 'time' => $time,
80
- 'hook' => $hook,
81
- 'args' => array(),
82
- 'group' => $group,
83
- ),
84
-
85
- // Test with args & group
86
- array(
87
- 'time' => $time,
88
- 'hook' => $hook,
89
- 'args' => $args,
90
- 'group' => $group,
91
- ),
92
- );
93
- }
94
-
95
- /**
96
- * @dataProvider provider_time_hook_args_group
97
- */
98
- public function test_unschedule( $time, $hook, $args, $group ) {
99
-
100
- $action_id_unscheduled = as_schedule_single_action( $time, $hook, $args, $group );
101
- $action_scheduled_time = $time + 1;
102
- $action_id_scheduled = as_schedule_single_action( $action_scheduled_time, $hook, $args, $group );
103
-
104
- as_unschedule_action( $hook, $args, $group );
105
-
106
- $next = as_next_scheduled_action( $hook, $args, $group );
107
- $this->assertEquals( $action_scheduled_time, $next );
108
-
109
- $store = ActionScheduler::store();
110
- $unscheduled_action = $store->fetch_action( $action_id_unscheduled );
111
-
112
- // Make sure the next scheduled action is unscheduled
113
- $this->assertEquals( $hook, $unscheduled_action->get_hook() );
114
- $this->assertNull( $unscheduled_action->get_schedule()->next() );
115
-
116
- // Make sure other scheduled actions are not unscheduled
117
- $scheduled_action = $store->fetch_action( $action_id_scheduled );
118
-
119
- $this->assertEquals( $hook, $scheduled_action->get_hook() );
120
- $this->assertEquals( $action_scheduled_time, $scheduled_action->get_schedule()->next()->getTimestamp() );
121
- }
122
-
123
- /**
124
- * @dataProvider provider_time_hook_args_group
125
- */
126
- public function test_unschedule_all( $time, $hook, $args, $group ) {
127
-
128
- $hook = md5( $hook );
129
- $action_ids = array();
130
-
131
- for ( $i = 0; $i < 3; $i++ ) {
132
- $action_ids[] = as_schedule_single_action( $time, $hook, $args, $group );
133
- }
134
-
135
- as_unschedule_all_actions( $hook, $args, $group );
136
-
137
- $next = as_next_scheduled_action( $hook );
138
- $this->assertFalse($next);
139
-
140
- $store = ActionScheduler::store();
141
-
142
- foreach ( $action_ids as $action_id ) {
143
- $action = $store->fetch_action($action_id);
144
-
145
- $this->assertNull($action->get_schedule()->next());
146
- $this->assertEquals($hook, $action->get_hook() );
147
- }
148
- }
149
-
150
- public function test_as_get_datetime_object_default() {
151
-
152
- $utc_now = new ActionScheduler_DateTime(null, new DateTimeZone('UTC'));
153
- $as_now = as_get_datetime_object();
154
-
155
- // Don't want to use 'U' as timestamps will always be in UTC
156
- $this->assertEquals($utc_now->format('Y-m-d H:i:s'),$as_now->format('Y-m-d H:i:s'));
157
- }
158
-
159
- public function test_as_get_datetime_object_relative() {
160
-
161
- $utc_tomorrow = new ActionScheduler_DateTime('tomorrow', new DateTimeZone('UTC'));
162
- $as_tomorrow = as_get_datetime_object('tomorrow');
163
-
164
- $this->assertEquals($utc_tomorrow->format('Y-m-d H:i:s'),$as_tomorrow->format('Y-m-d H:i:s'));
165
-
166
- $utc_tomorrow = new ActionScheduler_DateTime('yesterday', new DateTimeZone('UTC'));
167
- $as_tomorrow = as_get_datetime_object('yesterday');
168
-
169
- $this->assertEquals($utc_tomorrow->format('Y-m-d H:i:s'),$as_tomorrow->format('Y-m-d H:i:s'));
170
- }
171
-
172
- public function test_as_get_datetime_object_fixed() {
173
-
174
- $utc_tomorrow = new ActionScheduler_DateTime('29 February 2016', new DateTimeZone('UTC'));
175
- $as_tomorrow = as_get_datetime_object('29 February 2016');
176
-
177
- $this->assertEquals($utc_tomorrow->format('Y-m-d H:i:s'),$as_tomorrow->format('Y-m-d H:i:s'));
178
-
179
- $utc_tomorrow = new ActionScheduler_DateTime('1st January 2024', new DateTimeZone('UTC'));
180
- $as_tomorrow = as_get_datetime_object('1st January 2024');
181
-
182
- $this->assertEquals($utc_tomorrow->format('Y-m-d H:i:s'),$as_tomorrow->format('Y-m-d H:i:s'));
183
- }
184
-
185
- public function test_as_get_datetime_object_timezone() {
186
-
187
- $timezone_au = 'Australia/Brisbane';
188
- $timezone_default = date_default_timezone_get();
189
-
190
- date_default_timezone_set( $timezone_au );
191
-
192
- $au_now = new ActionScheduler_DateTime(null);
193
- $as_now = as_get_datetime_object();
194
-
195
- // Make sure they're for the same time
196
- $this->assertEquals($au_now->getTimestamp(),$as_now->getTimestamp());
197
-
198
- // But not in the same timezone, as $as_now should be using UTC
199
- $this->assertNotEquals($au_now->format('Y-m-d H:i:s'),$as_now->format('Y-m-d H:i:s'));
200
-
201
- $au_now = new ActionScheduler_DateTime(null);
202
- $as_au_now = as_get_datetime_object();
203
-
204
- $this->assertEquals($au_now->getTimestamp(),$as_now->getTimestamp());
205
-
206
- // But not in the same timezone, as $as_now should be using UTC
207
- $this->assertNotEquals($au_now->format('Y-m-d H:i:s'),$as_now->format('Y-m-d H:i:s'));
208
-
209
- // Just in cases
210
- date_default_timezone_set( $timezone_default );
211
- }
212
-
213
- public function test_as_get_datetime_object_type() {
214
- $f = 'Y-m-d H:i:s';
215
- $now = as_get_datetime_object();
216
- $this->assertInstanceOf( 'ActionScheduler_DateTime', $now );
217
-
218
- $dateTime = new DateTime( 'now', new DateTimeZone( 'UTC' ) );
219
- $asDateTime = as_get_datetime_object( $dateTime );
220
- $this->assertEquals( $dateTime->format( $f ), $asDateTime->format( $f ) );
221
- }
222
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/procedural_api/wc_get_scheduled_actions_Test.php DELETED
@@ -1,100 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class as_get_scheduled_actions_Test
5
- */
6
- class as_get_scheduled_actions_Test extends ActionScheduler_UnitTestCase {
7
- private $hooks = array();
8
- private $args = array();
9
- private $groups = array();
10
-
11
- public function setUp() {
12
- parent::setUp();
13
-
14
- $store = ActionScheduler::store();
15
-
16
- for ( $i = 0 ; $i < 10 ; $i++ ) {
17
- $this->hooks[$i] = md5(rand());
18
- $this->args[$i] = md5(rand());
19
- $this->groups[$i] = md5(rand());
20
- }
21
-
22
- for ( $i = 0 ; $i < 10 ; $i++ ) {
23
- for ( $j = 0 ; $j < 10 ; $j++ ) {
24
- $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( $j - 3 . 'days') );
25
- $group = $this->groups[ ( $i + $j ) % 10 ];
26
- $action = new ActionScheduler_Action( $this->hooks[$i], array($this->args[$j]), $schedule, $group );
27
- $store->save_action( $action );
28
- }
29
- }
30
- }
31
-
32
- public function test_date_queries() {
33
- $actions = as_get_scheduled_actions(array(
34
- 'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')),
35
- 'per_page' => -1,
36
- ), 'ids');
37
- $this->assertCount(30, $actions);
38
-
39
- $actions = as_get_scheduled_actions(array(
40
- 'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')),
41
- 'date_compare' => '>=',
42
- 'per_page' => -1,
43
- ), 'ids');
44
- $this->assertCount(70, $actions);
45
- }
46
-
47
- public function test_hook_queries() {
48
- $actions = as_get_scheduled_actions(array(
49
- 'hook' => $this->hooks[2],
50
- 'per_page' => -1,
51
- ), 'ids');
52
- $this->assertCount(10, $actions);
53
-
54
- $actions = as_get_scheduled_actions(array(
55
- 'hook' => $this->hooks[2],
56
- 'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')),
57
- 'per_page' => -1,
58
- ), 'ids');
59
- $this->assertCount(3, $actions);
60
- }
61
-
62
- public function test_args_queries() {
63
- $actions = as_get_scheduled_actions(array(
64
- 'args' => array($this->args[5]),
65
- 'per_page' => -1,
66
- ), 'ids');
67
- $this->assertCount(10, $actions);
68
-
69
- $actions = as_get_scheduled_actions(array(
70
- 'args' => array($this->args[5]),
71
- 'hook' => $this->hooks[3],
72
- 'per_page' => -1,
73
- ), 'ids');
74
- $this->assertCount(1, $actions);
75
-
76
- $actions = as_get_scheduled_actions(array(
77
- 'args' => array($this->args[5]),
78
- 'hook' => $this->hooks[3],
79
- 'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')),
80
- 'per_page' => -1,
81
- ), 'ids');
82
- $this->assertCount(0, $actions);
83
- }
84
-
85
- public function test_group_queries() {
86
- $actions = as_get_scheduled_actions(array(
87
- 'group' => $this->groups[1],
88
- 'per_page' => -1,
89
- ), 'ids');
90
- $this->assertCount(10, $actions);
91
-
92
- $actions = as_get_scheduled_actions(array(
93
- 'group' => $this->groups[1],
94
- 'hook' => $this->hooks[9],
95
- 'per_page' => -1,
96
- ), 'ids');
97
- $this->assertCount(1, $actions);
98
- }
99
- }
100
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/runner/ActionScheduler_QueueCleaner_Test.php DELETED
@@ -1,151 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_QueueCleaner_Test
5
- */
6
- class ActionScheduler_QueueCleaner_Test extends ActionScheduler_UnitTestCase {
7
-
8
- public function test_delete_old_actions() {
9
- $store = ActionScheduler::store();
10
- $runner = new ActionScheduler_QueueRunner( $store );
11
-
12
- $random = md5(rand());
13
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
14
-
15
- $created_actions = array();
16
- for ( $i = 0 ; $i < 5 ; $i++ ) {
17
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
18
- $created_actions[] = $store->save_action( $action );
19
- }
20
-
21
- $runner->run();
22
-
23
- add_filter( 'action_scheduler_retention_period', '__return_zero' ); // delete any finished job
24
- $cleaner = new ActionScheduler_QueueCleaner( $store );
25
- $cleaner->delete_old_actions();
26
- remove_filter( 'action_scheduler_retention_period', '__return_zero' );
27
-
28
- foreach ( $created_actions as $action_id ) {
29
- $action = $store->fetch_action($action_id);
30
- $this->assertFalse($action->is_finished()); // it's a NullAction
31
- }
32
- }
33
-
34
- public function test_delete_canceled_actions() {
35
- $store = ActionScheduler::store();
36
-
37
- $random = md5(rand());
38
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
39
-
40
- $created_actions = array();
41
- for ( $i = 0 ; $i < 5 ; $i++ ) {
42
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
43
- $action_id = $store->save_action( $action );
44
- $store->cancel_action( $action_id );
45
- $created_actions[] = $action_id;
46
- }
47
-
48
- // track the actions that are deleted
49
- $mock_action = new MockAction();
50
- add_action( 'action_scheduler_deleted_action', array( $mock_action, 'action' ), 10, 1 );
51
- add_filter( 'action_scheduler_retention_period', '__return_zero' ); // delete any finished job
52
-
53
- $cleaner = new ActionScheduler_QueueCleaner( $store );
54
- $cleaner->delete_old_actions();
55
-
56
- remove_filter( 'action_scheduler_retention_period', '__return_zero' );
57
- remove_action( 'action_scheduler_deleted_action', array( $mock_action, 'action' ), 10 );
58
-
59
- $deleted_actions = array_map( 'reset', $mock_action->get_args() );
60
- $this->assertEqualSets( $created_actions, $deleted_actions );
61
- }
62
-
63
- public function test_do_not_delete_recent_actions() {
64
- $store = ActionScheduler::store();
65
- $runner = new ActionScheduler_QueueRunner( $store );
66
-
67
- $random = md5(rand());
68
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
69
-
70
- $created_actions = array();
71
- for ( $i = 0 ; $i < 5 ; $i++ ) {
72
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
73
- $created_actions[] = $store->save_action( $action );
74
- }
75
-
76
- $runner->run();
77
-
78
- $cleaner = new ActionScheduler_QueueCleaner( $store );
79
- $cleaner->delete_old_actions();
80
-
81
- foreach ( $created_actions as $action_id ) {
82
- $action = $store->fetch_action($action_id);
83
- $this->assertTrue($action->is_finished()); // It's a FinishedAction
84
- }
85
- }
86
-
87
- public function test_reset_unrun_actions() {
88
- $store = ActionScheduler::store();
89
-
90
- $random = md5(rand());
91
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
92
-
93
- $created_actions = array();
94
- for ( $i = 0 ; $i < 5 ; $i++ ) {
95
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
96
- $created_actions[] = $store->save_action( $action );
97
- }
98
-
99
- $store->stake_claim(10);
100
-
101
- // don't actually process the jobs, to simulate a request that timed out
102
-
103
- add_filter( 'action_scheduler_timeout_period', '__return_zero' ); // delete any finished job
104
- $cleaner = new ActionScheduler_QueueCleaner( $store );
105
- $cleaner->reset_timeouts();
106
-
107
- remove_filter( 'action_scheduler_timeout_period', '__return_zero' );
108
-
109
- $claim = $store->stake_claim(10);
110
- $this->assertEqualSets($created_actions, $claim->get_actions());
111
- }
112
-
113
- public function test_do_not_reset_failed_action() {
114
- $store = ActionScheduler::store();
115
-
116
- $random = md5(rand());
117
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
118
-
119
- $created_actions = array();
120
- for ( $i = 0 ; $i < 5 ; $i++ ) {
121
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
122
- $created_actions[] = $store->save_action( $action );
123
- }
124
-
125
- $claim = $store->stake_claim(10);
126
- foreach ( $claim->get_actions() as $action_id ) {
127
- // simulate the first action interrupted by an uncatchable fatal error
128
- $store->log_execution( $action_id );
129
- break;
130
- }
131
-
132
- add_filter( 'action_scheduler_timeout_period', '__return_zero' ); // delete any finished job
133
- $cleaner = new ActionScheduler_QueueCleaner( $store );
134
- $cleaner->reset_timeouts();
135
- remove_filter( 'action_scheduler_timeout_period', '__return_zero' );
136
-
137
- $new_claim = $store->stake_claim(10);
138
- $this->assertCount( 4, $new_claim->get_actions() );
139
-
140
- add_filter( 'action_scheduler_failure_period', '__return_zero' );
141
- $cleaner->mark_failures();
142
- remove_filter( 'action_scheduler_failure_period', '__return_zero' );
143
-
144
- $failed = $store->query_actions(array('status' => ActionScheduler_Store::STATUS_FAILED));
145
- $this->assertEquals( $created_actions[0], $failed[0] );
146
- $this->assertCount( 1, $failed );
147
-
148
-
149
- }
150
- }
151
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/runner/ActionScheduler_QueueRunner_Test.php DELETED
@@ -1,262 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_QueueRunner_Test
5
- * @group runners
6
- */
7
- class ActionScheduler_QueueRunner_Test extends ActionScheduler_UnitTestCase {
8
- public function test_create_runner() {
9
- $store = ActionScheduler::store();
10
- $runner = new ActionScheduler_QueueRunner( $store );
11
- $actions_run = $runner->run();
12
-
13
- $this->assertEquals( 0, $actions_run );
14
- }
15
-
16
- public function test_run() {
17
- $store = ActionScheduler::store();
18
- $runner = new ActionScheduler_QueueRunner( $store );
19
-
20
- $mock = new MockAction();
21
- $random = md5(rand());
22
- add_action( $random, array( $mock, 'action' ) );
23
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
24
-
25
- for ( $i = 0 ; $i < 5 ; $i++ ) {
26
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
27
- $store->save_action( $action );
28
- }
29
-
30
- $actions_run = $runner->run();
31
-
32
- remove_action( $random, array( $mock, 'action' ) );
33
-
34
- $this->assertEquals( 5, $mock->get_call_count() );
35
- $this->assertEquals( 5, $actions_run );
36
- }
37
-
38
- public function test_run_with_future_actions() {
39
- $store = ActionScheduler::store();
40
- $runner = new ActionScheduler_QueueRunner( $store );
41
-
42
- $mock = new MockAction();
43
- $random = md5(rand());
44
- add_action( $random, array( $mock, 'action' ) );
45
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago'));
46
-
47
- for ( $i = 0 ; $i < 3 ; $i++ ) {
48
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
49
- $store->save_action( $action );
50
- }
51
-
52
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('tomorrow'));
53
- for ( $i = 0 ; $i < 3 ; $i++ ) {
54
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
55
- $store->save_action( $action );
56
- }
57
-
58
- $actions_run = $runner->run();
59
-
60
- remove_action( $random, array( $mock, 'action' ) );
61
-
62
- $this->assertEquals( 3, $mock->get_call_count() );
63
- $this->assertEquals( 3, $actions_run );
64
- }
65
-
66
- public function test_completed_action_status() {
67
- $store = ActionScheduler::store();
68
- $runner = new ActionScheduler_QueueRunner( $store );
69
-
70
- $random = md5(rand());
71
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('12 hours ago'));
72
-
73
- $action = new ActionScheduler_Action( $random, array(), $schedule );
74
- $action_id = $store->save_action( $action );
75
-
76
- $runner->run();
77
-
78
- $finished_action = $store->fetch_action( $action_id );
79
-
80
- $this->assertTrue( $finished_action->is_finished() );
81
- }
82
-
83
- public function test_next_instance_of_action() {
84
- $store = ActionScheduler::store();
85
- $runner = new ActionScheduler_QueueRunner( $store );
86
-
87
- $random = md5(rand());
88
- $schedule = new ActionScheduler_IntervalSchedule(as_get_datetime_object('12 hours ago'), DAY_IN_SECONDS);
89
-
90
- $action = new ActionScheduler_Action( $random, array(), $schedule );
91
- $store->save_action( $action );
92
-
93
- $runner->run();
94
-
95
- $claim = $store->stake_claim(10, as_get_datetime_object((DAY_IN_SECONDS - 60).' seconds'));
96
- $this->assertCount(0, $claim->get_actions());
97
-
98
- $claim = $store->stake_claim(10, as_get_datetime_object(DAY_IN_SECONDS.' seconds'));
99
- $actions = $claim->get_actions();
100
- $this->assertCount(1, $actions);
101
-
102
- $action_id = reset($actions);
103
- $new_action = $store->fetch_action($action_id);
104
-
105
-
106
- $this->assertEquals( $random, $new_action->get_hook() );
107
- $this->assertEquals( $schedule->next( as_get_datetime_object() )->getTimestamp(), $new_action->get_schedule()->next( as_get_datetime_object() )->getTimestamp(), '', 1 );
108
- }
109
-
110
- public function test_hooked_into_wp_cron() {
111
- $next = wp_next_scheduled( ActionScheduler_QueueRunner::WP_CRON_HOOK );
112
- $this->assertNotEmpty($next);
113
- }
114
-
115
- public function test_batch_count_limit() {
116
- $store = ActionScheduler::store();
117
- $runner = new ActionScheduler_QueueRunner( $store );
118
-
119
- $mock = new MockAction();
120
- $random = md5(rand());
121
- add_action( $random, array( $mock, 'action' ) );
122
- $schedule = new ActionScheduler_SimpleSchedule(new ActionScheduler_DateTime('1 day ago'));
123
-
124
- for ( $i = 0 ; $i < 30 ; $i++ ) {
125
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
126
- $store->save_action( $action );
127
- }
128
-
129
- $claims = array();
130
-
131
- for ( $i = 0 ; $i < 5 ; $i++ ) {
132
- $claims[] = $store->stake_claim( 5 );
133
- }
134
-
135
- $actions_run = $runner->run();
136
-
137
-
138
- $this->assertEquals( 0, $mock->get_call_count() );
139
- $this->assertEquals( 0, $actions_run );
140
-
141
- $first = reset($claims);
142
- $store->release_claim( $first );
143
-
144
- $actions_run = $runner->run();
145
- $this->assertEquals( 10, $mock->get_call_count() );
146
- $this->assertEquals( 10, $actions_run );
147
-
148
- remove_action( $random, array( $mock, 'action' ) );
149
- }
150
-
151
- public function test_changing_batch_count_limit() {
152
- $store = ActionScheduler::store();
153
- $runner = new ActionScheduler_QueueRunner( $store );
154
-
155
- $random = md5(rand());
156
- $schedule = new ActionScheduler_SimpleSchedule(new ActionScheduler_DateTime('1 day ago'));
157
-
158
- for ( $i = 0 ; $i < 30 ; $i++ ) {
159
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
160
- $store->save_action( $action );
161
- }
162
-
163
- $claims = array();
164
-
165
- for ( $i = 0 ; $i < 5 ; $i++ ) {
166
- $claims[] = $store->stake_claim( 5 );
167
- }
168
-
169
- $mock1 = new MockAction();
170
- add_action( $random, array( $mock1, 'action' ) );
171
- $actions_run = $runner->run();
172
- remove_action( $random, array( $mock1, 'action' ) );
173
-
174
- $this->assertEquals( 0, $mock1->get_call_count() );
175
- $this->assertEquals( 0, $actions_run );
176
-
177
-
178
- add_filter( 'action_scheduler_queue_runner_concurrent_batches', array( $this, 'return_6' ) );
179
-
180
- $mock2 = new MockAction();
181
- add_action( $random, array( $mock2, 'action' ) );
182
- $actions_run = $runner->run();
183
- remove_action( $random, array( $mock2, 'action' ) );
184
-
185
- $this->assertEquals( 5, $mock2->get_call_count() );
186
- $this->assertEquals( 5, $actions_run );
187
-
188
- remove_filter( 'action_scheduler_queue_runner_concurrent_batches', array( $this, 'return_6' ) );
189
-
190
- for ( $i = 0 ; $i < 5 ; $i++ ) { // to make up for the actions we just processed
191
- $action = new ActionScheduler_Action( $random, array($random), $schedule );
192
- $store->save_action( $action );
193
- }
194
-
195
- $mock3 = new MockAction();
196
- add_action( $random, array( $mock3, 'action' ) );
197
- $actions_run = $runner->run();
198
- remove_action( $random, array( $mock3, 'action' ) );
199
-
200
- $this->assertEquals( 0, $mock3->get_call_count() );
201
- $this->assertEquals( 0, $actions_run );
202
-
203
- remove_filter( 'action_scheduler_queue_runner_concurrent_batches', array( $this, 'return_6' ) );
204
- }
205
-
206
- public function return_6() {
207
- return 6;
208
- }
209
-
210
- public function test_store_fetch_action_failure_schedule_next_instance() {
211
- $random = md5( rand() );
212
- $schedule = new ActionScheduler_IntervalSchedule( as_get_datetime_object( '12 hours ago' ), DAY_IN_SECONDS );
213
- $action = new ActionScheduler_Action( $random, array(), $schedule );
214
- $action_id = ActionScheduler::store()->save_action( $action );
215
-
216
- // Set up a mock store that will throw an exception when fetching actions.
217
- $store = $this
218
- ->getMockBuilder( 'ActionScheduler_wpPostStore' )
219
- ->setMethods( array( 'fetch_action' ) )
220
- ->getMock();
221
- $store
222
- ->method( 'fetch_action' )
223
- ->with( $action_id )
224
- ->will( $this->throwException( new Exception() ) );
225
-
226
- // Set up a mock queue runner to verify that schedule_next_instance()
227
- // isn't called for an undefined $action.
228
- $runner = $this
229
- ->getMockBuilder( 'ActionScheduler_QueueRunner' )
230
- ->setConstructorArgs( array( $store ) )
231
- ->setMethods( array( 'schedule_next_instance' ) )
232
- ->getMock();
233
- $runner
234
- ->expects( $this->never() )
235
- ->method( 'schedule_next_instance' );
236
-
237
- $runner->run();
238
-
239
- // Set up a mock store that will throw an exception when fetching actions.
240
- $store2 = $this
241
- ->getMockBuilder( 'ActionScheduler_wpPostStore' )
242
- ->setMethods( array( 'fetch_action' ) )
243
- ->getMock();
244
- $store2
245
- ->method( 'fetch_action' )
246
- ->with( $action_id )
247
- ->willReturn( null );
248
-
249
- // Set up a mock queue runner to verify that schedule_next_instance()
250
- // isn't called for an undefined $action.
251
- $runner2 = $this
252
- ->getMockBuilder( 'ActionScheduler_QueueRunner' )
253
- ->setConstructorArgs( array( $store ) )
254
- ->setMethods( array( 'schedule_next_instance' ) )
255
- ->getMock();
256
- $runner2
257
- ->expects( $this->never() )
258
- ->method( 'schedule_next_instance' );
259
-
260
- $runner2->run();
261
- }
262
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/schedules/ActionScheduler_CronSchedule_Test.php DELETED
@@ -1,45 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_CronSchedule_Test
5
- * @group schedules
6
- */
7
- class ActionScheduler_CronSchedule_Test extends ActionScheduler_UnitTestCase {
8
- public function test_creation() {
9
- $time = as_get_datetime_object('tomorrow');
10
- $cron = CronExpression::factory('@daily');
11
- $schedule = new ActionScheduler_CronSchedule(as_get_datetime_object(), $cron);
12
- $this->assertEquals( $time, $schedule->next() );
13
- }
14
-
15
- public function test_next() {
16
- $time = as_get_datetime_object('2013-06-14');
17
- $cron = CronExpression::factory('@daily');
18
- $schedule = new ActionScheduler_CronSchedule($time, $cron);
19
- $this->assertEquals( as_get_datetime_object('tomorrow'), $schedule->next( as_get_datetime_object() ) );
20
- }
21
-
22
- public function test_is_recurring() {
23
- $schedule = new ActionScheduler_CronSchedule(as_get_datetime_object('2013-06-14'), CronExpression::factory('@daily'));
24
- $this->assertTrue( $schedule->is_recurring() );
25
- }
26
-
27
- public function test_cron_format() {
28
- $time = as_get_datetime_object('2014-01-01');
29
- $cron = CronExpression::factory('0 0 10 10 *');
30
- $schedule = new ActionScheduler_CronSchedule($time, $cron);
31
- $this->assertEquals( as_get_datetime_object('2014-10-10'), $schedule->next() );
32
-
33
- $cron = CronExpression::factory('0 0 L 1/2 *');
34
- $schedule = new ActionScheduler_CronSchedule($time, $cron);
35
- $this->assertEquals( as_get_datetime_object('2014-01-31'), $schedule->next() );
36
- $this->assertEquals( as_get_datetime_object('2014-07-31'), $schedule->next( as_get_datetime_object('2014-06-01') ) );
37
- $this->assertEquals( as_get_datetime_object('2028-11-30'), $schedule->next( as_get_datetime_object('2028-11-01') ) );
38
-
39
- $cron = CronExpression::factory('30 14 * * MON#3 *');
40
- $schedule = new ActionScheduler_CronSchedule($time, $cron);
41
- $this->assertEquals( as_get_datetime_object('2014-01-20 14:30:00'), $schedule->next() );
42
- $this->assertEquals( as_get_datetime_object('2014-05-19 14:30:00'), $schedule->next( as_get_datetime_object('2014-05-01') ) );
43
- }
44
- }
45
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/schedules/ActionScheduler_IntervalSchedule_Test.php DELETED
@@ -1,28 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_IntervalSchedule_Test
5
- * @group schedules
6
- */
7
- class ActionScheduler_IntervalSchedule_Test extends ActionScheduler_UnitTestCase {
8
- public function test_creation() {
9
- $time = as_get_datetime_object();
10
- $schedule = new ActionScheduler_IntervalSchedule($time, HOUR_IN_SECONDS);
11
- $this->assertEquals( $time, $schedule->next() );
12
- }
13
-
14
- public function test_next() {
15
- $now = time();
16
- $start = $now - 30;
17
- $schedule = new ActionScheduler_IntervalSchedule( as_get_datetime_object("@$start"), MINUTE_IN_SECONDS );
18
- $this->assertEquals( $start, $schedule->next()->getTimestamp() );
19
- $this->assertEquals( $now + MINUTE_IN_SECONDS, $schedule->next(as_get_datetime_object())->getTimestamp() );
20
- $this->assertEquals( $start, $schedule->next(as_get_datetime_object("@$start"))->getTimestamp() );
21
- }
22
-
23
- public function test_is_recurring() {
24
- $start = time() - 30;
25
- $schedule = new ActionScheduler_IntervalSchedule( as_get_datetime_object("@$start"), MINUTE_IN_SECONDS );
26
- $this->assertTrue( $schedule->is_recurring() );
27
- }
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/schedules/ActionScheduler_NullSchedule_Test.php DELETED
@@ -1,18 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_NullSchedule_Test
5
- * @group schedules
6
- */
7
- class ActionScheduler_NullSchedule_Test extends ActionScheduler_UnitTestCase {
8
- public function test_null_schedule() {
9
- $schedule = new ActionScheduler_NullSchedule();
10
- $this->assertNull( $schedule->next() );
11
- }
12
-
13
- public function test_is_recurring() {
14
- $schedule = new ActionScheduler_NullSchedule();
15
- $this->assertFalse( $schedule->is_recurring() );
16
- }
17
- }
18
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/schedules/ActionScheduler_SimpleSchedule_Test.php DELETED
@@ -1,37 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_SimpleSchedule_Test
5
- * @group schedules
6
- */
7
- class ActionScheduler_SimpleSchedule_Test extends ActionScheduler_UnitTestCase {
8
- public function test_creation() {
9
- $time = as_get_datetime_object();
10
- $schedule = new ActionScheduler_SimpleSchedule($time);
11
- $this->assertEquals( $time, $schedule->next() );
12
- }
13
-
14
- public function test_past_date() {
15
- $time = as_get_datetime_object('-1 day');
16
- $schedule = new ActionScheduler_SimpleSchedule($time);
17
- $this->assertEquals( $time, $schedule->next() );
18
- }
19
-
20
- public function test_future_date() {
21
- $time = as_get_datetime_object('+1 day');
22
- $schedule = new ActionScheduler_SimpleSchedule($time);
23
- $this->assertEquals( $time, $schedule->next() );
24
- }
25
-
26
- public function test_grace_period_for_next() {
27
- $time = as_get_datetime_object('3 seconds ago');
28
- $schedule = new ActionScheduler_SimpleSchedule($time);
29
- $this->assertEquals( $time, $schedule->next() );
30
- }
31
-
32
- public function test_is_recurring() {
33
- $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('+1 day'));
34
- $this->assertFalse( $schedule->is_recurring() );
35
- }
36
- }
37
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/phpunit/versioning/ActionScheduler_Versions_Test.php DELETED
@@ -1,43 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Class ActionScheduler_Versions_Test
5
- */
6
- class ActionScheduler_Versions_Test extends ActionScheduler_UnitTestCase {
7
- public function test_register_version() {
8
- $versions = new ActionScheduler_Versions();
9
- $versions->register('1.0-dev', 'callback_1_dot_0_dev');
10
- $versions->register('1.0', 'callback_1_dot_0');
11
-
12
- $registered = $versions->get_versions();
13
-
14
- $this->assertArrayHasKey( '1.0-dev', $registered );
15
- $this->assertArrayHasKey( '1.0', $registered );
16
- $this->assertCount( 2, $registered );
17
-
18
- $this->assertEquals( 'callback_1_dot_0_dev', $registered['1.0-dev'] );
19
- }
20
-
21
- public function test_duplicate_version() {
22
- $versions = new ActionScheduler_Versions();
23
- $versions->register('1.0', 'callback_1_dot_0_a');
24
- $versions->register('1.0', 'callback_1_dot_0_b');
25
-
26
- $registered = $versions->get_versions();
27
-
28
- $this->assertArrayHasKey( '1.0', $registered );
29
- $this->assertCount( 1, $registered );
30
- }
31
-
32
- public function test_latest_version() {
33
- $versions = new ActionScheduler_Versions();
34
- $this->assertEquals('__return_null', $versions->latest_version_callback() );
35
- $versions->register('1.2', 'callback_1_dot_2');
36
- $versions->register('1.3', 'callback_1_dot_3');
37
- $versions->register('1.0', 'callback_1_dot_0');
38
-
39
- $this->assertEquals( '1.3', $versions->latest_version() );
40
- $this->assertEquals( 'callback_1_dot_3', $versions->latest_version_callback() );
41
- }
42
- }
43
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/travis/setup.sh DELETED
@@ -1,38 +0,0 @@
1
- #!/bin/sh
2
-
3
- # WordPress test setup script for Travis CI
4
- #
5
- # Author: Benjamin J. Balter ( ben@balter.com | ben.balter.com )
6
- # License: GPL3
7
-
8
- export WP_CORE_DIR=/tmp/wordpress
9
- export WP_TESTS_DIR=/tmp/wordpress-tests/tests/phpunit
10
-
11
- if [[ "$1" = "5.6" || "$1" > "5.6" ]]
12
- then
13
- wget -c https://phar.phpunit.de/phpunit-5.7.phar
14
- chmod +x phpunit-5.7.phar
15
- mv phpunit-5.7.phar `which phpunit`
16
- fi
17
-
18
- plugin_slug=$(basename $(pwd))
19
- plugin_dir=$WP_CORE_DIR/wp-content/plugins/$plugin_slug
20
-
21
- # Init database
22
- mysql -e 'CREATE DATABASE wordpress_test;' -uroot
23
-
24
- # Grab specified version of WordPress from github
25
- wget -nv -O /tmp/wordpress.tar.gz https://github.com/WordPress/WordPress/tarball/$WP_VERSION
26
- mkdir -p $WP_CORE_DIR
27
- tar --strip-components=1 -zxmf /tmp/wordpress.tar.gz -C $WP_CORE_DIR
28
-
29
- # Grab testing framework
30
- svn co --quiet https://develop.svn.wordpress.org/tags/$WP_VERSION/ /tmp/wordpress-tests
31
-
32
- # Put various components in proper folders
33
- cp tests/travis/wp-tests-config.php $WP_TESTS_DIR/wp-tests-config.php
34
-
35
- cd ..
36
- mv $plugin_slug $plugin_dir
37
-
38
- cd $plugin_dir
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/lib/action-scheduler/tests/travis/wp-tests-config.php DELETED
@@ -1,38 +0,0 @@
1
- <?php
2
-
3
- /* Path to the WordPress codebase you'd like to test. Add a backslash in the end. */
4
- define( 'ABSPATH', getenv( 'WP_CORE_DIR' ) . '/' );
5
-
6
- // Test with multisite enabled
7
- define( 'WP_TESTS_MULTISITE', (bool) getenv( 'WP_MULTISITE' ) );
8
-
9
- // Force known bugs
10
- // define( 'WP_TESTS_FORCE_KNOWN_BUGS', true );
11
-
12
- // Test with WordPress debug mode on
13
- define( 'WP_DEBUG', true );
14
-
15
- // ** MySQL settings ** //
16
-
17
- // This configuration file will be used by the copy of WordPress being tested.
18
- // wordpress/wp-config.php will be ignored.
19
-
20
- // WARNING WARNING WARNING!
21
- // These tests will DROP ALL TABLES in the database with the prefix named below.
22
- // DO NOT use a production database or one that is shared with something else.
23
-
24
- define( 'DB_NAME', 'wordpress_test' );
25
- define( 'DB_USER', 'root' );
26
- define( 'DB_PASSWORD', '' );
27
- define( 'DB_HOST', 'localhost' );
28
- define( 'DB_CHARSET', 'utf8' );
29
- define( 'DB_COLLATE', '' );
30
-
31
- define( 'WP_TESTS_DOMAIN', 'example.org' );
32
- define( 'WP_TESTS_EMAIL', 'admin@example.org' );
33
- define( 'WP_TESTS_TITLE', 'Test Blog' );
34
-
35
- define( 'WP_PHP_BINARY', 'php' );
36
-
37
- define( 'WPLANG', '' );
38
- $table_prefix = 'wptests_';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -6,7 +6,7 @@ Requires at least: 4.7.0
6
  Tested up to: 5.2.2
7
  WC tested up to: 3.7.0
8
  Requires PHP: 5.6
9
- Stable tag: 2.3.2
10
  License: GPLv3
11
 
12
  Simple and flexible Mailchimp integration for WooCommerce.
@@ -119,6 +119,9 @@ Also, if you enjoy using the software [we'd love it if you could give us a revie
119
 
120
  == Changelog ==
121
 
 
 
 
122
  #### 2.3.2 - August 27, 2019
123
  - Upgrade ActionScheduler to 2.2.5
124
  - Fix encoding of unicode/international characters.
6
  Tested up to: 5.2.2
7
  WC tested up to: 3.7.0
8
  Requires PHP: 5.6
9
+ Stable tag: 2.3.3
10
  License: GPLv3
11
 
12
  Simple and flexible Mailchimp integration for WooCommerce.
119
 
120
  == Changelog ==
121
 
122
+ #### 2.3.3 - August 29, 2019
123
+ - Fix ActionScheduler 2.2.5 version.
124
+
125
  #### 2.3.2 - August 27, 2019
126
  - Upgrade ActionScheduler to 2.2.5
127
  - Fix encoding of unicode/international characters.
woocommerce-mailchimp.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: WooCommerce Mailchimp provides simple and flexible Mailchimp integration for WooCommerce.
6
  * Author: Saint Systems
7
  * Author URI: https://www.saintsystems.com
8
- * Version: 2.3.2
9
  * WC tested up to: 3.7.0
10
  * Text Domain: woocommerce-mailchimp
11
  * Domain Path: languages
5
  * Description: WooCommerce Mailchimp provides simple and flexible Mailchimp integration for WooCommerce.
6
  * Author: Saint Systems
7
  * Author URI: https://www.saintsystems.com
8
+ * Version: 2.3.3
9
  * WC tested up to: 3.7.0
10
  * Text Domain: woocommerce-mailchimp
11
  * Domain Path: languages