class Stenotype::Adapters::GoogleCloud
An adapter implementing method {#publish} to send data to Google Cloud PubSub
@example A general usage within some method in the class
class EventEmittingClass def method_emitting_enent result_of_calculations = collect_some_data gc_adapter.publish(result_of_calculation, additional: :data, more: :data) result_of_calculations end def gc_adapter Stenotype::Adapters::GoogleCloud.new end end
@example Overriding a client
class EventEmittingClass def method_emitting_enent result_of_calculations = collect_some_data gc_adapter.publish(result_of_calculation, additional: :data, more: :data) result_of_calculations end def gc_adapter Stenotype::Adapters::GoogleCloud.new(client: CustomGcClient.new) end end
Public Instance Methods
auto_initialize!()
click to toggle source
If not called both client and topic are lazy initialized on first call (if not passed to initialize). auto_initialize!
is going to explicitly initialize both client and topic.
# File lib/stenotype/adapters/google_cloud.rb, line 74 def auto_initialize! client topic end
flush!()
click to toggle source
Flushes the topic's async queue
# File lib/stenotype/adapters/google_cloud.rb, line 62 def flush! # a publisher might be uninitialized until the first event is published return unless topic.async_publisher topic.async_publisher.stop.wait! end
publish(event_data, **additional_attrs)
click to toggle source
@param event_data {String} The data to be published to Google Cloud @raise {Stenotype::MessageNotPublishedError} unless message is published
@example With default client
google_cloud_adapter = Stenotype::Adapters::GoogleCloud.new # publishes to default client google_cloud_adapter.publish({ event: :data }, { additional: :data })
@example With client override
google_cloud_adapter = Stenotype::Adapters::GoogleCloud.new(CustomGCClient.new) # publishes to default CustomGCClient google_cloud_adapter.publish({ event: :data }, { additional: :data })
# File lib/stenotype/adapters/google_cloud.rb, line 51 def publish(event_data, **additional_attrs) if config.async publish_async(event_data, **additional_attrs) else publish_sync(event_data, **additional_attrs) end end
Private Instance Methods
client()
click to toggle source
:nocov:
# File lib/stenotype/adapters/google_cloud.rb, line 92 def client @client ||= Google::Cloud::PubSub.new(project_id: config.project_id, credentials: config.credentials) end
config()
click to toggle source
# File lib/stenotype/adapters/google_cloud.rb, line 103 def config Stenotype.config.google_cloud end
publish_async(event_data, **additional_attrs)
click to toggle source
# File lib/stenotype/adapters/google_cloud.rb, line 85 def publish_async(event_data, **additional_attrs) topic.publish_async(event_data, additional_attrs) do |result| raise Stenotype::MessageNotPublishedError unless result.succeeded? end end
publish_sync(event_data, **additional_attrs)
click to toggle source
# File lib/stenotype/adapters/google_cloud.rb, line 81 def publish_sync(event_data, **additional_attrs) topic.publish(event_data, additional_attrs) end
topic()
click to toggle source
Use memoization, otherwise a new topic will be created every time. And a new async_publisher will be created. :nocov:
# File lib/stenotype/adapters/google_cloud.rb, line 99 def topic @topic ||= client.topic config.topic end