pubsub_client 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2508e7f65206f72e0092d048d71416a77bf1391fcda8a13e43fbd50c2a4ae561
4
- data.tar.gz: 7d1f9e9b1e0f9e6af43d732da015a08cb04cc7983237fd6ed4e5a24cd94f58c9
3
+ metadata.gz: 13c10d53daf5538c3aca168f2cee4ba8926bc6796bf77653fb9b9a87d2b26f72
4
+ data.tar.gz: eb7a89953c274694319285cb9350803d7b13f31a99e2bd1d365e074460ab06ce
5
5
  SHA512:
6
- metadata.gz: 016b31843467a3de64bf9331650ce2ca371fd11c3ebe19e6c2b99e905407ad745e793c56ec08831e20e173f45e4cc13f89eb36a07f5eae33669fc4488c2acbc0
7
- data.tar.gz: d07b99e406fe71164285e94624b53c0355ad8c9ac9c2fd2cbc2738f38fd19a3b1baef6845053000bf20cd21aa4ca4cc723c1d1e006da4b2a9c15859aad9145bb
6
+ metadata.gz: 81e5cbdad71787603ab5d5a6d2ac7802a7cc8e9bb40fe4414d5c87a4935ca266ad0afa0efb0fa48b03b2f8ccdaefe3963054614e6b25db359381758849e82e60
7
+ data.tar.gz: 289d015b198b809a9683b5d7594ffcbd98a70ce964a2ab4471ab42bba3f83e0de1dbe0a3bd29cbd19ea5498e6f4e85a171658a7a60f326393d019361125dd7f6
@@ -0,0 +1,7 @@
1
+ Version 1.0.0 2020-09-24
2
+ ------------------------
3
+ 396f5f8 Allow publishing to any topic
4
+
5
+ Version 0.1.0 2020-08-25
6
+ ------------------------
7
+ 92a2e7a Initial release
data/README.md CHANGED
@@ -20,30 +20,23 @@ Or install it yourself as:
20
20
 
21
21
  ## Configuration
22
22
 
23
- In order to use this gem, the environment variable `GOOGLE_APPLICATION_CREDENTIALS` must be set and point to the credentials JSON file. Additionally, here are configuration settings that may need to be set:
24
- - `topic_name` (required unless stubbed) - name of the Google Cloud Pub/Sub topic to publish messages to.
23
+ In order to use this gem, the environment variable `GOOGLE_APPLICATION_CREDENTIALS` must be set and point to the credentials JSON file.
25
24
 
26
- If there are environments where setting up credentials is too burdensome and/or publishing messages is not desired, `PubsubClient` can be stubbed out with `PubsubClient.stub!`
27
-
28
- E.g.
25
+ If there are environments where setting up credentials is too burdensome and/or publishing messages is not desired, `PubsubClient` can be stubbed out with `PubsubClient.stub!`, e.g.
29
26
 
30
27
  ```ruby
31
28
  if test_env?
32
29
  PubsubClient.stub!
33
- else
34
- PubsubClient.configure do |config|
35
- config.topic_name = 'some-topic'
36
- end
37
30
  end
38
31
  ```
39
32
 
40
33
  ## Usage
41
34
 
42
- To publish a message to Pub/Sub, call `PubsubClient.publish(message)`. This method takes any serializable object as an argument and yields a result object to a block. The `result` object has a method `#succeeded?` that returns `true` if the message was successfully published, otherwise `false`. In the latter case, there is a method `#error` that returns the error.
35
+ To publish a message to Pub/Sub, call `PubsubClient.publish(message, 'the-topic')`. This method takes any serializable object as an argument and yields a result object to a block. The `result` object has a method `#succeeded?` that returns `true` if the message was successfully published, otherwise `false`. In the latter case, there is a method `#error` that returns the error.
43
36
 
44
37
  ### Example
