diff --git a/Gemfile.lock b/Gemfile.lock index c04d73aa..54bb3bc9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,92 +3,81 @@ PATH specs: launchdarkly-server-sdk (5.8.0) concurrent-ruby (~> 1.0) - json (>= 1.8, < 3) + json (~> 2.3.1) ld-eventsource (= 1.0.3) semantic (~> 1.6) GEM remote: https://rubygems.org/ specs: - aws-eventstream (1.0.1) - aws-partitions (1.128.0) - aws-sdk-core (3.44.2) - aws-eventstream (~> 1.0) - aws-partitions (~> 1.0) - aws-sigv4 (~> 1.0) + aws-eventstream (1.1.0) + aws-partitions (1.388.0) + aws-sdk-core (3.109.1) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.239.0) + aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-dynamodb (1.19.0) - aws-sdk-core (~> 3, >= 3.39.0) - aws-sigv4 (~> 1.0) - aws-sigv4 (1.0.3) - codeclimate-test-reporter (0.6.0) - simplecov (>= 0.7.1, < 1.0.0) - concurrent-ruby (1.1.6) - connection_pool (2.2.1) - diff-lcs (1.3) - diplomat (2.0.2) - faraday (~> 0.9) - json - docile (1.1.5) - faraday (0.15.4) + aws-sdk-dynamodb (1.55.0) + aws-sdk-core (~> 3, >= 3.109.0) + aws-sigv4 (~> 1.1) + aws-sigv4 (1.2.2) + aws-eventstream (~> 1, >= 1.0.2) + concurrent-ruby (1.1.7) + connection_pool (2.2.3) + deep_merge (1.2.1) + diff-lcs (1.4.4) + diplomat (2.4.2) + deep_merge (~> 1.0, >= 1.0.1) + faraday (>= 0.9, < 1.1.0) + faraday (0.17.3) multipart-post (>= 1.2, < 3) - ffi (1.9.25) - ffi (1.9.25-java) + ffi (1.12.0) hitimes (1.3.1) - hitimes (1.3.1-java) http_tools (0.4.5) jmespath (1.4.0) - json (1.8.6) - json (1.8.6-java) + json (2.3.1) ld-eventsource (1.0.3) concurrent-ruby (~> 1.0) http_tools (~> 0.4.5) socketry (~> 0.5.1) - listen (3.1.5) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - ruby_dep (~> 1.2) - multipart-post (2.0.0) - rb-fsevent (0.10.3) - rb-inotify (0.9.10) - ffi (>= 0.5.0, < 2) + listen (3.2.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + multipart-post (2.1.1) + rb-fsevent (0.10.4) + rb-inotify (0.10.1) + ffi (~> 1.0) redis (3.3.5) - rspec (3.7.0) - rspec-core (~> 3.7.0) - rspec-expectations (~> 3.7.0) - rspec-mocks (~> 3.7.0) - rspec-core (3.7.1) - rspec-support (~> 3.7.0) - rspec-expectations (3.7.0) + rspec (3.9.0) + rspec-core (~> 3.9.0) + rspec-expectations (~> 3.9.0) + rspec-mocks (~> 3.9.0) + rspec-core (3.9.3) + rspec-support (~> 3.9.3) + rspec-expectations (3.9.3) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.7.0) - rspec-mocks (3.7.0) + rspec-support (~> 3.9.0) + rspec-mocks (3.9.1) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.7.0) - rspec-support (3.7.0) + rspec-support (~> 3.9.0) + rspec-support (3.9.4) rspec_junit_formatter (0.3.0) rspec-core (>= 2, < 4, != 2.12.0) - ruby_dep (1.5.0) semantic (1.6.1) - simplecov (0.15.1) - docile (~> 1.1.0) - json (>= 1.8, < 3) - simplecov-html (~> 0.10.0) - simplecov-html (0.10.2) socketry (0.5.1) hitimes (~> 1.2) - timecop (0.9.1) + timecop (0.9.2) PLATFORMS - java ruby DEPENDENCIES aws-sdk-dynamodb (~> 1.18) - bundler (~> 1.7) - codeclimate-test-reporter (~> 0) + bundler (~> 1.17) connection_pool (>= 2.1.2) diplomat (>= 2.0.2) + faraday (~> 0.17) + ffi (<= 1.12) launchdarkly-server-sdk! listen (~> 3.0) redis (~> 3.3.5) diff --git a/launchdarkly-server-sdk.gemspec b/launchdarkly-server-sdk.gemspec index 67b39daf..b8493985 100644 --- a/launchdarkly-server-sdk.gemspec +++ b/launchdarkly-server-sdk.gemspec @@ -21,18 +21,25 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_development_dependency "aws-sdk-dynamodb", "~> 1.18" - spec.add_development_dependency "bundler", "~> 1.7" + spec.add_development_dependency "bundler", "~> 1.17" spec.add_development_dependency "rspec", "~> 3.2" - spec.add_development_dependency "codeclimate-test-reporter", "~> 0" spec.add_development_dependency "diplomat", ">= 2.0.2" spec.add_development_dependency "redis", "~> 3.3.5" spec.add_development_dependency "connection_pool", ">= 2.1.2" spec.add_development_dependency "rspec_junit_formatter", "~> 0.3.0" spec.add_development_dependency "timecop", "~> 0.9.1" spec.add_development_dependency "listen", "~> 3.0" # see file_data_source.rb + # these are transitive dependencies of listen and consul respectively + # we constrain them here to make sure the ruby 2.2, 2.3, and 2.4 CI + # cases all pass + spec.add_development_dependency "ffi", "<= 1.12" # >1.12 doesnt support ruby 2.2 + spec.add_development_dependency "faraday", "~> 0.17" # >=0.18 doesnt support ruby 2.2 - spec.add_runtime_dependency "json", [">= 1.8", "< 3"] spec.add_runtime_dependency "semantic", "~> 1.6" spec.add_runtime_dependency "concurrent-ruby", "~> 1.0" spec.add_runtime_dependency "ld-eventsource", "1.0.3" + + # lock json to 2.3.x as ruby libraries often remove + # support for older ruby versions in minor releases + spec.add_runtime_dependency "json", "~> 2.3.1" end diff --git a/lib/ldclient-rb/ldclient.rb b/lib/ldclient-rb/ldclient.rb index 1dc0cc25..7ea48345 100644 --- a/lib/ldclient-rb/ldclient.rb +++ b/lib/ldclient-rb/ldclient.rb @@ -363,12 +363,12 @@ def create_default_data_source(sdk_key, config, diagnostic_accumulator) return NullUpdateProcessor.new end raise ArgumentError, "sdk_key must not be nil" if sdk_key.nil? # see LDClient constructor comment on sdk_key - requestor = Requestor.new(sdk_key, config) if config.stream? - StreamProcessor.new(sdk_key, config, requestor, diagnostic_accumulator) + StreamProcessor.new(sdk_key, config, diagnostic_accumulator) else config.logger.info { "Disabling streaming API" } config.logger.warn { "You should only disable the streaming API if instructed to do so by LaunchDarkly support" } + requestor = Requestor.new(sdk_key, config) PollingProcessor.new(config, requestor) end end diff --git a/lib/ldclient-rb/requestor.rb b/lib/ldclient-rb/requestor.rb index eae0a193..378a1a35 100644 --- a/lib/ldclient-rb/requestor.rb +++ b/lib/ldclient-rb/requestor.rb @@ -26,14 +26,6 @@ def initialize(sdk_key, config) @cache = @config.cache_store end - def request_flag(key) - make_request("/sdk/latest-flags/" + key) - end - - def request_segment(key) - make_request("/sdk/latest-segments/" + key) - end - def request_all_data() make_request("/sdk/latest-all") end diff --git a/lib/ldclient-rb/stream.rb b/lib/ldclient-rb/stream.rb index e27fad32..00791eb3 100644 --- a/lib/ldclient-rb/stream.rb +++ b/lib/ldclient-rb/stream.rb @@ -10,10 +10,6 @@ module LaunchDarkly # @private DELETE = :delete # @private - INDIRECT_PUT = :'indirect/put' - # @private - INDIRECT_PATCH = :'indirect/patch' - # @private READ_TIMEOUT_SECONDS = 300 # 5 minutes; the stream should send a ping every 3 minutes # @private @@ -24,11 +20,10 @@ module LaunchDarkly # @private class StreamProcessor - def initialize(sdk_key, config, requestor, diagnostic_accumulator = nil) + def initialize(sdk_key, config, diagnostic_accumulator = nil) @sdk_key = sdk_key @config = config @feature_store = config.feature_store - @requestor = requestor @initialized = Concurrent::AtomicBoolean.new(false) @started = Concurrent::AtomicBoolean.new(false) @stopped = Concurrent::AtomicBoolean.new(false) @@ -112,24 +107,6 @@ def process_message(message) break end end - elsif method == INDIRECT_PUT - all_data = @requestor.request_all_data - @feature_store.init({ - FEATURES => all_data[:flags], - SEGMENTS => all_data[:segments] - }) - @initialized.make_true - @config.logger.info { "[LDClient] Stream initialized (via indirect message)" } - elsif method == INDIRECT_PATCH - key = key_for_path(FEATURES, message.data) - if key - @feature_store.upsert(FEATURES, @requestor.request_flag(key)) - else - key = key_for_path(SEGMENTS, message.data) - if key - @feature_store.upsert(SEGMENTS, @requestor.request_segment(key)) - end - end else @config.logger.warn { "[LDClient] Unknown message received: #{method}" } end diff --git a/spec/requestor_spec.rb b/spec/requestor_spec.rb index 6833ea1f..6751517a 100644 --- a/spec/requestor_spec.rb +++ b/spec/requestor_spec.rb @@ -193,38 +193,4 @@ def with_requestor(base_uri, opts = {}) end end end - - describe "request_flag" do - it "uses expected URI and headers" do - with_server do |server| - with_requestor(server.base_uri.to_s) do |requestor| - server.setup_ok_response("/", "{}") - requestor.request_flag("key") - expect(server.requests.count).to eq 1 - expect(server.requests[0].unparsed_uri).to eq "/sdk/latest-flags/key" - expect(server.requests[0].header).to include({ - "authorization" => [ $sdk_key ], - "user-agent" => [ "RubyClient/" + LaunchDarkly::VERSION ] - }) - end - end - end - end - - describe "request_segment" do - it "uses expected URI and headers" do - with_server do |server| - with_requestor(server.base_uri.to_s) do |requestor| - server.setup_ok_response("/", "{}") - requestor.request_segment("key") - expect(server.requests.count).to eq 1 - expect(server.requests[0].unparsed_uri).to eq "/sdk/latest-segments/key" - expect(server.requests[0].header).to include({ - "authorization" => [ $sdk_key ], - "user-agent" => [ "RubyClient/" + LaunchDarkly::VERSION ] - }) - end - end - end - end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 52926ac1..8438ecc2 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,6 +1,3 @@ -require "codeclimate-test-reporter" -CodeClimate::TestReporter.start - require "ldclient-rb" $null_log = ::Logger.new($stdout) diff --git a/spec/stream_spec.rb b/spec/stream_spec.rb index 648833ff..39c678c4 100644 --- a/spec/stream_spec.rb +++ b/spec/stream_spec.rb @@ -4,8 +4,7 @@ describe LaunchDarkly::StreamProcessor do subject { LaunchDarkly::StreamProcessor } let(:config) { LaunchDarkly::Config.new } - let(:requestor) { double() } - let(:processor) { subject.new("sdk_key", config, requestor) } + let(:processor) { subject.new("sdk_key", config) } describe '#process_message' do let(:put_message) { SSE::StreamEvent.new(:put, '{"data":{"flags":{"asdf": {"key": "asdf"}},"segments":{"segkey": {"key": "segkey"}}}}') } @@ -13,8 +12,6 @@ let(:patch_seg_message) { SSE::StreamEvent.new(:patch, '{"path": "/segments/key", "data": {"key": "asdf", "version": 1}}') } let(:delete_flag_message) { SSE::StreamEvent.new(:delete, '{"path": "/flags/key", "version": 2}') } let(:delete_seg_message) { SSE::StreamEvent.new(:delete, '{"path": "/segments/key", "version": 2}') } - let(:indirect_patch_flag_message) { SSE::StreamEvent.new(:'indirect/patch', "/flags/key") } - let(:indirect_patch_segment_message) { SSE::StreamEvent.new(:'indirect/patch', "/segments/key") } it "will accept PUT methods" do processor.send(:process_message, put_message) @@ -39,18 +36,6 @@ processor.send(:process_message, delete_seg_message) expect(config.feature_store.get(LaunchDarkly::SEGMENTS, "key")).to eq(nil) end - it "will accept INDIRECT PATCH method for flags" do - flag = { key: 'key', version: 1 } - allow(requestor).to receive(:request_flag).with(flag[:key]).and_return(flag) - processor.send(:process_message, indirect_patch_flag_message); - expect(config.feature_store.get(LaunchDarkly::FEATURES, flag[:key])).to eq(flag) - end - it "will accept INDIRECT PATCH method for segments" do - segment = { key: 'key', version: 1 } - allow(requestor).to receive(:request_segment).with(segment[:key]).and_return(segment) - processor.send(:process_message, indirect_patch_segment_message); - expect(config.feature_store.get(LaunchDarkly::SEGMENTS, segment[:key])).to eq(segment) - end it "will log a warning if the method is not recognized" do expect(processor.instance_variable_get(:@config).logger).to receive :warn processor.send(:process_message, SSE::StreamEvent.new(type: :get, data: "", id: nil))