PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.35.1
MailPoet – Newsletters, Email Marketing, and Automation v5.35.1
5.36.1 5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor / woocommerce / action-scheduler / lib / cron-expression / CronExpression.php
mailpoet / vendor / woocommerce / action-scheduler / lib / cron-expression Last commit date
CronExpression.php 1 year ago CronExpression_AbstractField.php 4 years ago CronExpression_DayOfMonthField.php 4 years ago CronExpression_DayOfWeekField.php 4 years ago CronExpression_FieldFactory.php 4 years ago CronExpression_FieldInterface.php 4 years ago CronExpression_HoursField.php 4 years ago CronExpression_MinutesField.php 4 years ago CronExpression_MonthField.php 4 years ago CronExpression_YearField.php 4 years ago index.php 3 years ago
CronExpression.php
152 lines
1 <?php
2 if (!defined('ABSPATH')) exit;
3 class CronExpression
4 {
5 const MINUTE = 0;
6 const HOUR = 1;
7 const DAY = 2;
8 const MONTH = 3;
9 const WEEKDAY = 4;
10 const YEAR = 5;
11 private $cronParts;
12 private $fieldFactory;
13 private static $order = array(self::YEAR, self::MONTH, self::DAY, self::WEEKDAY, self::HOUR, self::MINUTE);
14 public static function factory($expression, ?CronExpression_FieldFactory $fieldFactory = null)
15 {
16 $mappings = array(
17 '@yearly' => '0 0 1 1 *',
18 '@annually' => '0 0 1 1 *',
19 '@monthly' => '0 0 1 * *',
20 '@weekly' => '0 0 * * 0',
21 '@daily' => '0 0 * * *',
22 '@hourly' => '0 * * * *'
23 );
24 if (isset($mappings[$expression])) {
25 $expression = $mappings[$expression];
26 }
27 return new self($expression, $fieldFactory ? $fieldFactory : new CronExpression_FieldFactory());
28 }
29 public function __construct($expression, CronExpression_FieldFactory $fieldFactory)
30 {
31 $this->fieldFactory = $fieldFactory;
32 $this->setExpression($expression);
33 }
34 public function setExpression($value)
35 {
36 $this->cronParts = preg_split('/\s/', $value, -1, PREG_SPLIT_NO_EMPTY);
37 if (count($this->cronParts) < 5) {
38 throw new InvalidArgumentException(
39 $value . ' is not a valid CRON expression'
40 );
41 }
42 foreach ($this->cronParts as $position => $part) {
43 $this->setPart($position, $part);
44 }
45 return $this;
46 }
47 public function setPart($position, $value)
48 {
49 if (!$this->fieldFactory->getField($position)->validate($value)) {
50 throw new InvalidArgumentException(
51 'Invalid CRON field value ' . $value . ' as position ' . $position
52 );
53 }
54 $this->cronParts[$position] = $value;
55 return $this;
56 }
57 public function getNextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false)
58 {
59 return $this->getRunDate($currentTime, $nth, false, $allowCurrentDate);
60 }
61 public function getPreviousRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false)
62 {
63 return $this->getRunDate($currentTime, $nth, true, $allowCurrentDate);
64 }
65 public function getMultipleRunDates($total, $currentTime = 'now', $invert = false, $allowCurrentDate = false)
66 {
67 $matches = array();
68 for ($i = 0; $i < max(0, $total); $i++) {
69 $matches[] = $this->getRunDate($currentTime, $i, $invert, $allowCurrentDate);
70 }
71 return $matches;
72 }
73 public function getExpression($part = null)
74 {
75 if (null === $part) {
76 return implode(' ', $this->cronParts);
77 } elseif (array_key_exists($part, $this->cronParts)) {
78 return $this->cronParts[$part];
79 }
80 return null;
81 }
82 public function __toString()
83 {
84 return $this->getExpression();
85 }
86 public function isDue($currentTime = 'now')
87 {
88 if ('now' === $currentTime) {
89 $currentDate = date('Y-m-d H:i');
90 $currentTime = strtotime($currentDate);
91 } elseif ($currentTime instanceof DateTime) {
92 $currentDate = $currentTime->format('Y-m-d H:i');
93 $currentTime = strtotime($currentDate);
94 } else {
95 $currentTime = new DateTime($currentTime);
96 $currentTime->setTime($currentTime->format('H'), $currentTime->format('i'), 0);
97 $currentDate = $currentTime->format('Y-m-d H:i');
98 $currentTime = (int)($currentTime->getTimestamp());
99 }
100 return $this->getNextRunDate($currentDate, 0, true)->getTimestamp() == $currentTime;
101 }
102 protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false)
103 {
104 if ($currentTime instanceof DateTime) {
105 $currentDate = $currentTime;
106 } else {
107 $currentDate = new DateTime($currentTime ? $currentTime : 'now');
108 $currentDate->setTimezone(new DateTimeZone(date_default_timezone_get()));
109 }
110 $currentDate->setTime($currentDate->format('H'), $currentDate->format('i'), 0);
111 $nextRun = clone $currentDate;
112 $nth = (int) $nth;
113 // Set a hard limit to bail on an impossible date
114 for ($i = 0; $i < 1000; $i++) {
115 foreach (self::$order as $position) {
116 $part = $this->getExpression($position);
117 if (null === $part) {
118 continue;
119 }
120 $satisfied = false;
121 // Get the field object used to validate this part
122 $field = $this->fieldFactory->getField($position);
123 // Check if this is singular or a list
124 if (strpos($part, ',') === false) {
125 $satisfied = $field->isSatisfiedBy($nextRun, $part);
126 } else {
127 foreach (array_map('trim', explode(',', $part)) as $listPart) {
128 if ($field->isSatisfiedBy($nextRun, $listPart)) {
129 $satisfied = true;
130 break;
131 }
132 }
133 }
134 // If the field is not satisfied, then start over
135 if (!$satisfied) {
136 $field->increment($nextRun, $invert);
137 continue 2;
138 }
139 }
140 // Skip this match if needed
141 if ((!$allowCurrentDate && $nextRun == $currentDate) || --$nth > -1) {
142 $this->fieldFactory->getField(0)->increment($nextRun, $invert);
143 continue;
144 }
145 return $nextRun;
146 }
147 // @codeCoverageIgnoreStart
148 throw new RuntimeException('Impossible CRON expression');
149 // @codeCoverageIgnoreEnd
150 }
151 }
152