45
38
  ```ruby
46
- PubsubClient.publish(message) do |result|
39
+ PubsubClient.publish(message, 'some-topic') do |result|
47
40
  if result.succeeded?
48
41
  puts 'yay!'
49
42
  else
@@ -4,40 +4,17 @@ require 'pubsub_client/publisher_factory'
4
4
 
5
5
  module PubsubClient
6
6
  Error = Class.new(StandardError)
7
- CredentialsError = Class.new(Error)
8
7
  ConfigurationError = Class.new(Error)
9
8
 
10
- Config = Struct.new(:topic_name)
11
-
12
9
  class << self
13
- def configure(&block)
14
- raise ConfigurationError, 'PubsubClient is already configured' if @publisher_factory
15
-
16
- unless ENV['GOOGLE_APPLICATION_CREDENTIALS']
17
- raise CredentialsError, 'GOOGLE_APPLICATION_CREDENTIALS must be set.'
18
- end
19
-
20
- config = Config.new
21
- yield config
22
-
23
- unless config.topic_name
24
- raise ConfigurationError, 'The topic_name must be configured.'
25
- end
26
-
27
- @publisher_factory = PublisherFactory.new(config.topic_name)
28
- end
29
-
30
10
  def stub!
31
11
  raise ConfigurationError, 'PubsubClient is already configured' if @publisher_factory
32
12
  @publisher_factory = NullPublisherFactory.new
33
13
  end
34
14
 
35
- def publish(message, &block)
36
- unless @publisher_factory
37
- raise ConfigurationError, 'PubsubClient must be configured or stubbed'
38
- end
39
-
40
- @publisher_factory.build.publish(message, &block)
15
+ def publish(message, topic, &block)
16
+ @publisher_factory ||= PublisherFactory.new
17
+ @publisher_factory.build(topic).publish(message, &block)
41
18
  end
42
19
  end
43
20
  end
@@ -5,7 +5,7 @@ require_relative 'null_publisher'
5
5
  module PubsubClient
6
6
  # A null object to act as a publisher factory when clients are in dev or test
7
7
  class NullPublisherFactory
8
- def build
8
+ def build(*)
9
9
  NullPublisher.new
10
10
  end
11
11
  end
@@ -5,12 +5,12 @@ require_relative 'publisher'
5
5
  module PubsubClient
6
6
  # Build and memoize the Publisher, accounting for GRPC's requirements around forking.
7
7
  class PublisherFactory
8
- def initialize(topic_name)
9
- @topic_name = topic_name
8
+ def initialize
10
9
  @mutex = Mutex.new
10
+ @publishers = {}
11
11
  end
12
12
 
13
- def build
13
+ def build(topic_name)
14
14
  # GRPC fails when attempting to use a connection created in a process that gets
15
15
  # forked with the message
16
16
  #
@@ -20,27 +20,28 @@ module PubsubClient
20
20
  # PubSub.
21
21
  #
22
22
  # To prevent incurring overhead, memoize the publisher per process.
23
- return @publisher if @publisher_pid == current_pid
23
+ return publishers[topic_name].publisher if publishers[topic_name]&.pid == current_pid
24
24
 
25
25
  # We are in a multi-threaded world and need to be careful not to build the publisher
26
26
  # in multiple threads. Lock the mutex so that only one thread can enter this block
27
27
  # at a time.
28
- mutex.synchronize do
28
+ @mutex.synchronize do
29
29
  # It's possible two threads made it to this point, but since we have a lock we
30
30
  # know that one will have built the publisher before the second is able to enter.
31
31
  # If we detect that case, then bail out so as to not rebuild the publisher.
32
- unless @publisher_pid == current_pid
33
- @publisher = build_publisher
34
- @publisher_pid = Process.pid
32
+ unless publishers[topic_name]&.pid == current_pid
33
+ publishers[topic_name] = Memo.new(build_publisher(topic_name), Process.pid)
35
34
  end
36
35
  end
37
36
 
38
- @publisher
37
+ publishers[topic_name].publisher
39
38
  end
40
39
 
41
40
  private
42
41
 
43
- attr_reader :mutex, :topic_name
42
+ attr_accessor :publishers
43
+
44
+ Memo = Struct.new(:publisher, :pid)
44
45
 
45
46
  # Used for testing to simulate when a process is forked. In those cases,
46
47
  # this helps us test that the `.build` method creates different publishers.
@@ -48,7 +49,7 @@ module PubsubClient
48
49
  Process.pid
49
50
  end
50
51
 
51
- def build_publisher
52
+ def build_publisher(topic_name)
52
53
  pubsub = Google::Cloud::PubSub.new
53
54
  topic = pubsub.topic(topic_name)
54
55
  publisher = Publisher.new(topic)
@@ -1,3 +1,3 @@
1
1
  module PubsubClient
2
- VERSION = '0.1.0'
2
+ VERSION = '1.0.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pubsub_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Apartment List Platforms
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-25 00:00:00.000000000 Z
11
+ date: 2020-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -76,6 +76,7 @@ files:
76
76
  - ".ci"
77
77
  - ".gitignore"
78
78
  - ".rspec"
79
+ - CHANGELOG.txt
79
80
  - CODEOWNERS
80
81
  - CODE_OF_CONDUCT.md
81
82
  - Gemfile
@@ -113,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
114
  - !ruby/object:Gem::Version
114
115
  version: '0'
115
116
  requirements: []
116
- rubygems_version: 3.0.6
117
+ rubygems_version: 3.0.8
117
118
  signing_key:
118
119
  specification_version: 4
119
120
  summary: Google Pub/Sub Wrapper