pubsub_tie 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/pubsub_tie/events.rb +31 -0
- data/lib/pubsub_tie/publisher.rb +52 -0
- data/lib/pubsub_tie/railtie.rb +7 -0
- data/lib/pubsub_tie/version.rb +3 -0
- data/lib/pubsub_tie.rb +44 -0
- metadata +104 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a07811f6de7eee6628bff537126ed2186da058002ec43d2f5789278869a2b739
|
4
|
+
data.tar.gz: 5bfe2ac42674e2720d3aaf4cf5262befc892eb62d8959ffed827a90a49aa33a8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e6eb7e15aa40bb9c19ceee94430269d256c5c0e36a4e02d4fe8a0387ea39c99590890e818ff5fc7b15d8fd4453770c9a9ab5e2ca144e992b7e37cd4e60d3cc93
|
7
|
+
data.tar.gz: 164bdc7080b020257cf852618dcd75540102767cd18bf84d1dd20510d1c626bf4b0f103f20255072b41af972641bff2aa33ef7af804513b8d18eabbc1dffce55
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module PubSubTie
|
2
|
+
module Events
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def configure(config)
|
6
|
+
@prefix = config['app_prefix']
|
7
|
+
|
8
|
+
evs = config['events'].map{|e| e['name']}
|
9
|
+
@events = Hash[evs.map(&:to_sym).zip(config['events'])]
|
10
|
+
end
|
11
|
+
|
12
|
+
# Full event name from symbol protecting from typos
|
13
|
+
# Raises KeyError if bad symbol
|
14
|
+
def name(sym)
|
15
|
+
"#{@prefix}-#{value(sym, 'name')}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def required(sym)
|
19
|
+
(value(sym, 'required') || []).map(&:to_sym)
|
20
|
+
end
|
21
|
+
|
22
|
+
def optional(sym)
|
23
|
+
(value(sym, 'optional') || []).map(&:to_sym)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def value(sym, key)
|
28
|
+
@events.fetch(sym)[key]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'google/cloud/pubsub'
|
2
|
+
|
3
|
+
module PubSubTie
|
4
|
+
module Publisher
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def configure(config)
|
8
|
+
@pubsub = google_pubsub(config)
|
9
|
+
end
|
10
|
+
|
11
|
+
def google_pubsub(config)
|
12
|
+
keyfile = File.join(PubSubTie.app_root, 'config', config['keyfile'])
|
13
|
+
creds = Google::Cloud::PubSub::Credentials.new keyfile
|
14
|
+
|
15
|
+
Google::Cloud::PubSub.new(project_id: config['project_id'],
|
16
|
+
credentials: creds)
|
17
|
+
end
|
18
|
+
|
19
|
+
def publish(topic_sym, data, resource)
|
20
|
+
@pubsub.
|
21
|
+
topic(Events.name topic_sym).
|
22
|
+
# publish(message(data, resource), publish_time: Time.now.utc)
|
23
|
+
publish_async(message(validate_data(topic_sym, data), resource),
|
24
|
+
publish_time: Time.now.utc) do |result|
|
25
|
+
unless result.succeeded?
|
26
|
+
Rails.logger.error(
|
27
|
+
"Failed to publish #{data} to #{topic_name} on #{resource} due to #{result.error}")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def message(data, resource)
|
34
|
+
# TODO: embed resource in message
|
35
|
+
data.to_json
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate_data(sym, data)
|
39
|
+
missing = missing_required(sym, data)
|
40
|
+
unless missing.empty?
|
41
|
+
raise ArgumentError.new(
|
42
|
+
"Missing event required args for #{sym}: #{missing}")
|
43
|
+
end
|
44
|
+
|
45
|
+
data.slice(*(Events.required(sym) + Events.optional(sym)))
|
46
|
+
end
|
47
|
+
|
48
|
+
def missing_required(sym, data)
|
49
|
+
Events.required(sym) - data.keys
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/pubsub_tie.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
require 'pubsub_tie/events'
|
5
|
+
require 'pubsub_tie/publisher'
|
6
|
+
|
7
|
+
module PubSubTie
|
8
|
+
extend self
|
9
|
+
|
10
|
+
attr_writer :logger
|
11
|
+
|
12
|
+
def configure
|
13
|
+
configure_publisher
|
14
|
+
configure_events
|
15
|
+
end
|
16
|
+
|
17
|
+
def app_root
|
18
|
+
Dir.pwd
|
19
|
+
end
|
20
|
+
|
21
|
+
def logger
|
22
|
+
@logger ||= defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
|
23
|
+
end
|
24
|
+
|
25
|
+
def env
|
26
|
+
@env ||= defined?(Rails) ? Rails.env : ENV["ENV"] || 'developent'
|
27
|
+
end
|
28
|
+
|
29
|
+
def configure_publisher
|
30
|
+
config = YAML.load_file(File.join(app_root, 'config', 'gcp.yml'))[env]
|
31
|
+
Publisher.configure(config)
|
32
|
+
end
|
33
|
+
|
34
|
+
def configure_events
|
35
|
+
config = YAML.load_file(File.join(app_root, 'config', 'events.yml'))
|
36
|
+
Events.configure(config)
|
37
|
+
end
|
38
|
+
|
39
|
+
def publish(topic, data, resource: nil)
|
40
|
+
Publisher.publish(topic, data, resource)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
require 'pubsub_tie/railtie' if defined? Rails::Railtie
|
metadata
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pubsub_tie
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Pablo Calderon
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-05-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: google-cloud-pubsub
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.16'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.16'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
description: ''
|
70
|
+
email:
|
71
|
+
- pablo@auddia.dev
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/pubsub_tie.rb
|
77
|
+
- lib/pubsub_tie/events.rb
|
78
|
+
- lib/pubsub_tie/publisher.rb
|
79
|
+
- lib/pubsub_tie/railtie.rb
|
80
|
+
- lib/pubsub_tie/version.rb
|
81
|
+
homepage: https://github.com/ClipInteractive/pubsub-tie
|
82
|
+
licenses:
|
83
|
+
- MIT
|
84
|
+
metadata: {}
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '2.1'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
requirements: []
|
100
|
+
rubygems_version: 3.0.3
|
101
|
+
signing_key:
|
102
|
+
specification_version: 4
|
103
|
+
summary: Hook for Google PubSub for publication of events enforcing autoimposed rules
|
104
|
+
test_files: []
|