Add ability to push events to specific channels * Use Ruby >=2 * Add ability to pass options with symbol keys for create event method
Closes #19 Project: http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/commit/f71cf0e6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/tree/f71cf0e6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/diff/f71cf0e6 Branch: refs/heads/master Commit: f71cf0e6682d79528fcbc4a31ae93db5d8b5f28e Parents: 92ba576 Author: Zh Kostev <[email protected]> Authored: Mon Jun 5 13:39:58 2017 -0700 Committer: Donald Szeto <[email protected]> Committed: Mon Jun 5 13:39:58 2017 -0700 ---------------------------------------------------------------------- .gitignore | 2 ++ Gemfile | 4 ++- README.md | 13 ++++++++ lib/predictionio/event_client.rb | 14 ++++++--- lib/predictionio/version.rb | 2 +- predictionio.gemspec | 2 +- spec/predictionio_spec.rb | 56 +++++++++++++++++++++++++++++++++-- spec/spec_helper.rb | 10 +++++++ 8 files changed, 93 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/blob/f71cf0e6/.gitignore ---------------------------------------------------------------------- diff --git a/.gitignore b/.gitignore index dca2977..29abd6e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ /coverage /doc +.rvmrc +/.idea /pkg *.gem Gemfile.lock http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/blob/f71cf0e6/Gemfile ---------------------------------------------------------------------- diff --git a/Gemfile b/Gemfile index fcf42f9..9bb1435 100644 --- a/Gemfile +++ b/Gemfile @@ -8,4 +8,6 @@ end group :doc do gem 'rdoc', '~> 4.0.0' -end \ No newline at end of file +end + +gem 'activesupport', '~> 4.2' \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/blob/f71cf0e6/README.md ---------------------------------------------------------------------- diff --git a/README.md b/README.md index 77655dd..56828ef 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,19 @@ client.create_event( ) ``` +### Create a $set` item event and send it to Event Server to specific channel + +*NOTE:* channels are supported in PIO version >= 0.9.2 only. Channel must be created first. + +```ruby +client.create_event( + '$set', + 'item', + item_id, + { 'properties' => { 'categories' => ['Category 1', 'Category 2'], 'channel' => 'test-channel'} } +) +``` + ### Create a user 'rate' item event and send it to Event Server ```ruby http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/blob/f71cf0e6/lib/predictionio/event_client.rb ---------------------------------------------------------------------- diff --git a/lib/predictionio/event_client.rb b/lib/predictionio/event_client.rb index 2fda24e..75428e8 100644 --- a/lib/predictionio/event_client.rb +++ b/lib/predictionio/event_client.rb @@ -6,6 +6,7 @@ require 'date' require "net/http" +require 'active_support/core_ext/hash' module PredictionIO # This class contains methods that interface with the PredictionIO Event @@ -110,14 +111,19 @@ module PredictionIO # # See also #create_event. def acreate_event(event, entity_type, entity_id, optional = {}) - h = optional + h = optional.with_indifferent_access h.key?('eventTime') || h['eventTime'] = DateTime.now.to_s h['event'] = event h['entityType'] = entity_type h['entityId'] = entity_id - @http.apost(PredictionIO::AsyncRequest.new( - "/events.json?accessKey=#{@access_key}", h.to_json - )) + @http.apost(PredictionIO::AsyncRequest.new(event_path_with_main_params(h), h.except(:channel).to_json)) + end + + def event_path_with_main_params(options) + result = "/events.json?accessKey=#{@access_key}" + result += "&channel=#{options[:channel]}" if options[:channel] + + result end # :category: Asynchronous Methods http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/blob/f71cf0e6/lib/predictionio/version.rb ---------------------------------------------------------------------- diff --git a/lib/predictionio/version.rb b/lib/predictionio/version.rb index cb49861..f0d9c70 100644 --- a/lib/predictionio/version.rb +++ b/lib/predictionio/version.rb @@ -1,3 +1,3 @@ module PredictionIO - VERSION = '0.9.6' + VERSION = '0.9.7' end http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/blob/f71cf0e6/predictionio.gemspec ---------------------------------------------------------------------- diff --git a/predictionio.gemspec b/predictionio.gemspec index 13b651d..4a86f4e 100644 --- a/predictionio.gemspec +++ b/predictionio.gemspec @@ -16,7 +16,7 @@ EOF s.email = '[email protected]' s.homepage = 'http://prediction.io/' s.platform = Gem::Platform::RUBY - s.required_ruby_version = '>= 1.9.3' + s.required_ruby_version = '>= 2.0' s.files = Dir[File.join('lib', '**', '**')] s.add_runtime_dependency 'json', '~> 1.8' end http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/blob/f71cf0e6/spec/predictionio_spec.rb ---------------------------------------------------------------------- diff --git a/spec/predictionio_spec.rb b/spec/predictionio_spec.rb index d400898..91d8704 100644 --- a/spec/predictionio_spec.rb +++ b/spec/predictionio_spec.rb @@ -1,16 +1,66 @@ require 'predictionio' require 'spec_helper' -event_client = PredictionIO::EventClient.new(1, 'http://fakeapi.com:7070', 10) -engine_client = PredictionIO::EngineClient.new('http://fakeapi.com:8000', 10) - describe PredictionIO do + let(:access_key) { 1 } + let(:event_client) { PredictionIO::EventClient.new(access_key, 'http://fakeapi.com:7070', 10) } + let(:engine_client) { PredictionIO::EngineClient.new('http://fakeapi.com:8000', 10) } + describe 'Events API' do it 'create_event should create an event' do response = event_client.create_event('register', 'user', 'foobar') expect(response.code).to eq('201') end + context 'with http stub (for channel test)' do + before(:each) do + success_response = Net::HTTPCreated.new('HTTP/1.1', '201', 'Created') + success_response.body = JSON.generate(eventId: 'deadbeef00') + expect_any_instance_of(PredictionIO::Connection).to receive(:apost).and_return(double(get: success_response)) + end + + it 'create_event should have channel option (symbol)' do + expect(PredictionIO::AsyncRequest). + to receive(:new).with("/events.json?accessKey=#{access_key}&channel=test-channel", + { + "eventTime" => "2017-03-22T12:26:35+03:00", "event" => "$set", + "entityType" => "Session", "entityId" => "42" + }.to_json) + event_client.create_event('$set', 'Session', '42', + {channel: 'test-channel', 'eventTime' => "2017-03-22T12:26:35+03:00"}) + end + + it 'create_event should process channel option (string)' do + expect(PredictionIO::AsyncRequest). + to receive(:new).with("/events.json?accessKey=#{access_key}&channel=test-channel", + { + "eventTime" => "2017-03-22T12:26:35+03:00", "event" => "$set", + "entityType" => "Session", "entityId" => "42" + }.to_json) + response = event_client.create_event('$set', 'Session', '42', + { 'channel' => 'test-channel', 'eventTime' => "2017-03-22T12:26:35+03:00" }) + expect(response.code).to eq('201') + end + + it 'create_event should work without channel option' do + expect(PredictionIO::AsyncRequest). + to receive(:new).with("/events.json?accessKey=#{access_key}", + { + "eventTime" => "2017-03-22T12:26:35+03:00", "event" => "$set", + "entityType" => "Session", "entityId" => "42" + }.to_json) + response = event_client.create_event('$set', 'Session', '42', + { 'eventTime' => "2017-03-22T12:26:35+03:00" }) + expect(response.code).to eq('201') + end + end + + it 'create_event should post real request with channel option' do + response = event_client.create_event('$set', 'Session', '42', + { 'channel' => 'test-channel', 'eventTime' => "2017-03-22T12:26:35+03:00" }) + expect(response.code).to eq('201') + end + it 'create_event should not raise an error' do response = event_client.create_event('register', 'user', 'foobar') expect{ response }.to_not raise_error http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-ruby/blob/f71cf0e6/spec/spec_helper.rb ---------------------------------------------------------------------- diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index dd2a85b..11ab902 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -8,6 +8,16 @@ WebMock.disable_net_connect!(allow_localhost: true) RSpec.configure do |config| config.before(:each) do # Events API + %w( + http://fakeapi.com:7070/events.json?accessKey=1&channel=test-channel + ).each do |url| + stub_request(:post, url) + .with(body: hash_including(event: '$set', + entityType: 'Session', + entityId: '42')) + .to_return(status: 201, body: JSON.generate(eventId: 'deadbeef00')) + end + stub_request(:post, 'http://fakeapi.com:7070/events.json?accessKey=1') .with(body: hash_including(event: 'register', entityType: 'user',
