Skip to content

Commit fc2b49a

Browse files
prepare 3.6.0 release (#127)
1 parent 0e81e28 commit fc2b49a

File tree

10 files changed

+469
-190
lines changed

10 files changed

+469
-190
lines changed

src/LaunchDarkly/FeatureFlag.php

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class FeatureFlag
2929
protected $_deleted = false;
3030
/** @var bool */
3131
protected $_trackEvents = false;
32+
/** @var bool */
33+
protected $_trackEventsFallthrough = false;
3234
/** @var int | null */
3335
protected $_debugEventsUntilDate = null;
3436
/** @var bool */
@@ -50,6 +52,7 @@ protected function __construct($key,
5052
array $variations,
5153
$deleted,
5254
$trackEvents,
55+
$trackEventsFallthrough,
5356
$debugEventsUntilDate,
5457
$clientSide)
5558
{
@@ -65,6 +68,7 @@ protected function __construct($key,
6568
$this->_variations = $variations;
6669
$this->_deleted = $deleted;
6770
$this->_trackEvents = $trackEvents;
71+
$this->_trackEventsFallthrough = $trackEventsFallthrough;
6872
$this->_debugEventsUntilDate = $debugEventsUntilDate;
6973
$this->_clientSide = $clientSide;
7074
}
@@ -85,6 +89,7 @@ public static function getDecoder()
8589
$v['variations'] ?: [],
8690
$v['deleted'],
8791
isset($v['trackEvents']) && $v['trackEvents'],
92+
isset($v['trackEventsFallthrough']) && $v['trackEventsFallthrough'],
8893
isset($v['debugEventsUntilDate']) ? $v['debugEventsUntilDate'] : null,
8994
isset($v['clientSide']) && $v['clientSide']
9095
);
@@ -104,30 +109,30 @@ public function isOn()
104109
/**
105110
* @param LDUser $user
106111
* @param FeatureRequester $featureRequester
107-
* @param bool $includeReasonsInEvents
112+
* @param Impl\EventFactory $eventFactory
108113
* @return EvalResult
109114
*/
110-
public function evaluate($user, $featureRequester, $includeReasonsInEvents = false)
115+
public function evaluate($user, $featureRequester, $eventFactory)
111116
{
112117
$prereqEvents = array();
113-
$detail = $this->evaluateInternal($user, $featureRequester, $prereqEvents, $includeReasonsInEvents);
118+
$detail = $this->evaluateInternal($user, $featureRequester, $prereqEvents, $eventFactory);
114119
return new EvalResult($detail, $prereqEvents);
115120
}
116121

117122
/**
118123
* @param LDUser $user
119124
* @param FeatureRequester $featureRequester
120125
* @param array $events
121-
* @param bool $includeReasonsInEvents
126+
* @param Impl\EventFactory $eventFactory
122127
* @return EvaluationDetail
123128
*/
124-
private function evaluateInternal($user, $featureRequester, &$events, $includeReasonsInEvents)
129+
private function evaluateInternal($user, $featureRequester, &$events, $eventFactory)
125130
{
126131
if (!$this->isOn()) {
127132
return $this->getOffValue(EvaluationReason::off());
128133
}
129134

130-
$prereqFailureReason = $this->checkPrerequisites($user, $featureRequester, $events, $includeReasonsInEvents);
135+
$prereqFailureReason = $this->checkPrerequisites($user, $featureRequester, $events, $eventFactory);
131136
if ($prereqFailureReason !== null) {
132137
return $this->getOffValue($prereqFailureReason);
133138
}
@@ -158,10 +163,10 @@ private function evaluateInternal($user, $featureRequester, &$events, $includeRe
158163
* @param LDUser $user
159164
* @param FeatureRequester $featureRequester
160165
* @param array $events
161-
* @param bool $includeReasonsInEvents
166+
* @param Impl\EventFactory $eventFactory
162167
* @return EvaluationReason|null
163168
*/
164-
private function checkPrerequisites($user, $featureRequester, &$events, $includeReasonsInEvents)
169+
private function checkPrerequisites($user, $featureRequester, &$events, $eventFactory)
165170
{
166171
if ($this->_prerequisites != null) {
167172
foreach ($this->_prerequisites as $prereq) {
@@ -172,16 +177,12 @@ private function checkPrerequisites($user, $featureRequester, &$events, $include
172177
if ($prereqFeatureFlag == null) {
173178
$prereqOk = false;
174179
} else {
175-
$prereqEvalResult = $prereqFeatureFlag->evaluateInternal($user, $featureRequester, $events, $includeReasonsInEvents);
180+
$prereqEvalResult = $prereqFeatureFlag->evaluateInternal($user, $featureRequester, $events, $eventFactory);
176181
$variation = $prereq->getVariation();
177182
if (!$prereqFeatureFlag->isOn() || $prereqEvalResult->getVariationIndex() !== $variation) {
178183
$prereqOk = false;
179184
}
180-
array_push($events, Util::newFeatureRequestEvent($prereq->getKey(), $user,
181-
$prereqEvalResult->getVariationIndex(), $prereqEvalResult->getValue(),
182-
null, $prereqFeatureFlag->getVersion(), $this->_key,
183-
($includeReasonsInEvents && $prereqEvalResult) ? $prereqEvalResult->getReason() : null
184-
));
185+
array_push($events, $eventFactory->newEvalEvent($prereqFeatureFlag, $user, $prereqEvalResult, null, $this));
185186
}
186187
} catch (EvaluationException $e) {
187188
$prereqOk = false;
@@ -258,6 +259,14 @@ public function isDeleted()
258259
return $this->_deleted;
259260
}
260261

262+
/**
263+
* @return array
264+
*/
265+
public function getRules()
266+
{
267+
return $this->_rules;
268+
}
269+
261270
/**
262271
* @return boolean
263272
*/
@@ -266,6 +275,14 @@ public function isTrackEvents()
266275
return $this->_trackEvents;
267276
}
268277

278+
/**
279+
* @return boolean
280+
*/
281+
public function isTrackEventsFallthrough()
282+
{
283+
return $this->_trackEventsFallthrough;
284+
}
285+
269286
/**
270287
* @return int | null
271288
*/
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
<?php
2+
namespace LaunchDarkly\Impl;
3+
4+
use LaunchDarkly\Util;
5+
6+
class EventFactory
7+
{
8+
/** @var boolean */
9+
private $_withReasons;
10+
11+
public function __construct($withReasons)
12+
{
13+
$this->_withReasons = $withReasons;
14+
}
15+
16+
public function newEvalEvent($flag, $user, $detail, $default, $prereqOfFlag = null)
17+
{
18+
$addExperimentData = static::isExperiment($flag, $detail->getReason());
19+
$e = array(
20+
'kind' => 'feature',
21+
'creationDate' => Util::currentTimeUnixMillis(),
22+
'key' => $flag->getKey(),
23+
'user' => $user,
24+
'variation' => $detail->getVariationIndex(),
25+
'value' => $detail->getValue(),
26+
'default' => $default,
27+
'version' => $flag->getVersion()
28+
);
29+
// the following properties are handled separately so we don't waste bandwidth on unused keys
30+
if ($addExperimentData || $flag->isTrackEvents()) {
31+
$e['trackEvents'] = true;
32+
}
33+
if ($flag->getDebugEventsUntilDate()) {
34+
$e['debugEventsUntilDate'] = $flag->getDebugEventsUntilDate();
35+
}
36+
if ($prereqOfFlag) {
37+
$e['prereqOf'] = $prereqOfFlag->getKey();
38+
}
39+
if (($addExperimentData || $this->_withReasons) && $detail->getReason()) {
40+
$e['reason'] = $detail->getReason()->jsonSerialize();
41+
}
42+
return $e;
43+
}
44+
45+
public function newDefaultEvent($flag, $user, $detail)
46+
{
47+
$e = array(
48+
'kind' => 'feature',
49+
'creationDate' => Util::currentTimeUnixMillis(),
50+
'key' => $flag->getKey(),
51+
'user' => $user,
52+
'value' => $detail->getValue(),
53+
'default' => $detail->getValue(),
54+
'version' => $flag->getVersion()
55+
);
56+
// the following properties are handled separately so we don't waste bandwidth on unused keys
57+
if ($flag->isTrackEvents()) {
58+
$e['trackEvents'] = true;
59+
}
60+
if ($flag->getDebugEventsUntilDate()) {
61+
$e['debugEventsUntilDate'] = $flag->getDebugEventsUntilDate();
62+
}
63+
if ($this->_withReasons && $detail->getReason()) {
64+
$e['reason'] = $detail->getReason()->jsonSerialize();
65+
}
66+
return $e;
67+
}
68+
69+
public function newUnknownFlagEvent($key, $user, $detail)
70+
{
71+
$e = array(
72+
'kind' => 'feature',
73+
'creationDate' => Util::currentTimeUnixMillis(),
74+
'key' => $key,
75+
'user' => $user,
76+
'value' => $detail->getValue(),
77+
'default' => $detail->getValue()
78+
);
79+
// the following properties are handled separately so we don't waste bandwidth on unused keys
80+
if ($this->_withReasons && $detail->getReason()) {
81+
$e['reason'] = $detail->getReason()->jsonSerialize();
82+
}
83+
return $e;
84+
}
85+
86+
public function newIdentifyEvent($user)
87+
{
88+
return array(
89+
'kind' => 'identify',
90+
'creationDate' => Util::currentTimeUnixMillis(),
91+
'key' => strval($user->getKey()),
92+
'user' => $user
93+
);
94+
}
95+
96+
public function newCustomEvent($eventName, $user, $data, $metricValue)
97+
{
98+
$e = array(
99+
'kind' => 'custom',
100+
'creationDate' => Util::currentTimeUnixMillis(),
101+
'key' => $eventName,
102+
'user' => $user
103+
);
104+
if (isset($data)) {
105+
$e['data'] = $data;
106+
}
107+
if (isset($metricValue)) {
108+
$e['metricValue'] = $metricValue;
109+
}
110+
return $e;
111+
}
112+
113+
private static function isExperiment($flag, $reason)
114+
{
115+
if ($reason) {
116+
switch ($reason->getKind()) {
117+
case 'RULE_MATCH':
118+
$i = $reason->getRuleIndex();
119+
$rules = $flag->getRules();
120+
return isset($i) && $i >= 0 && $i < count($rules) && $rules[$i]->isTrackEvents();
121+
case 'FALLTHROUGH':
122+
return $flag->isTrackEventsFallthrough();
123+
}
124+
}
125+
return false;
126+
}
127+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
namespace LaunchDarkly;
3+
4+
class NullEventProcessor
5+
{
6+
public function enqueue($event)
7+
{
8+
return true;
9+
}
10+
11+
public function flush()
12+
{
13+
}
14+
}

0 commit comments

Comments
 (0)