Skip to content

prepare 4.3.0 release #170

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 271 commits into from
Jan 31, 2023
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
271 commits
Select commit Hold shift + click to select a range
180679f
cache flag data in allFlags
eli-darkly Sep 24, 2018
15720d0
rm unused imports
eli-darkly Sep 24, 2018
dd7f268
Merge pull request #30 from launchdarkly/eb/ch24369/all-flags-caching
eli-darkly Sep 25, 2018
08572c9
Merge branch 'master' of github.com:launchdarkly/php-client
eli-darkly Sep 25, 2018
d3c3932
Merge branch 'master' of github.com:launchdarkly/php-client
eli-darkly Sep 26, 2018
a2598c7
add option to reduce front-end metadata for untracked flags
eli-darkly Oct 5, 2018
78ed55f
Merge pull request #31 from launchdarkly/eb/ch24449/less-metadata
eli-darkly Nov 8, 2018
440a2ad
Merge branch 'master' of github.com:launchdarkly/php-client
eli-darkly Nov 21, 2018
7543cf3
Merge branch 'master' of github.com:launchdarkly/php-client
eli-darkly Nov 26, 2018
37e7eaf
add ability to load flags from a file
eli-darkly Jan 10, 2019
4b2f9ef
linter
eli-darkly Jan 10, 2019
226fd95
data completeness
eli-darkly Jan 10, 2019
e997d9f
more data fixes
eli-darkly Jan 10, 2019
804a170
more data fixes
eli-darkly Jan 10, 2019
5f74cb2
more data fixes
eli-darkly Jan 10, 2019
4587c04
readme link
eli-darkly Jan 10, 2019
4ae2bd9
rm unused parameters
eli-darkly Jan 10, 2019
529ec43
fix incorrect doc comment
eli-darkly Jan 10, 2019
96dc0b4
add DynamoDB integration
eli-darkly Jan 23, 2019
ea3268e
fix test config
eli-darkly Jan 23, 2019
5da57f3
fix string check
eli-darkly Jan 23, 2019
aa62488
readme
eli-darkly Jan 23, 2019
d8bcfbb
fix test data
eli-darkly Jan 23, 2019
895aa33
factor out base class, implement caching, make configuration simpler
eli-darkly Jan 23, 2019
10662d5
fix comment
eli-darkly Jan 23, 2019
2ee0e9e
rm unused const
eli-darkly Jan 23, 2019
1eeb153
can't scope constants
eli-darkly Jan 23, 2019
c82b7c7
linter
eli-darkly Jan 23, 2019
6aead62
add Consul integration
eli-darkly Jan 23, 2019
3887732
typo
eli-darkly Jan 24, 2019
10e0daf
regenerate lockfile using PHP 5.5
eli-darkly Jan 24, 2019
2ea5c52
Merge pull request #32 from launchdarkly/eb/ch26319/file-data-source
eli-darkly Jan 24, 2019
200229c
we need at least version 2.1 of the Consul package
eli-darkly Jan 24, 2019
1a7cd19
update lockfile
eli-darkly Jan 24, 2019
d2461d2
Merge branch 'master' into eb/ch28330/dynamodb
eli-darkly Jan 24, 2019
dd92f7f
Merge branch 'eb/ch28330/dynamodb' into eb/ch28432/consul
eli-darkly Jan 24, 2019
313a473
rm comment
eli-darkly Jan 24, 2019
2580f6f
remove lockfile
eli-darkly Jan 24, 2019
72f0ac8
add delay for creating test table
eli-darkly Jan 24, 2019
546bc1c
Merge branch 'eb/ch28330/dynamodb' into eb/ch28432/consul
eli-darkly Jan 24, 2019
fd536a5
move feature requester code into Integrations namespace
eli-darkly Jan 24, 2019
a8c1647
linter
eli-darkly Jan 24, 2019
f192e9a
misc test fixes
eli-darkly Jan 24, 2019
d1a2e41
Merge pull request #35 from launchdarkly/eb/ch30532/lockfile
eli-darkly Jan 25, 2019
c7f98fd
fix apc/apcu calls
eli-darkly Jan 25, 2019
9ff5c89
Merge branch 'master' into eb/ch28330/dynamodb
eli-darkly Jan 25, 2019
088aef2
Merge pull request #33 from launchdarkly/eb/ch28330/dynamodb
eli-darkly Jan 25, 2019
6f05a0f
Merge branch 'master' into eb/ch28432/consul
eli-darkly Jan 25, 2019
a49b3c1
fix comment
eli-darkly Jan 25, 2019
22498a0
Merge branch 'eb/ch28432/consul' into eb/ch30533/feature-requesters
eli-darkly Jan 25, 2019
24cf9e0
fix deprecated caching store classes
eli-darkly Jan 25, 2019
a9100fc
better caching abstraction
eli-darkly Jan 25, 2019
80a653b
typo
eli-darkly Jan 25, 2019
47c1bc2
linter
eli-darkly Jan 25, 2019
f6cf050
fix namespaces
eli-darkly Jan 25, 2019
55dd858
fix tests
eli-darkly Jan 25, 2019
17cca84
Merge pull request #36 from launchdarkly/eb/ch28432/consul
eli-darkly Jan 25, 2019
528fc91
doc fixes
eli-darkly Jan 25, 2019
68c81fb
move a bunch more stuff
eli-darkly Jan 26, 2019
613f881
misc cleanup
eli-darkly Jan 26, 2019
6d37fdd
add test for not having any flags
eli-darkly Jan 26, 2019
4014e19
restore documentation for deprecated properties
eli-darkly Jan 31, 2019
15b780d
Merge pull request #37 from launchdarkly/eb/ch30533/feature-requesters
eli-darkly Jan 31, 2019
86bc30f
version 3.5.0
eli-darkly Jan 31, 2019
5d092f0
Merge branch 'master' of github.com:launchdarkly/php-client
eli-darkly Feb 6, 2019
9c589d1
revert accidental commit
eli-darkly Feb 27, 2019
9368bc9
add experimentation event overrides for rules and fallthrough
eli-darkly Feb 27, 2019
f669e37
linter
eli-darkly Feb 27, 2019
b88c7ee
misc fixes
eli-darkly Feb 27, 2019
1f18eb0
misc test fixes
eli-darkly Feb 27, 2019
1dc3408
Merge pull request #38 from launchdarkly/eb/ch32307/experiment
eli-darkly Mar 2, 2019
f533573
Merge commit 'b34a45325c615db18fde2038ea3e627e9d6d80ff'
eli-darkly Mar 13, 2019
87dadb3
Hr/ch34492/waitonconsul (#39)
hroederld Mar 26, 2019
30f10c8
coerce user attributes to strings when necessary, don't send events w…
eli-darkly Apr 2, 2019
2d3120b
explanatory comments
eli-darkly Apr 3, 2019
1f6cd8b
Merge pull request #40 from launchdarkly/eb/ch35189-35206/stringify-a…
eli-darkly Apr 3, 2019
f2783b3
Merge branch 'master' of github.com:launchdarkly/php-client
eli-darkly Apr 3, 2019
6d5ed05
add release script (version update only)
eli-darkly Apr 11, 2019
aa94ab4
Merge pull request #41 from launchdarkly/eb/ch36538/release-script
eli-darkly Apr 11, 2019
aa29430
use newer readme footer format
eli-darkly Apr 11, 2019
4199948
merge from public after release
LaunchDarklyCI Apr 12, 2019
8aa23ea
Merge branch 'master' into experiment
eli-darkly Apr 14, 2019
5055032
support metric value in track()
eli-darkly Apr 14, 2019
685cb1b
linter
eli-darkly Apr 15, 2019
c145908
update method description
eli-darkly Apr 17, 2019
0820f04
Merge pull request #42 from launchdarkly/eb/ch32307/metric-value
eli-darkly Apr 17, 2019
3e46f1a
add param to skip db tests, update docs for new repo name
eli-darkly Apr 25, 2019
ff1a19d
wrong method name
eli-darkly Apr 25, 2019
999660a
Merge pull request #43 from launchdarkly/eb/ch37610/allow-skip-db-tests
eli-darkly Apr 25, 2019
f224cfc
Merge branch 'master' of github.com:launchdarkly/php-client
eli-darkly Apr 25, 2019
86eefb3
add tests for rollout calculations, + misc test cleanup
eli-darkly Apr 25, 2019
a736ec4
Merge pull request #44 from launchdarkly/eb/ch37607-ch37636/rollout-t…
eli-darkly Apr 26, 2019
0e212b7
misc doc fixes
eli-darkly Apr 26, 2019
9b99cd7
misc doc fixes
eli-darkly Apr 26, 2019
605190a
merge from public after release
LaunchDarklyCI Apr 26, 2019
cf33efa
Merge branch 'master' into experiment
eli-darkly Apr 26, 2019
293daf6
update package name (#45)
bwoskow-ld May 10, 2019
2d34750
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
bwoskow-ld May 10, 2019
94b4bb7
Merge branch 'master' of github.com:launchdarkly/php-client
eli-darkly Jun 3, 2019
5789708
add test for cached get all
eli-darkly Jun 4, 2019
377fc6c
typo
eli-darkly Jun 4, 2019
1d5af00
revert bugfix to test the test
eli-darkly Jun 4, 2019
d9ea2d7
reinstate bugfix
eli-darkly Jun 5, 2019
ad3608d
mix fixes, rename file
eli-darkly Jun 5, 2019
ec2337e
fix filename
eli-darkly Jun 5, 2019
91c3934
misc cleanup
eli-darkly Jun 5, 2019
79fc686
linter
eli-darkly Jun 5, 2019
151e1d8
misc fixes
eli-darkly Jun 5, 2019
632fd55
test state cleanup
eli-darkly Jun 5, 2019
32e4dc6
linter + fix filename in instructions
eli-darkly Jun 6, 2019
996efd7
Merge pull request #46 from launchdarkly/eb/ch40109/better-cache-tests
eli-darkly Jun 6, 2019
09ee165
merge from public after release
LaunchDarklyCI Jun 6, 2019
6c13435
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
eli-darkly Aug 28, 2019
f029273
Merge branch 'master' into experiment
eli-darkly Oct 1, 2019
86eb407
merge from public after release
LaunchDarklyCI Oct 1, 2019
6c28767
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
bwoskow-ld Nov 7, 2019
f7bdd98
Merge branch 'master' of github.com:launchdarkly/php-server-sdk-private
bwoskow-ld Nov 7, 2019
37e069b
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
eli-darkly Dec 13, 2019
b90e0f7
misc CI fixes, don't try to install phpredis in 5.6
eli-darkly Dec 13, 2019
6d67a40
merge from public after release
LaunchDarklyCI Dec 13, 2019
79a19cd
don't let user fall outside of last bucket in rollout
eli-darkly Dec 30, 2019
5b21425
PHP 5.5 requires even null properties to be defined
eli-darkly Dec 30, 2019
e6c0e97
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
eli-darkly Jan 1, 2020
679e5ca
minor cleanup
eli-darkly Jan 3, 2020
683872f
Merge pull request #47 from launchdarkly/eb/ch43307/bucketing-fix
eli-darkly Jan 3, 2020
73722c2
merge from public after release
LaunchDarklyCI Jan 3, 2020
620adc3
more accurate changelog text regarding phpredis
eli-darkly Jan 6, 2020
4c71745
Merge pull request #48 from launchdarkly/eb/ch60221/phpredis-changelog
eli-darkly Jan 6, 2020
8939cb2
Add circle jobs for newer PHP versions.
gwhelanLD Jan 25, 2020
9c1eadb
Revert "Add circle jobs for newer PHP versions."
gwhelanLD Jan 25, 2020
fa8a295
implement doc generation with phpDocumentor 3 (prerelease), clean up …
eli-darkly Feb 11, 2020
4d9bd1c
Add CI jobs for PHP 7.3 + 7.4 (#51)
eli-darkly Feb 13, 2020
a625518
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
eli-darkly Feb 24, 2020
8393c67
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
eli-darkly Apr 24, 2020
e3bcf27
ensure events aren't sent if send_events is false
eli-darkly Apr 24, 2020
364dff2
clarify test with comment
eli-darkly Apr 24, 2020
7d3bc59
Merge pull request #52 from launchdarkly/eb/ch74871/dont-send-events
eli-darkly Apr 24, 2020
8212888
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
eli-darkly Apr 24, 2020
3f7fe2d
merge from public after release
LaunchDarklyCI Apr 24, 2020
8a3cd23
make prefix concatenation in DynamoDB consistent with other SDKs
eli-darkly Oct 27, 2020
39b0455
fix test
eli-darkly Oct 27, 2020
5e1fd6d
Merge pull request #53 from launchdarkly/eb/ch93198/dynamodb-prefix
eli-darkly Oct 28, 2020
52ccede
fix PHP 5.5 CI build by pinning Composer version (#54)
eli-darkly Oct 28, 2020
3117bfc
merge from public after release
LaunchDarklyCI Oct 28, 2020
ffea01c
Updating warning log in Identify to not say Track was called (#56)
bwoskow-ld Jan 7, 2021
4343546
merge from public after release
LaunchDarklyCI Jan 7, 2021
5817116
Removed the guides link
bwoskow-ld Feb 3, 2021
d22898b
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
eli-darkly Feb 27, 2021
d03019a
merge from public after release
LaunchDarklyCI Mar 1, 2021
2bf1cba
add alias functionality and some related tests
Apr 9, 2021
51902d2
Revert "add alias functionality and some related tests"
apache-hb Apr 9, 2021
8dae41c
Merge branch 'master' of github.com:launchdarkly/php-server-sdk-private
eli-darkly Apr 14, 2021
016665c
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
eli-darkly Apr 14, 2021
710b6cd
merge from public after release
LaunchDarklyCI Apr 14, 2021
ee8916f
add alias events support (#57)
apache-hb Apr 19, 2021
6deaf9b
merge from public after release
LaunchDarklyCI Apr 19, 2021
995762c
merge exp-alloc
hroederld Jun 21, 2021
b98cc50
merge from public after release
LaunchDarklyCI Jun 21, 2021
f9f17db
drop support for EOL php versions and update deps (#60)
apache-hb Jul 29, 2021
f9138f0
fix test class
eli-darkly Jul 29, 2021
37466e2
remove database integrations from SDK (#63)
eli-darkly Jul 29, 2021
53686a7
add type hints to FeatureRequesterBase methods
eli-darkly Jul 29, 2021
0e5230d
Merge branch 'master' of github.com:launchdarkly/php-server-sdk
eli-darkly Jul 30, 2021
786ab3f
fix PHPRedis logic for prefix & custom client, add unit tests (#64)
eli-darkly Jul 31, 2021
4e9330a
merge from public after release
Aug 2, 2021
511f727
add psalm lints and php hints (#62)
apache-hb Aug 3, 2021
0eacd84
remove deprecated members (#65)
eli-darkly Aug 3, 2021
2c0821e
change default base URL to sdk.launchdarkly.com
eli-darkly Aug 3, 2021
d72754b
Merge pull request #67 from launchdarkly/eb/ch114714/base-url
eli-darkly Aug 5, 2021
1095977
move non-public classes into Impl namespace (#66)
eli-darkly Aug 5, 2021
b8d539a
add CI job for PHP 8.0 (#69)
eli-darkly Aug 6, 2021
785890a
use phpDocumentor 3 + misc doc comment cleanup (#68)
eli-darkly Aug 6, 2021
2a64354
Merge branch 'master' into 4.0
eli-darkly Aug 7, 2021
148ba47
merge from public after release
Aug 7, 2021
ed29c2b
Updates docs URLs
ember-stevens Sep 24, 2021
e865744
Merge pull request #70 from launchdarkly/emberstevens/sc-118589/url-a…
ember-stevens Sep 27, 2021
72a3439
pin Psalm to 4.9.2 to prevent a spurious linting error (#71)
eli-darkly Sep 29, 2021
5f70f18
use Releaser v2 config + add badge links in readme (#72)
eli-darkly Oct 8, 2021
c3f48f2
use Releaser PHP project template (#73)
eli-darkly Oct 11, 2021
8382bc3
remove obsolete line that's no longer used because $seed is computed …
eli-darkly Oct 12, 2021
9974806
remove obsolete VERSION file
eli-darkly Oct 12, 2021
730a497
Merge pull request #76 from launchdarkly/eb/sc-126501/version-file
eli-darkly Oct 13, 2021
77b990e
Merge pull request #75 from launchdarkly/eb/sc-126500/rm-obsolete-line
eli-darkly Oct 13, 2021
d537537
Fix test confirming send_events = false is honored (#78)
keelerm84 Oct 14, 2021
a239522
Minor cleanup and consistency changes (#79)
keelerm84 Oct 20, 2021
e12ed37
Add integration test for curl event publisher (#77)
keelerm84 Oct 21, 2021
d66ae02
Curl honor connect_timeout (#81)
keelerm84 Oct 25, 2021
fa2377a
Set required connect_timeout option in test (#82)
keelerm84 Oct 25, 2021
bf54f4b
Add Windows support for "Curl" publisher (#80)
keelerm84 Oct 25, 2021
03e64d1
Add cs-check to build process (#83)
keelerm84 Oct 26, 2021
f16f39d
Don't treat numeric strings as numbers (#84)
keelerm84 Oct 28, 2021
0b34edc
Decrease psalm error level (#85)
keelerm84 Nov 19, 2021
4bca5de
added TestData, FlagBuilder; added TestDataTest; started implementing…
charukiewicz Jan 20, 2022
ce1b438
made props protected, made basic build method, made variations method…
joemalin95 Jan 20, 2022
9db1f9a
continued implementing test data and tests for test data
joemalin95 Jan 21, 2022
2ae4dff
implemented varationForAllUsers, valueForAllUsers, and variationForUs…
joemalin95 Jan 24, 2022
e51d913
reorganized functions, added needed classes and functions, left some …
joemalin95 Jan 25, 2022
d63dc75
broken - transitioning build to return a FeatureFlag, finished implem…
joemalin95 Jan 27, 2022
335e60c
reverted build to return array, implemented getFeature and getAllFeat…
joemalin95 Jan 28, 2022
e5c5c46
fixed build, implemented FeatureRequester, added simple test case
joemalin95 Jan 31, 2022
9c9da6f
Event attribute filtering is overly aggressively (#86)
keelerm84 Feb 2, 2022
dea0c92
Account for traffic allocation on all flags (#87)
keelerm84 Feb 2, 2022
8c15326
finished FlagRuleBuilder implementation; fixed psalm errors; improved…
charukiewicz Feb 4, 2022
a2f63d7
fixed php-cs-fixer warnings in TestDataTest.php
charukiewicz Feb 4, 2022
012d55a
Apply suggestions from code review
charukiewicz Feb 4, 2022
f97e86f
replace use of array_push with append operator; standardized capitali…
charukiewicz Feb 4, 2022
ff5abca
Merge branch 'cc/sc-137833/test-data-flag-builder' of github.com:laun…
charukiewicz Feb 4, 2022
7d9b84f
remove array_splice() implementation of existing user key removal due…
charukiewicz Feb 4, 2022
db09c87
converted variationForUser to use array_splice but fixed issue caused…
charukiewicz Feb 5, 2022
ad502eb
fixed missing indexes required to decode FlagBuilder into a FeatureFl…
charukiewicz Feb 7, 2022
f07d83f
split off TestData\FlagBuilder and TestData\FlagRuleBuilder from Test…
charukiewicz Feb 14, 2022
f652e8c
additional cleanup; added missing type hint; minor refactoring
charukiewicz Feb 14, 2022
2fe589c
remove special handling of singleton arrays in FlagBuilder::variations()
charukiewicz Feb 14, 2022
3199a74
run php-cs-fixer on TestData-related files
charukiewicz Feb 14, 2022
e22397f
started writing repetitive tests using the phpunit @dataProvider feature
charukiewicz Feb 14, 2022
93028a4
swapped positions of expected and actual in dataProvider-driven test
charukiewicz Feb 14, 2022
ecf6c73
fix typos in code in comment blocks
charukiewicz Feb 15, 2022
75d3ead
merge from public after release
Feb 16, 2022
d67ee8e
Apply whitespace fixes from code review
charukiewicz Feb 28, 2022
4610d95
split unwieldy tests in TestDataTest into separate tests; address TOD…
charukiewicz Feb 28, 2022
1fad3fe
added annotations to dataProvider-driven tests
charukiewicz Feb 28, 2022
2ca4390
changed _isBooleanFlag() implementation to use strict equality
charukiewicz Feb 28, 2022
0dff413
Merge pull request #88 from launchdarkly/cc/sc-137833/test-data-flag-…
charukiewicz Mar 2, 2022
4b03134
Add unit test to verify `in` operator in TestData (#89)
keelerm84 Apr 4, 2022
0ee1b5b
Add support for psr/log 2 and 3 (#91)
keelerm84 Apr 5, 2022
719d1e9
Merge pull request #90 from launchdarkly/test-data
keelerm84 Apr 11, 2022
d6b6ef5
merge from public after release
Apr 13, 2022
32991eb
Adds link to Relay Proxy docs
ember-stevens Apr 19, 2022
f84e7e9
Merge pull request #92 from launchdarkly/emberstevens/sc-150321/stand…
ember-stevens Apr 20, 2022
9c1f2e6
master -> main
keelerm84 May 6, 2022
2619541
Add support for Guzzle 6.3 (#93)
keelerm84 Jul 5, 2022
3dff005
merge from public after release
Jul 5, 2022
4097d6e
Use setVersion on update of a changed flag (#161)
aretenz Jul 28, 2022
4b0b6eb
Merge branch 'contrib' into private-main
keelerm84 Jul 28, 2022
72f8bd7
merge from public after release
Aug 1, 2022
0a7a18d
Add support for monolog 3.0 (#94)
keelerm84 Sep 6, 2022
d85c61d
merge from public after release
Sep 7, 2022
331eea8
fix base URI concatenation so path isn't lost
eli-darkly Oct 4, 2022
f083261
fix JSON output for empty allFlagsState result
eli-darkly Oct 4, 2022
e7857d2
lint
eli-darkly Oct 4, 2022
c01cf6e
also fix base URIs for events
eli-darkly Oct 4, 2022
e338c69
Merge branch 'eb/sc-139580/empty-flags-state-json' into contract-tests
eli-darkly Oct 4, 2022
ee95057
fix JSON output for empty allFlagsState result (#97)
eli-darkly Oct 4, 2022
08f842a
fix base URI concatenation so path isn't lost (#96)
eli-darkly Oct 4, 2022
eddb393
Merge branch 'main' into contract-tests
eli-darkly Oct 4, 2022
113969e
implement contract test service (#95)
eli-darkly Oct 4, 2022
d9af33f
change test service to not require Docker, enable tests in CI (#100)
eli-darkly Oct 6, 2022
c35a830
merge from public after release
Oct 7, 2022
0e30c71
Add application info support (#124)
keelerm84 Jan 31, 2023
d19ec3b
Merge branch '4.x' into private-4.x
keelerm84 Jan 31, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@ The LaunchDarkly Relay Proxy ([ld-relay](https://github.com/launchdarkly/ld-rela
'event_publisher_class' => 'LaunchDarkly\GuzzleEventPublisher',
'events_uri' => 'http://your-ldrelay-host:8030'

Using flag data from a file
---------------------------

For testing purposes, the SDK can be made to read feature flag state from a file or files instead of connecting to LaunchDarkly. See [`FileDataFeatureRequester`](https://github.com/launchdarkly/php-client/blob/master/FileDataFeatureRequester.php) and ["Reading flags from a file"](https://docs.launchdarkly.com/docs/reading-flags-from-a-file).

Testing
-------

Expand All @@ -140,7 +145,7 @@ Contributing
We encourage pull-requests and other contributions from the community. We've also published an [SDK contributor's guide](http://docs.launchdarkly.com/docs/sdk-contributors-guide) that provides a detailed explanation of how our SDKs work.

About LaunchDarkly
-----------
------------------

* LaunchDarkly is a continuous delivery platform that provides feature flags as a service and allows developers to iterate quickly and safely. We allow you to easily flag your features and manage them from the LaunchDarkly dashboard. With LaunchDarkly, you can:
* Roll out a new feature to a subset of your users (like a group of users who opt-in to a beta tester group), gathering feedback and bug reports from real-world use cases.
Expand Down
132 changes: 132 additions & 0 deletions src/LaunchDarkly/FileDataFeatureRequester.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
<?php
namespace LaunchDarkly;

/**
* This component allows you to use local files as a source of feature flag state. This would
* typically be used in a test environment, to operate using a predetermined feature flag state
* without an actual LaunchDarkly connection.
* <p>
* To use this component, create an instance of this class, passing the path(s) of your data
* file(s). Then place the resulting object in your LaunchDarkly client configuration with the
* key "feature_requester".
* <pre>
* $file_data = new FileDataFeatureRequester("./testData/flags.json");
* $config = array("feature_requester" => $file_data, "send_events" => false);
* $client = new LDClient("sdk_key", $config);
* </pre>
* <p>
* This will cause the client <i>not</i> to connect to LaunchDarkly to get feature flags. (Note
* that in this example, <code>send_events</core> is also set to false so that it will not
* connect to LaunchDarkly to send analytics events either.)
* <p>
*/
class FileDataFeatureRequester implements FeatureRequester
{
/** @var array */
private $_filePaths;
/** @var array */
private $_flags;
/** @var array */
private $_segments;

public function __construct($filePaths)
{
$this->_filePaths = is_array($filePaths) ? $filePaths : array($filePaths);
$this->_flags = array();
$this->_segments = array();
$this->readAllData();
}

/**
* Gets an individual feature flag
*
* @param $key string feature key
* @return FeatureFlag|null The decoded FeatureFlag, or null if missing
*/
public function getFeature($key)
{
return isset($this->_flags[$key]) ? $this->_flags[$key] : null;
}

/**
* Gets an individual user segment
*
* @param $key string segment key
* @return Segment|null The decoded Segment, or null if missing
*/
public function getSegment($key)
{
return isset($this->_segments[$key]) ? $this->_segments[$key] : null;
}

/**
* Gets all feature flags
*
* @return array()|null The decoded FeatureFlags, or null if missing
*/
public function getAllFeatures()
{
return $this->_flags;
}

private function readAllData()
{
$flags = array();
$segments = array();
foreach ($this->_filePaths as $filePath) {
$this->loadFile($filePath, $flags, $segments);
}
$this->_flags = $flags;
$this->_segments = $segments;
}

private function loadFile($filePath, &$flags, &$segments)
{
$content = file_get_contents($filePath);
$data = json_decode($content, true);
if ($data == null) {
throw new \InvalidArgumentException("File is not valid JSON: " + $filePath);
}
if (isset($data['flags'])) {
foreach ($data['flags'] as $key => $value) {
$flag = FeatureFlag::decode($value);
$this->tryToAdd($flags, $key, $flag, "feature flag");
}
}
if (isset($data['flagValues'])) {
foreach ($data['flagValues'] as $key => $value) {
$flag = FeatureFlag::decode(array(
"key" => $key,
"version" => 1,
"on" => false,
"prerequisites" => array(),
"salt" => "",
"targets" => array(),
"rules" => array(),
"fallthrough" => array(),
"offVariation" => 0,
"variations" => array($value),
"deleted" => false,
"trackEvents" => false,
"clientSide" => false
));
$this->tryToAdd($flags, $key, $flag, "feature flag");
}
}
if (isset($data['segments'])) {
foreach ($data['segments'] as $key => $value) {
$segment = Segment::decode($value);
$this->tryToAdd($segments, $key, $segment, "user segment");
}
}
}

private function tryToAdd(&$array, $key, $item, $kind)
{
if (isset($array[$key])) {
throw new \InvalidArgumentException("File data contains more than one " . $kind . " with key: " . $key);
} else {
$array[$key] = $item;
}
}
}
38 changes: 38 additions & 0 deletions tests/FileDataFeatureRequesterTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php
namespace LaunchDarkly\Tests;

use LaunchDarkly\FileDataFeatureRequester;
use LaunchDarkly\LDUser;

class FileDataFeatureRequesterTest extends \PHPUnit_Framework_TestCase
{
public function testLoadsFile()
{
$fr = new FileDataFeatureRequester("./tests/filedata/all-properties.json");
$flag1 = $fr->getFeature("flag1");
$this->assertEquals("flag1", $flag1->getKey());
$flag2 = $fr->getFeature("flag2");
$this->assertEquals("flag2", $flag2->getKey());
$seg1 = $fr->getSegment("seg1");
$this->assertEquals("seg1", $seg1->getKey());
}

public function testLoadsMultipleFiles()
{
$fr = new FileDataFeatureRequester(array("./tests/filedata/flag-only.json",
"./tests/filedata/segment-only.json"));
$flag1 = $fr->getFeature("flag1");
$this->assertEquals("flag1", $flag1->getKey());
$seg1 = $fr->getSegment("seg1");
$this->assertEquals("seg1", $seg1->getKey());
}

public function testShortcutFlagCanBeEvaluated()
{
$fr = new FileDataFeatureRequester("./tests/filedata/all-properties.json");
$flag2 = $fr->getFeature("flag2");
$this->assertEquals("flag2", $flag2->getKey());
$result = $flag2->evaluate(new LDUser("user"), null);
$this->assertEquals("value2", $result->getDetail()->getValue());
}
}
35 changes: 35 additions & 0 deletions tests/filedata/all-properties.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"flags": {
"flag1": {
"key": "flag1",
"version": 1,
"deleted": false,
"on": true,
"prerequisites": [],
"targets": [],
"rules": [],
"fallthrough": {
"variation": 2
},
"variations": [ "fall", "off", "on" ],
"offVariation": 0,
"salt": "",
"trackEvents": false,
"clientSide": false
}
},
"flagValues": {
"flag2": "value2"
},
"segments": {
"seg1": {
"key": "seg1",
"version": 1,
"deleted": false,
"included": ["user1"],
"excluded": [],
"rules": [],
"salt": ""
}
}
}
21 changes: 21 additions & 0 deletions tests/filedata/flag-only.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"flags": {
"flag1": {
"key": "flag1",
"version": 1,
"deleted": false,
"on": true,
"prerequisites": [],
"targets": [],
"rules": [],
"fallthrough": {
"variation": 2
},
"variations": [ "fall", "off", "on" ],
"offVariation": 0,
"salt": "",
"trackEvents": false,
"clientSide": false
}
}
}
13 changes: 13 additions & 0 deletions tests/filedata/segment-only.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"segments": {
"seg1": {
"key": "seg1",
"version": 1,
"deleted": false,
"included": ["user1"],
"excluded": [],
"rules": [],
"salt": ""
}
}
}