diff --git a/.gitignore b/.gitignore index b4319b1..24302a3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .rspec Gemfile.lock *.swp +.bundle diff --git a/README.md b/README.md index d86d7ee..8792811 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ gem install tempodb-1.0.0.gem require 'tempodb' client = TempoDB::Client.new('database_id', 'api_key', 'api_secret') -client.create_series("temp-1') +client.create_series('temp-1') client.list_series ``` diff --git a/lib/tempodb.rb b/lib/tempodb.rb index b726178..6d53a57 100644 --- a/lib/tempodb.rb +++ b/lib/tempodb.rb @@ -1,6 +1,7 @@ require 'rubygems' require 'tempodb/client' +require 'tempodb/config' module TempoDB API_HOST = "api.tempo-db.com" @@ -8,5 +9,42 @@ module TempoDB API_VERSION = "v1" TRUSTED_CERT_FILE = File.join(File.dirname(__FILE__), "trusted-certs.crt") + + class << self + + def config + @config ||= Config.new + end + + # Configure a default TempoDB API Client + # + # ==== Example + # + # TempoDB.configure do |config| + # config.database_id = 'database_id' + # config.key = 'api_key' + # config.secret = 'api_secret' + # end + # + def configure + yield(config) + self.client = nil + end + + attr_writer :client + + def client + @client ||= Client.new(*config.to_a) + end + + # Delegate every public instance method of Client to TempoDB.client + Client.public_instance_methods(false).each do |method| + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(*args, &block) + client.#{method}(*args, &block) + end + RUBY + end + end end diff --git a/lib/tempodb/config.rb b/lib/tempodb/config.rb new file mode 100644 index 0000000..c63c3ee --- /dev/null +++ b/lib/tempodb/config.rb @@ -0,0 +1,18 @@ +module TempoDB + class Config + + OPTIONS = [:database_id, :api_key, :api_secret, :host, :port, :secure].freeze + + attr_accessor *OPTIONS + + def initialize + @host = TempoDB::API_HOST + @port = TempoDB::API_PORT + @secure = true + end + + def to_a + OPTIONS.collect { |option| send(option) } + end + end +end diff --git a/spec/client_spec.rb b/spec/tempodb/client_spec.rb similarity index 100% rename from spec/client_spec.rb rename to spec/tempodb/client_spec.rb diff --git a/spec/tempodb/config_spec.rb b/spec/tempodb/config_spec.rb new file mode 100644 index 0000000..6a11fba --- /dev/null +++ b/spec/tempodb/config_spec.rb @@ -0,0 +1,52 @@ +require 'spec_helper' + +describe TempoDB::Config do + + subject(:config) do + described_class.new + end + + it 'initializes with default host' do + expect(config.host).to eq('api.tempo-db.com') + end + + it 'initializes with default port' do + expect(config.port).to eq(443) + end + + it 'initializes with default secure' do + expect(config.secure).to be true + end + + [:database_id, :api_key, :api_secret, :host, :port, :secure].each do |option| + + describe "#{option}" do + + it 'is a configurable option' do + config.send(:"#{option}=", 'foo') + expect(config.send(option)).to eq('foo') + end + end + end + + describe '#to_a' do + + let(:config) do + TempoDB::Config.new.tap do |config| + config.database_id = 'database' + config.api_key = 'key' + config.api_secret = 'secret' + end + end + + subject(:array) do + config.to_a + end + + it 'returns array of config values for Client#initialize' do + expect(array).to eq([ + 'database', 'key', 'secret', 'api.tempo-db.com', 443, true + ]) + end + end +end diff --git a/spec/tempodb_spec.rb b/spec/tempodb_spec.rb new file mode 100644 index 0000000..63eacda --- /dev/null +++ b/spec/tempodb_spec.rb @@ -0,0 +1,73 @@ +require 'spec_helper' + +describe TempoDB do + + after do + TempoDB.instance_variable_set :@client, nil + TempoDB.instance_variable_set :@config, nil + end + + describe '.config' do + + it 'returns same instance of Config' do + expect(TempoDB.config).to be_a(TempoDB::Config) + expect(TempoDB.config.object_id).to eq(TempoDB.config.object_id) + end + end + + describe '.configure' do + + it 'yields TempoDB.config' do + expect { |b| TempoDB.configure(&b) }.to yield_with_args(TempoDB.config) + end + + it 'reinitializes TempoDB client' do + original_client = TempoDB.client + TempoDB.configure do |config| + config.database_id = 'foo' + end + expect(original_client.object_id).not_to eq(TempoDB.client.object_id) + end + end + + describe '.client' do + + before do + TempoDB.configure do |config| + config.database_id = 'mydb' + config.api_key = 'api_key' + config.api_secret = 's3cr3t!' + config.host = 'example.com' + config.port = 1337 + config.secure = false + end + end + + it 'initializes Client with TempoDB config' do + expect(TempoDB::Client).to receive(:new).with( + 'mydb', 'api_key', 's3cr3t!', 'example.com', 1337, false + ) + TempoDB.client + end + + it 'returns same Client instance' do + expect(TempoDB::Client.object_id).to eq(TempoDB::Client.object_id) + end + end + + [ + :session, :create_series, :delete_series, :get_series, :list_series, + :update_series, :read_data, :get_summary, :read_multi_rollups, :find_data, + :aggregate_data, :read_multi, :write_data, :write_multi, :single_value, + :multi_series_single_value, :delete_data + ].each do |method| + + describe ".#{method}" do + + it 'delegates to TempoDB.client' do + expect(TempoDB.client).to receive(method) + TempoDB.send(method) + end + end + end +end