diff --git a/lib/flagsmith.rb b/lib/flagsmith.rb index 5bcef1e..6e0464e 100644 --- a/lib/flagsmith.rb +++ b/lib/flagsmith.rb @@ -7,11 +7,14 @@ # This is the patch to use slice in earler versions require 'flagsmith/hash_slice' +require 'flagsmith/version' + require 'flagsmith/sdk/analytics_processor' require 'flagsmith/sdk/api_client' require 'flagsmith/sdk/config' require 'flagsmith/sdk/errors' require 'flagsmith/sdk/intervals' +require 'flagsmith/sdk/utils' require 'flagsmith/sdk/pooling_manager' require 'flagsmith/sdk/models/flags' require 'flagsmith/sdk/models/segments' diff --git a/lib/flagsmith/sdk/api_client.rb b/lib/flagsmith/sdk/api_client.rb index d8dc1d9..fc16eb3 100644 --- a/lib/flagsmith/sdk/api_client.rb +++ b/lib/flagsmith/sdk/api_client.rb @@ -31,6 +31,7 @@ def build_headers(faraday, config) faraday.headers['Accept'] = 'application/json' faraday.headers['Content-Type'] = 'application/json' faraday.headers['X-Environment-Key'] = config.environment_key + faraday.headers['User-Agent'] = Flagsmith::SDK::Utils.user_agent faraday.headers.merge(config.custom_headers) end diff --git a/lib/flagsmith/sdk/utils.rb b/lib/flagsmith/sdk/utils.rb new file mode 100644 index 0000000..3c0d8f8 --- /dev/null +++ b/lib/flagsmith/sdk/utils.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Flagsmith + module SDK + # Utility functions + module Utils + FLAGSMITH_USER_AGENT = 'flagsmith-ruby-sdk' + FLAGSMITH_UNKNOWN_VERSION = 'unknown' + + module_function + + # Returns the user agent string for HTTP requests + # @return [String] user agent in format "flagsmith-ruby-sdk/version" + def user_agent + "#{FLAGSMITH_USER_AGENT}/#{version}" + end + + # Returns the SDK version + # @return [String] version string or 'unknown' if not available + def version + return Flagsmith::VERSION if defined?(Flagsmith::VERSION) + + FLAGSMITH_UNKNOWN_VERSION + rescue StandardError + FLAGSMITH_UNKNOWN_VERSION + end + end + end +end diff --git a/spec/sdk/api_client_spec.rb b/spec/sdk/api_client_spec.rb new file mode 100644 index 0000000..9da806b --- /dev/null +++ b/spec/sdk/api_client_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Flagsmith::ApiClient do + let(:config) do + Flagsmith::Config.new( + environment_key: 'test-key', + api_url: 'https://edge.api.flagsmith.com/api/v1/' + ) + end + + describe 'headers' do + it 'sets User-Agent header with SDK version' do + api_client = described_class.new(config) + connection = api_client.instance_variable_get(:@conn) + + expected_user_agent = "flagsmith-ruby-sdk/#{Flagsmith::VERSION}" + expect(connection.headers['User-Agent']).to eq(expected_user_agent) + end + end +end diff --git a/spec/sdk/utils_spec.rb b/spec/sdk/utils_spec.rb new file mode 100644 index 0000000..cf725eb --- /dev/null +++ b/spec/sdk/utils_spec.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Flagsmith::SDK::Utils do + describe '.user_agent' do + it 'returns user agent with version' do + expected_user_agent = "flagsmith-ruby-sdk/#{Flagsmith::VERSION}" + expect(described_class.user_agent).to eq(expected_user_agent) + end + + it 'includes the correct format' do + user_agent = described_class.user_agent + expect(user_agent).to match(/^flagsmith-ruby-sdk\/\d+\.\d+\.\d+$/) + end + end + + describe '.version' do + it 'returns the Flagsmith version' do + expect(described_class.version).to eq(Flagsmith::VERSION) + end + + it 'returns a non-empty string' do + expect(described_class.version).to be_a(String) + expect(described_class.version).not_to be_empty + end + + context 'when VERSION constant is not available' do + it 'returns unknown as fallback' do + version_backup = Flagsmith::VERSION + Flagsmith.send(:remove_const, :VERSION) + + expect(described_class.version).to eq('unknown') + + Flagsmith.const_set(:VERSION, version_backup) + end + end + end +end