Skip to content
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

prepare 5.3.0 release #55

Merged
merged 873 commits into from
Apr 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
873 commits
Select commit Hold shift + click to select a range
56116e7
keep version constants in sync
eli-darkly May 18, 2020
db9b7fb
Merge pull request #224 from launchdarkly/eb/ch75025/http-config
eli-darkly May 19, 2020
b84acf2
Merge branch 'v4' of github.com:launchdarkly/go-server-sdk into contrib
eli-darkly May 20, 2020
a7be44e
Merge pull request #28 from alexwforsythe/evaluation-benchmarks
eli-darkly May 20, 2020
b137275
Merge branch 'contrib' into eb/ch77270/benchmarks-v4
eli-darkly May 20, 2020
07f6b17
expand and clean up eval benchmark code, run in CI
eli-darkly May 20, 2020
605f541
add extra instrumentation to event processor so it can be tested with…
eli-darkly May 20, 2020
f976372
more eval benchmark cleanup
eli-darkly May 20, 2020
d965f58
add event processor benchmarks
eli-darkly May 20, 2020
f8dfdca
fix CI config
eli-darkly May 20, 2020
f54eb60
Merge branch 'v4' into v5
eli-darkly May 20, 2020
4b79e84
Merge branch 'eb/ch77270/benchmarks-v4' of github.com:launchdarkly/go…
eli-darkly May 20, 2020
675ecce
CI fix
eli-darkly May 20, 2020
3a57f00
fix benchmark package
eli-darkly May 20, 2020
bb39f59
comments
eli-darkly May 20, 2020
92c2c8c
Merge branch 'eb/ch77270/benchmarks-v4' of github.com:launchdarkly/go…
eli-darkly May 20, 2020
fbda475
(5.0) add optimization notes and helper script for allocation tracing
eli-darkly May 20, 2020
8866102
(5.0) (optimization) don't create closures for every evaluation
eli-darkly May 20, 2020
4cf84d1
add benchmarks for in-memory store
eli-darkly May 20, 2020
464e411
Merge branch 'eb/ch77270/benchmarks-v4' of github.com:launchdarkly/go…
eli-darkly May 20, 2020
8238934
Merge branch 'eb/ch77270/benchmarks-v5' into eb/ch77270/benchmark-allocs
eli-darkly May 20, 2020
a20421b
Merge branch 'eb/ch77270/benchmark-allocs' into eb/ch77304/optimize-1…
eli-darkly May 20, 2020
f002d82
(5.0) (optimization) don't use defer in in-memory data store
eli-darkly May 20, 2020
44e4150
rm unnecessary test assertion
eli-darkly May 20, 2020
74dc308
formatting
eli-darkly May 20, 2020
917fc28
better coverage of operators in benchmarks
eli-darkly May 21, 2020
8fa5e9a
Merge branch 'eb/ch77270/benchmarks-v4' of github.com:launchdarkly/go…
eli-darkly May 21, 2020
1e86d0c
Merge branch 'eb/ch77270/benchmarks-v5' into eb/ch77270/benchmark-allocs
eli-darkly May 21, 2020
3c554f7
Merge branch 'eb/ch77270/benchmark-allocs' into eb/ch77304/optimize-1…
eli-darkly May 22, 2020
82d5ecc
Merge branch 'eb/ch77304/optimize-1-events-closure' into eb/ch77304/o…
eli-darkly May 22, 2020
94b83c3
(5.0) (optimization) use *FeatureFlag in some evaluator APIs to reduc…
eli-darkly May 22, 2020
4b24a57
(5.0) (optimization) don't create any event instances in NoEvents mode
eli-darkly May 22, 2020
c207e20
Merge pull request #225 from launchdarkly/eb/ch77270/benchmarks-v4
eli-darkly May 26, 2020
377ba1e
Merge pull request #226 from launchdarkly/eb/ch77270/benchmarks-v5
eli-darkly May 26, 2020
5a5e370
Merge pull request #227 from launchdarkly/eb/ch77270/benchmark-allocs
eli-darkly May 26, 2020
1fa4b46
Merge pull request #228 from launchdarkly/eb/ch77304/optimize-1-event…
eli-darkly May 26, 2020
fbddc6a
Merge branch 'v5' into eb/ch77304/optimize-2-memory-store
eli-darkly May 27, 2020
1a3e489
Merge branch 'eb/ch77304/optimize-2-memory-store' into eb/ch77304/opt…
eli-darkly May 27, 2020
f2ba6df
Merge branch 'eb/ch77304/optimize-3-event-intf' into eb/ch77304/optim…
eli-darkly May 27, 2020
9713a4e
Merge pull request #229 from launchdarkly/eb/ch77304/optimize-2-memor…
eli-darkly Jun 2, 2020
eb08c4d
Merge pull request #230 from launchdarkly/eb/ch77304/optimize-3-event…
eli-darkly Jun 2, 2020
cadfd58
Merge pull request #231 from launchdarkly/eb/ch77304/optimize-4-no-ev…
eli-darkly Jun 2, 2020
b203644
implement flag change events
eli-darkly Jun 3, 2020
4b43880
avoid data race in test
eli-darkly Jun 3, 2020
0be5d57
update linter + misc linting fixes
eli-darkly Jun 4, 2020
b0c1473
enable gocritic
eli-darkly Jun 4, 2020
b9043f7
skip debug logging if it's disabled
eli-darkly Jun 4, 2020
f15fbb7
Merge pull request #234 from launchdarkly/eb/ch77304/debug-logging
eli-darkly Jun 4, 2020
4fb5091
use public packages
eli-darkly Jun 5, 2020
5017188
add readme note about prerelease
eli-darkly Jun 5, 2020
dd9a1dc
rm obsolete comment
eli-darkly Jun 5, 2020
2ede43c
rm unused dependency
eli-darkly Jun 5, 2020
3f12ab5
revert mistaken deletion
eli-darkly Jun 5, 2020
763dae8
Merge branch 'eb/ch76884/flag-events' into eb/ch77325/coverage
eli-darkly Jun 5, 2020
51cebc5
(5.0) rename redis subpackage to ldredis (#235)
eli-darkly Jun 5, 2020
14980a1
Merge branch 'v5' into eb/ch78747/linter-update
eli-darkly Jun 5, 2020
aacf410
Merge branch 'eb/ch78747/linter-update' into eb/ch76884/flag-events
eli-darkly Jun 5, 2020
7bb7d5c
Merge branch 'eb/ch76884/flag-events' into eb/ch77325/coverage
eli-darkly Jun 5, 2020
63964ab
Merge pull request #233 from launchdarkly/eb/ch78747/linter-update
eli-darkly Jun 5, 2020
b90b5c9
misc test coverage improvements, run coverage in CI
eli-darkly Jun 6, 2020
f686fb2
CI fix
eli-darkly Jun 6, 2020
2f05ea7
capture coverage report
eli-darkly Jun 6, 2020
cadd2b2
add script to parse coverage profile and flag uncovered code
eli-darkly Jun 6, 2020
a166c19
include coverage profile in artifacts
eli-darkly Jun 6, 2020
c90339c
better output
eli-darkly Jun 6, 2020
d74eb96
revert addition of analysis script
eli-darkly Jun 6, 2020
d4aa529
rm obsolete message
eli-darkly Jun 6, 2020
352f10f
more coverage improvements, misc code cleanup
eli-darkly Jun 6, 2020
d5bf85a
use new coverage tool
eli-darkly Jun 10, 2020
178fa6f
rm unused
eli-darkly Jun 10, 2020
d2fad45
fix to capture HTML coverage reports
eli-darkly Jun 10, 2020
095abbd
exclude sharedtest package from coverage
eli-darkly Jun 10, 2020
2cc388e
misc makefile improvements
eli-darkly Jun 11, 2020
200a4cd
fill in test coverage for everything except StreamProcessor and datab…
eli-darkly Jun 11, 2020
7917b14
can't rely on a specific error message due to platform differences
eli-darkly Jun 11, 2020
5313613
fix flaky test
eli-darkly Jun 11, 2020
17e90c2
full test coverage of database integrations
eli-darkly Jun 12, 2020
75b88f0
lint
eli-darkly Jun 12, 2020
3e26b94
add godoc badge
eli-darkly Jun 12, 2020
5392271
formatting
eli-darkly Jun 12, 2020
e982b62
formatting
eli-darkly Jun 12, 2020
c2b7127
better badge
eli-darkly Jun 12, 2020
4d2bd5e
minor CI cleanup: use newer images, drop Go 1.12 build (#239)
eli-darkly Jun 15, 2020
0070069
Merge pull request #232 from launchdarkly/eb/ch76884/flag-events
eli-darkly Jun 15, 2020
57a9176
Merge branch 'v5' into eb/ch77325/coverage
eli-darkly Jun 15, 2020
2c5900e
Merge pull request #236 from launchdarkly/eb/ch77325/coverage
eli-darkly Jun 15, 2020
29e132c
Merge branch 'v5' into eb/ch77325/coverage-2
eli-darkly Jun 18, 2020
3df0662
Merge branch 'eb/ch77325/coverage-2' into eb/ch77325/coverage-3
eli-darkly Jun 18, 2020
4cbd04c
make the SDK a module
eli-darkly Jun 18, 2020
1dc7a2c
Merge pull request #237 from launchdarkly/eb/ch77325/coverage-2
eli-darkly Jun 18, 2020
9b1878e
Merge pull request #238 from launchdarkly/eb/ch77325/coverage-3
eli-darkly Jun 18, 2020
ea7c3c3
go mod tidy
eli-darkly Jun 18, 2020
ede936e
Merge pull request #240 from launchdarkly/eb/ch78731/modules
eli-darkly Jun 18, 2020
24b7d15
fix bug where nil references are passed to persistent stores (#241)
eli-darkly Jun 22, 2020
cd1e970
remove support for indirect patch in stream
eli-darkly Jun 23, 2020
3711143
Merge pull request #243 from launchdarkly/eb/ch80666/no-indirect-patch
eli-darkly Jun 23, 2020
acace7c
(5.0) complete test coverage for StreamProcessor
eli-darkly Jun 24, 2020
c0112cf
turn on coverage enforcement
eli-darkly Jun 24, 2020
cf33cd6
fix logic for disabling db packages in coverage
eli-darkly Jun 24, 2020
15c72de
move some internal code around for clearer organization
eli-darkly Jun 24, 2020
f09cbd5
make sharedtest package internal, put public test helpers in new package
eli-darkly Jun 24, 2020
49240f7
DRY
eli-darkly Jun 24, 2020
bda89a0
comment about data store tests
eli-darkly Jun 24, 2020
aca8453
use latest public go-sdk-common, go-sdk-events, go-server-sdk-evaluation
eli-darkly Jun 24, 2020
402ac00
Merge branch 'public-v5' into v5
eli-darkly Jun 24, 2020
c56d6fc
Merge branch 'public-v5' into v5
eli-darkly Jun 24, 2020
422149a
Merge branch 'v5' into eb/ch77325/stream-test-coverage
eli-darkly Jun 24, 2020
fd71485
Merge branch 'eb/ch77325/stream-test-coverage' into eb/ch80929/reorg-…
eli-darkly Jun 24, 2020
4aabff9
Merge branch 'eb/ch80929/reorg-internal' into eb/ch80929/reorg-test-h…
eli-darkly Jun 24, 2020
8ccb9df
remove unused polling logic for indirect/patch
eli-darkly Jun 25, 2020
d8df888
update go-server-sdk-evaluation for data model changes
eli-darkly Jun 25, 2020
577f239
rm unnecessary type aliases that broke tests
eli-darkly Jun 26, 2020
10f3a35
fix test that used an overly sensitive equality test for a flag witho…
eli-darkly Jun 26, 2020
a145fe2
another test issue just like the previous commit
eli-darkly Jun 26, 2020
01dc4cb
move more test helpers + misc fixes
eli-darkly Jun 28, 2020
7f58859
Merge branch 'eb/ch80929/reorg-test-helpers' into eb/ch80666/no-indir…
eli-darkly Jun 28, 2020
dfadb91
Merge branch 'eb/ch80666/no-indirect-patch-query' into eb/ch79944/dat…
eli-darkly Jun 28, 2020
8c6d303
test coverage
eli-darkly Jun 29, 2020
eea4fb5
Merge branch 'eb/ch80929/reorg-test-helpers' into eb/ch80666/no-indir…
eli-darkly Jun 29, 2020
7451c72
Merge branch 'eb/ch80666/no-indirect-patch-query' into eb/ch79944/dat…
eli-darkly Jun 29, 2020
b2211f4
move data store test suite to subpackage
eli-darkly Jun 29, 2020
a43e083
Merge branch 'eb/ch80929/reorg-test-helpers' into eb/ch80666/no-indir…
eli-darkly Jun 29, 2020
d7a7f85
Merge branch 'eb/ch80666/no-indirect-patch-query' into eb/ch79944/dat…
eli-darkly Jun 29, 2020
6bb9674
(5.0) fix bug in deleted item serialization
eli-darkly Jun 29, 2020
fc42c62
more test coverage
eli-darkly Jun 29, 2020
135168d
(5.0) interface cleanup: move data store types out of the way
eli-darkly Jun 30, 2020
f34d9b8
dependency fixes
eli-darkly Jun 30, 2020
3d52b0e
Merge branch 'public-v5' into v5
eli-darkly Jun 30, 2020
4a0bba3
Merge pull request #244 from launchdarkly/eb/ch77325/stream-test-cove…
eli-darkly Jun 30, 2020
4f45aff
Merge pull request #245 from launchdarkly/eb/ch80929/reorg-internal
eli-darkly Jun 30, 2020
c6ed95a
Merge pull request #249 from launchdarkly/eb/ch59962/store-deleted-item
eli-darkly Jun 30, 2020
b81d145
Merge branch 'v5' into eb/ch80929/reorg-test-helpers
eli-darkly Jun 30, 2020
7d7455d
Merge branch 'eb/ch80929/reorg-test-helpers' into eb/ch80666/no-indir…
eli-darkly Jun 30, 2020
35f46fb
Merge branch 'eb/ch80666/no-indirect-patch-query' into eb/ch79944/dat…
eli-darkly Jun 30, 2020
4014183
Merge branch 'eb/ch79944/data-model-update' into eb/ch59962/reorg-sto…
eli-darkly Jun 30, 2020
10b067b
Merge pull request #246 from launchdarkly/eb/ch80929/reorg-test-helpers
eli-darkly Jun 30, 2020
b8847b5
Merge pull request #247 from launchdarkly/eb/ch80666/no-indirect-patc…
eli-darkly Jun 30, 2020
ac5019e
Merge pull request #248 from launchdarkly/eb/ch79944/data-model-update
eli-darkly Jun 30, 2020
a785cc2
Merge pull request #250 from launchdarkly/eb/ch59962/reorg-store-api
eli-darkly Jun 30, 2020
46de931
(5.0 - #7) updates for go-sdk-events API changes (#251)
eli-darkly Jul 1, 2020
9949bce
Merge branch 'public-v5' into v5
eli-darkly Jul 1, 2020
2d16ef4
(5.0) miscellaneous doc comment improvements
eli-darkly Jul 1, 2020
b2aa4ba
Merge pull request #252 from launchdarkly/eb/ch81539/doc-fixes
eli-darkly Jul 1, 2020
80a03c6
fix remaining godoc.org links
eli-darkly Jul 1, 2020
2ecea35
custom badge for pkg.go.dev
eli-darkly Jul 1, 2020
adc3f24
fix go.dev badge
eli-darkly Jul 1, 2020
6b898cc
add API docs link under Learn More
eli-darkly Jul 1, 2020
6656187
update dependencies
eli-darkly Jul 1, 2020
c4d5a6b
use test sandboxing to validate persistent store test failure modes
eli-darkly Jul 1, 2020
b308b33
lint (use more general interface)
eli-darkly Jul 1, 2020
c4e8a5f
(5.0) specify proxy URL as a string
eli-darkly Jul 1, 2020
f2b1cb7
fix test
eli-darkly Jul 1, 2020
a4c5912
fix test
eli-darkly Jul 1, 2020
9e73342
fix another test
eli-darkly Jul 1, 2020
dd19d7d
Merge pull request #254 from launchdarkly/eb/ch75025/proxy-url
eli-darkly Jul 1, 2020
9be83d9
Merge pull request #253 from launchdarkly/eb/ch81396/sandboxed-tests
eli-darkly Jul 1, 2020
4f24fe8
5.0.0-beta.1
eli-darkly Jul 2, 2020
ad6c2ad
Merge pull request #255 from launchdarkly/eb/ch78917/beta1
eli-darkly Jul 2, 2020
709360c
Merge branch 'public-v5' into v5
eli-darkly Jul 3, 2020
072791d
add client decorator that temporarily disables events
eli-darkly Jul 3, 2020
1cf166c
Merge branch 'v5' of github.com:launchdarkly/go-server-sdk into v5
eli-darkly Jul 3, 2020
04c502e
add scoped evaluation without events
eli-darkly Jul 5, 2020
e2f37b4
remove all database subpackages (being moved to separate projects) (#…
eli-darkly Jul 6, 2020
f16175c
bump dependency versions and use ldlogtest package
eli-darkly Jul 7, 2020
5fffc24
Merge pull request #257 from launchdarkly/eb/ch80986/mock-log
eli-darkly Jul 7, 2020
c7ac3b8
Merge branch 'v5' into eb/ch81911/with-events-disabled
eli-darkly Jul 9, 2020
7eeb85c
Merge branch 'v5' of github.com:launchdarkly/go-server-sdk into v5
eli-darkly Jul 9, 2020
6a0a430
Merge branch 'v5' into eb/ch81911/with-events-disabled
eli-darkly Jul 9, 2020
1d229c9
lint
eli-darkly Jul 9, 2020
47aa739
code example
eli-darkly Jul 9, 2020
716f299
Merge pull request #258 from launchdarkly/eb/ch81911/with-events-disa…
eli-darkly Jul 17, 2020
ba76a7e
move AllFlagsState-related types out of main package, add builder
eli-darkly Jul 17, 2020
eb5eb28
rm obsolete references to HTTPOptions setter
eli-darkly Jul 17, 2020
7d9e4bb
minor Makefile fix
eli-darkly Jul 17, 2020
d5fe1f5
Merge pull request #259 from launchdarkly/eb/ch75025/http-options
eli-darkly Jul 17, 2020
ccb507f
Merge pull request #260 from launchdarkly/eb/ch83301/flags-state
eli-darkly Jul 18, 2020
998e43e
add clientSideAvailability to flag model
eli-darkly Jul 28, 2020
0ea410d
Merge pull request #261 from launchdarkly/eb/ch83180/client-availability
eli-darkly Jul 28, 2020
cfd234a
prepare 4.17.3 release (#36)
LaunchDarklyCI Jul 29, 2020
2a44fb3
Releasing version 4.17.3
LaunchDarklyCI Jul 29, 2020
40d4ffa
merge from public after release
LaunchDarklyCI Jul 29, 2020
15c319a
(v5) use new client-side availability fields (#262)
eli-darkly Aug 10, 2020
e68f1bc
Merge branch 'v5' of github.com:launchdarkly/go-server-sdk into v5
eli-darkly Aug 11, 2020
57713cc
ensure SDK non-test code has no module-only dependencies (#263)
eli-darkly Aug 19, 2020
ebac84c
5.0.0-beta.6
eli-darkly Aug 19, 2020
7a14f65
Merge branch 'v5' of github.com:launchdarkly/go-server-sdk into v5
eli-darkly Aug 21, 2020
50de531
update redis repo name in comments
eli-darkly Aug 21, 2020
70097dd
use optional int type
eli-darkly Sep 4, 2020
cf0f7bf
misc cleanup
eli-darkly Sep 8, 2020
c4a35d4
update dependencies
eli-darkly Sep 8, 2020
5ab88bd
Merge pull request #265 from launchdarkly/eb/ch88692/optional-int
eli-darkly Sep 8, 2020
9051f6c
add Go 1.15 CI job, use newer CircleCI images
eli-darkly Sep 10, 2020
9db4a68
typo
eli-darkly Sep 10, 2020
c657e02
fix CI working directory
eli-darkly Sep 10, 2020
b6e5262
fix CI syntax
eli-darkly Sep 10, 2020
178c69a
update readme to mention Go 1.15
eli-darkly Sep 10, 2020
d8c400c
Merge pull request #267 from launchdarkly/eb/ch89155/go-1.15-v4
eli-darkly Sep 10, 2020
ddaa8a9
Merge branch 'v4' into v5
eli-darkly Sep 10, 2020
b21b517
drop Go 1.13 build
eli-darkly Sep 11, 2020
cd010a0
Merge pull request #268 from launchdarkly/eb/ch89155/no-go-1.13
eli-darkly Sep 12, 2020
1345ae2
use go-server-sdk-evaluation 1.0.0-beta.5
eli-darkly Sep 14, 2020
26fbb67
(#2) add test data source (#266)
eli-darkly Sep 14, 2020
99e9f5f
logging fixes/standardization
eli-darkly Sep 18, 2020
a9acb18
Merge pull request #269 from launchdarkly/eb/ch90090/logging
eli-darkly Sep 18, 2020
a8dd93b
use non-beta packages, remove prerelease info
eli-darkly Sep 18, 2020
6c0fcd9
Merge pull request #270 from launchdarkly/eb/ch78917/prerelease
eli-darkly Sep 18, 2020
2e6e5ac
update release metadata
eli-darkly Sep 18, 2020
737eed2
Merge branch 'v5' of github.com:launchdarkly/go-server-sdk into v5
eli-darkly Sep 19, 2020
345417a
Merge branch 'v5' of github.com:launchdarkly/go-server-sdk into v5
eli-darkly Sep 19, 2020
0f84cc8
merge from public after release
LaunchDarklyCI Sep 19, 2020
ac0e8e4
make Releaser create release tags with and without the "v" prefix
eli-darkly Sep 19, 2020
3c1af99
Merge pull request #271 from launchdarkly/eb/ch78917/release-tags
eli-darkly Sep 21, 2020
14f7a2f
update to go-server-sdk-evaluation 1.0.1 for "less omitempty in flag …
eli-darkly Oct 8, 2020
aec6a78
merge from public after release
LaunchDarklyCI Oct 8, 2020
5228226
fix comment typos
eli-darkly Oct 19, 2020
85d7e4b
Merge pull request #273 from launchdarkly/eb/ch92601/typos
eli-darkly Oct 19, 2020
77ae74e
serialize deleted item placeholders with full set of properties (#274)
eli-darkly Oct 20, 2020
62a67ed
update go-sdk-common to 2.0.1
eli-darkly Oct 20, 2020
4b2a2bb
merge from public after release
LaunchDarklyCI Oct 20, 2020
d0261ff
bump eventsource to 1.6.2 for ch95617 logging fix (#275)
eli-darkly Dec 2, 2020
f4ab849
use new jsonstream API (#277)
eli-darkly Dec 14, 2020
f5e74b4
don't require path property in put event
eli-darkly Dec 14, 2020
dd793be
Merge pull request #278 from launchdarkly/eb/ch95135/dont-require-str…
eli-darkly Dec 14, 2020
5ecc0d8
update alpha dependencies
eli-darkly Dec 16, 2020
1f5e92c
update for go-jsonstream API changes
eli-darkly Dec 18, 2020
f794ae9
Merge pull request #279 from launchdarkly/eb/ch95135/jsonstream-changes
eli-darkly Dec 18, 2020
c1c89f9
merge from public after release
LaunchDarklyCI Dec 18, 2020
f052afc
build in Windows with Go 1.14
eli-darkly Dec 18, 2020
b6ede53
Merge pull request #280 from launchdarkly/eb/ch97113/go-1.14-windows
eli-darkly Dec 18, 2020
480d779
bump go-sdk-common version to get user JSON parsing fix
eli-darkly Jan 5, 2021
0fa88e3
Merge pull request #281 from launchdarkly/eb/ch97664/fix-user-parsing
eli-darkly Jan 5, 2021
4803e96
merge from public after release
LaunchDarklyCI Jan 5, 2021
a65584e
remove excessive logging in ldfilewatch, add log message for reloadin…
eli-darkly Jan 11, 2021
49ee9a1
fail fast if SDK key has invalid characters, don't log the key
eli-darkly Jan 11, 2021
99017de
Merge pull request #283 from launchdarkly/eb/ch98035/sdk-key-with-bad…
eli-darkly Jan 11, 2021
9d0d3f5
Merge pull request #282 from launchdarkly/eb/ch98148/file-data-logging
eli-darkly Jan 11, 2021
5cd088c
merge from public after release
LaunchDarklyCI Jan 12, 2021
e510f39
bump go-server-sdk-evaluation to get semver parsing fix
eli-darkly Jan 21, 2021
04abafe
Merge pull request #284 from launchdarkly/eb/ch98975/semver-fix
eli-darkly Jan 21, 2021
ec0dd26
merge from public after release
LaunchDarklyCI Jan 21, 2021
2930611
remove spurious logging of stream data
eli-darkly Jan 22, 2021
a7e6f37
Merge pull request #285 from launchdarkly/eb/ch99083/remove-stream-da…
eli-darkly Jan 22, 2021
afa78a9
merge from public after release
LaunchDarklyCI Jan 22, 2021
251df0f
merge in alias event support
hroederld Jan 26, 2021
4833f6d
merge from public after release
LaunchDarklyCI Jan 26, 2021
ef6c415
Removed the guides link
bwoskow-ld Feb 3, 2021
868dacf
update to go-server-sdk-evaluation 1.1.2 for ch100737 fix
eli-darkly Feb 11, 2021
5c6bf5b
Merge pull request #287 from launchdarkly/eb/ch100737/sdk-eval-update
eli-darkly Feb 11, 2021
63218d3
merge from public after release
LaunchDarklyCI Feb 11, 2021
cddddf1
add DuplicateKeysHandling option to ldfiledata (#299)
eli-darkly Apr 22, 2021
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
31 changes: 27 additions & 4 deletions ldfiledata/file_data_source_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,19 @@ import (
// detecting when data files should be reloaded. Its standard implementation is in the ldfilewatch package.
type ReloaderFactory func(paths []string, loggers ldlog.Loggers, reload func(), closeCh <-chan struct{}) error

// DuplicateKeysHandling is a parameter type used with DataSourceBuilder.DuplicateKeysHandling.
type DuplicateKeysHandling string

const (
// DuplicateKeysFail is an option for DataSourceBuilder.DuplicateKeysHandling, meaning that data loading
// should fail if keys are duplicated across files. This is the default behavior.
DuplicateKeysFail DuplicateKeysHandling = "fail"

// DuplicateKeysIgnoreAllButFirst is an option for DataSourceBuilder.DuplicateKeysHandling, meaning that
// if keys are duplicated across files the first occurrence will be used.
DuplicateKeysIgnoreAllButFirst DuplicateKeysHandling = "ignore"
)

// DataSourceBuilder is a builder for configuring the file-based data source.
//
// Obtain an instance of this type by calling DataSource(). After calling its methods to specify any
Expand All @@ -21,13 +34,22 @@ type ReloaderFactory func(paths []string, loggers ldlog.Loggers, reload func(),
// You do not need to call the builder's CreatePersistentDataSource() method yourself; that will be
// done by the SDK.
type DataSourceBuilder struct {
filePaths []string
reloaderFactory ReloaderFactory
filePaths []string
duplicateKeysHandling DuplicateKeysHandling
reloaderFactory ReloaderFactory
}

// DataSource returns a configurable builder for a file-based data source.
func DataSource() *DataSourceBuilder {
return &DataSourceBuilder{}
return &DataSourceBuilder{duplicateKeysHandling: DuplicateKeysFail}
}

// DuplicateKeysHandling specifies how to handle keys that are duplicated across files.
//
// If this is not specified, or if you set it to an unrecognized value, the default is DuplicateKeysFail.
func (b *DataSourceBuilder) DuplicateKeysHandling(duplicateKeysHandling DuplicateKeysHandling) *DataSourceBuilder {
b.duplicateKeysHandling = duplicateKeysHandling
return b
}

// FilePaths specifies the input data files. The paths may be any number of absolute or relative file paths.
Expand Down Expand Up @@ -55,5 +77,6 @@ func (b *DataSourceBuilder) CreateDataSource(
context interfaces.ClientContext,
dataSourceUpdates interfaces.DataSourceUpdates,
) (interfaces.DataSource, error) {
return newFileDataSourceImpl(context, dataSourceUpdates, b.filePaths, b.reloaderFactory)
return newFileDataSourceImpl(context, dataSourceUpdates, b.filePaths,
b.duplicateKeysHandling, b.reloaderFactory)
}
50 changes: 31 additions & 19 deletions ldfiledata/file_data_source_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,23 @@ import (
)

type fileDataSource struct {
dataSourceUpdates interfaces.DataSourceUpdates
absFilePaths []string
reloaderFactory ReloaderFactory
loggers ldlog.Loggers
isInitialized bool
readyCh chan<- struct{}
readyOnce sync.Once
closeOnce sync.Once
closeReloaderCh chan struct{}
dataSourceUpdates interfaces.DataSourceUpdates
absFilePaths []string
duplicateKeysHandling DuplicateKeysHandling
reloaderFactory ReloaderFactory
loggers ldlog.Loggers
isInitialized bool
readyCh chan<- struct{}
readyOnce sync.Once
closeOnce sync.Once
closeReloaderCh chan struct{}
}

func newFileDataSourceImpl(
context interfaces.ClientContext,
dataSourceUpdates interfaces.DataSourceUpdates,
filePaths []string,
duplicateKeysHandling DuplicateKeysHandling,
reloaderFactory ReloaderFactory,
) (interfaces.DataSource, error) {
abs, err := absFilePaths(filePaths)
Expand All @@ -46,10 +48,11 @@ func newFileDataSourceImpl(
}

fs := &fileDataSource{
dataSourceUpdates: dataSourceUpdates,
absFilePaths: abs,
reloaderFactory: reloaderFactory,
loggers: context.GetLogging().GetLoggers(),
dataSourceUpdates: dataSourceUpdates,
absFilePaths: abs,
duplicateKeysHandling: duplicateKeysHandling,
reloaderFactory: reloaderFactory,
loggers: context.GetLogging().GetLoggers(),
}
fs.loggers.SetPrefix("FileDataSource:")
return fs, nil
Expand Down Expand Up @@ -102,7 +105,7 @@ func (fs *fileDataSource) reload() {
return
}
}
storeData, err := mergeFileData(filesData...)
storeData, err := mergeFileData(fs.duplicateKeysHandling, filesData...)
if err == nil {
if fs.dataSourceUpdates.Init(storeData) {
fs.signalStartComplete(true)
Expand Down Expand Up @@ -154,9 +157,15 @@ func insertData(
kind ldstoretypes.DataKind,
key string,
data ldstoretypes.ItemDescriptor,
duplicateKeysHandling DuplicateKeysHandling,
) error {
if _, exists := all[kind][key]; exists {
return fmt.Errorf("%s '%s' is specified by multiple files", kind, key)
switch duplicateKeysHandling {
case DuplicateKeysIgnoreAllButFirst:
return nil
default:
return fmt.Errorf("%s '%s' is specified by multiple files", kind, key)
}
}
all[kind][key] = data
return nil
Expand Down Expand Up @@ -185,7 +194,10 @@ func detectJSON(rawData []byte) bool {
return strings.HasPrefix(strings.TrimLeftFunc(string(rawData), unicode.IsSpace), "{")
}

func mergeFileData(allFileData ...fileData) ([]ldstoretypes.Collection, error) {
func mergeFileData(
duplicateKeysHandling DuplicateKeysHandling,
allFileData ...fileData,
) ([]ldstoretypes.Collection, error) {
all := map[ldstoretypes.DataKind]map[string]ldstoretypes.ItemDescriptor{
datakinds.Features: {},
datakinds.Segments: {},
Expand All @@ -195,7 +207,7 @@ func mergeFileData(allFileData ...fileData) ([]ldstoretypes.Collection, error) {
for key, f := range *d.Flags {
ff := f
data := ldstoretypes.ItemDescriptor{Version: f.Version, Item: &ff}
if err := insertData(all, datakinds.Features, key, data); err != nil {
if err := insertData(all, datakinds.Features, key, data, duplicateKeysHandling); err != nil {
return nil, err
}
}
Expand All @@ -204,7 +216,7 @@ func mergeFileData(allFileData ...fileData) ([]ldstoretypes.Collection, error) {
for key, value := range *d.FlagValues {
flag := makeFlagWithValue(key, value)
data := ldstoretypes.ItemDescriptor{Version: flag.Version, Item: flag}
if err := insertData(all, datakinds.Features, key, data); err != nil {
if err := insertData(all, datakinds.Features, key, data, duplicateKeysHandling); err != nil {
return nil, err
}
}
Expand All @@ -213,7 +225,7 @@ func mergeFileData(allFileData ...fileData) ([]ldstoretypes.Collection, error) {
for key, s := range *d.Segments {
ss := s
data := ldstoretypes.ItemDescriptor{Version: s.Version, Item: &ss}
if err := insertData(all, datakinds.Segments, key, data); err != nil {
if err := insertData(all, datakinds.Segments, key, data, duplicateKeysHandling); err != nil {
return nil, err
}
}
Expand Down
76 changes: 51 additions & 25 deletions ldfiledata/file_data_source_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"os"
"testing"

"gopkg.in/launchdarkly/go-server-sdk.v5/interfaces"
"gopkg.in/launchdarkly/go-server-sdk.v5/internal/datakinds"
"gopkg.in/launchdarkly/go-server-sdk.v5/internal/sharedtest"
"gopkg.in/launchdarkly/go-server-sdk.v5/ldcomponents"
Expand All @@ -13,7 +14,6 @@ import (
"gopkg.in/launchdarkly/go-sdk-common.v2/ldlogtest"
"gopkg.in/launchdarkly/go-sdk-common.v2/ldvalue"
"gopkg.in/launchdarkly/go-server-sdk-evaluation.v1/ldmodel"
"gopkg.in/launchdarkly/go-server-sdk.v5/interfaces"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -74,15 +74,11 @@ segments:
p.waitForStart()
require.True(t, p.dataSource.IsInitialized())

flagItem, err := p.updates.DataStore.Get(datakinds.Features, "my-flag")
require.NoError(t, err)
require.NotNil(t, flagItem.Item)
assert.True(t, flagItem.Item.(*ldmodel.FeatureFlag).On)
flag := requireFlag(t, p.updates.DataStore, "my-flag")
assert.True(t, flag.On)

segmentItem, err := p.updates.DataStore.Get(datakinds.Segments, "my-segment")
require.NoError(t, err)
require.NotNil(t, segmentItem.Item)
assert.Empty(t, segmentItem.Item.(*ldmodel.Segment).Rules)
segment := requireSegment(t, p.updates.DataStore, "my-segment")
assert.Empty(t, segment.Rules)
})
})
}
Expand All @@ -94,10 +90,8 @@ func TestNewFileDataSourceJson(t *testing.T) {
p.waitForStart()
require.True(t, p.dataSource.IsInitialized())

flagItem, err := p.updates.DataStore.Get(datakinds.Features, "my-flag")
require.NoError(t, err)
require.NotNil(t, flagItem.Item)
assert.True(t, flagItem.Item.(*ldmodel.FeatureFlag).On)
flag := requireFlag(t, p.updates.DataStore, "my-flag")
assert.True(t, flag.On)
})
})
}
Expand All @@ -122,15 +116,11 @@ func TestNewFileDataSourceJsonWithTwoFiles(t *testing.T) {
p.waitForStart()
require.True(t, p.dataSource.IsInitialized())

flagItem1, err := p.updates.DataStore.Get(datakinds.Features, "my-flag1")
require.NoError(t, err)
require.NotNil(t, flagItem1.Item)
assert.True(t, flagItem1.Item.(*ldmodel.FeatureFlag).On)
flag1 := requireFlag(t, p.updates.DataStore, "my-flag1")
assert.True(t, flag1.On)

flagItem2, err := p.updates.DataStore.Get(datakinds.Features, "my-flag2")
require.NoError(t, err)
require.NotNil(t, flagItem2.Item)
assert.True(t, flagItem2.Item.(*ldmodel.FeatureFlag).On)
flag2 := requireFlag(t, p.updates.DataStore, "my-flag2")
assert.True(t, flag2.On)
})
})
})
Expand All @@ -149,12 +139,35 @@ func TestNewFileDataSourceJsonWithTwoConflictingFiles(t *testing.T) {
withFileDataSourceTestParams(factory, func(p fileDataSourceTestParams) {
p.waitForStart()
require.False(t, p.dataSource.IsInitialized())

p.mockLog.AssertMessageMatch(t, true, ldlog.Error, "specified by multiple files")
})
})
}
})
}

func TestDuplicateKeysHandlingCanSuppressErrors(t *testing.T) {
file1Data := `{"flags": {"flag1": {"on": true}, "flag2": {"on": false}}, "segments": {"segment1": {}}}`
file2Data := `{"flags": {"flag2": {"on": true}}}`

sharedtest.WithTempFileContaining([]byte(file1Data), func(filename1 string) {
sharedtest.WithTempFileContaining([]byte(file2Data), func(filename2 string) {
factory := DataSource().FilePaths(filename1, filename2).
DuplicateKeysHandling(DuplicateKeysIgnoreAllButFirst)
withFileDataSourceTestParams(factory, func(p fileDataSourceTestParams) {
p.waitForStart()
require.True(t, p.dataSource.IsInitialized())

flag2 := requireFlag(t, p.updates.DataStore, "flag2")
assert.False(t, flag2.On)

p.mockLog.AssertMessageMatch(t, false, ldlog.Error, "specified by multiple files")
})
})
})
}

func TestNewFileDataSourceBadData(t *testing.T) {
sharedtest.WithTempFileContaining([]byte(`bad data`), func(filename string) {
factory := DataSource().FilePaths(filename)
Expand Down Expand Up @@ -200,10 +213,9 @@ flagValues:
withFileDataSourceTestParams(factory, func(p fileDataSourceTestParams) {
p.waitForStart()
require.True(t, p.dataSource.IsInitialized())
flagItem, err := p.updates.DataStore.Get(datakinds.Features, "my-flag")
require.NoError(t, err)
require.NotNil(t, flagItem.Item)
assert.Equal(t, []ldvalue.Value{ldvalue.Bool(true)}, flagItem.Item.(*ldmodel.FeatureFlag).Variations)

flag := requireFlag(t, p.updates.DataStore, "my-flag")
assert.Equal(t, []ldvalue.Value{ldvalue.Bool(true)}, flag.Variations)
})
})
}
Expand All @@ -220,3 +232,17 @@ func TestReloaderFailureDoesNotPreventStarting(t *testing.T) {
assert.Len(t, p.mockLog.GetOutput(ldlog.Error), 1)
})
}

func requireFlag(t *testing.T, store interfaces.DataStore, key string) *ldmodel.FeatureFlag {
item, err := store.Get(datakinds.Features, key)
require.NoError(t, err)
require.NotNil(t, item.Item)
return item.Item.(*ldmodel.FeatureFlag)
}

func requireSegment(t *testing.T, store interfaces.DataStore, key string) *ldmodel.Segment {
item, err := store.Get(datakinds.Segments, key)
require.NoError(t, err)
require.NotNil(t, item.Item)
return item.Item.(*ldmodel.Segment)
}
3 changes: 2 additions & 1 deletion ldfiledata/package_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@
//
// It is also possible to specify both "flags" and "flagValues", if you want some flags to have simple
// values and others to have complex behavior. However, it is an error to use the same flag key or
// segment key more than once, either in a single file or across multiple files.
// segment key more than once, either in a single file or across multiple files, unless you specify
// otherwise with the DuplicateKeysHandling method.
//
// If the data source encounters any error in any file-- malformed content, a missing file, or a
// duplicate key-- it will not load flags from any of the files.
Expand Down