pubsub_tie 0.0.2 → 1.0.0
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 +4 -4
- data/lib/pubsub_tie/events.rb +19 -3
- data/lib/pubsub_tie/publisher.rb +52 -11
- data/lib/pubsub_tie/version.rb +1 -1
- metadata +22 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34f6b84fac7ce4deacc85da202eb97c5991a8d39f8cb655eae8f1aff487316d9
|
4
|
+
data.tar.gz: 874c65f960fd033f90b70262f7dc06e282470a31190351b8fafeea01e924ec37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8653c31411d06e09597d7bab07e5ed27f196cc82f623f0848fcacc8397def04768df71122cb6d5254b946abf5bb140dde88677fe1ed4d176658606c268a9c1c1
|
7
|
+
data.tar.gz: e97c1edc4606b1e9f8662f54178b13853a74b323a29327fb5d51302bb7475220975a6fc5b9cbf04f103d0385ad0efcaf750b5d0843bb1ae3cd07eb9fc96590cb
|
data/lib/pubsub_tie/events.rb
CHANGED
@@ -7,25 +7,41 @@ module PubSubTie
|
|
7
7
|
|
8
8
|
evs = config['events'].map{|e| e['name']}
|
9
9
|
@events = Hash[evs.map(&:to_sym).zip(config['events'])]
|
10
|
+
@events.each do |k, evt|
|
11
|
+
fields = (evt['required'] || []) + (evt['optional'] || [])
|
12
|
+
evt['fields'] = Hash[ fields.map {|f| [f['name'], f['type']]} ]
|
13
|
+
end
|
10
14
|
end
|
11
15
|
|
12
16
|
# Full event name from symbol protecting from typos
|
13
17
|
# Raises KeyError if bad symbol
|
18
|
+
def full_name(sym)
|
19
|
+
"#{@prefix}-#{name(sym)}"
|
20
|
+
end
|
21
|
+
|
14
22
|
def name(sym)
|
15
|
-
|
23
|
+
value(sym, 'name')
|
16
24
|
end
|
17
25
|
|
18
26
|
def required(sym)
|
19
|
-
(
|
27
|
+
field_names(sym, 'required')
|
20
28
|
end
|
21
29
|
|
22
30
|
def optional(sym)
|
23
|
-
(
|
31
|
+
field_names(sym, 'optional')
|
32
|
+
end
|
33
|
+
|
34
|
+
def types(sym)
|
35
|
+
value(sym, 'fields')
|
24
36
|
end
|
25
37
|
|
26
38
|
private
|
27
39
|
def value(sym, key)
|
28
40
|
@events.fetch(sym)[key]
|
29
41
|
end
|
42
|
+
|
43
|
+
def field_names(sym, mode)
|
44
|
+
(value(sym, mode) || []).map {|field| field['name'].to_sym}
|
45
|
+
end
|
30
46
|
end
|
31
47
|
end
|
data/lib/pubsub_tie/publisher.rb
CHANGED
@@ -16,28 +16,36 @@ module PubSubTie
|
|
16
16
|
credentials: creds)
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
#
|
20
|
+
# Publishes event data asynchronously to topic inferred from event_sym.
|
21
|
+
# Data is augmented with event_name and event_time and validated against
|
22
|
+
# loaded configuration
|
23
|
+
#
|
24
|
+
def publish(event_sym, data, resource)
|
25
|
+
message = augmented(data, event_sym)
|
26
|
+
|
20
27
|
@pubsub.
|
21
|
-
topic(Events.
|
22
|
-
# publish(message(
|
23
|
-
publish_async(
|
28
|
+
topic(Events.full_name event_sym).
|
29
|
+
# publish(message(payload, resource), publish_time: Time.now.utc)
|
30
|
+
publish_async(payload(validate_data(event_sym, message), resource),
|
24
31
|
publish_time: Time.now.utc) do |result|
|
25
32
|
unless result.succeeded?
|
26
33
|
Rails.logger.error(
|
27
|
-
"Failed to publish #{
|
34
|
+
"Failed to publish #{message} to #{event_sym} on #{resource} due to #{result.error}")
|
28
35
|
end
|
29
36
|
end
|
30
37
|
end
|
31
38
|
|
32
|
-
def batch(
|
39
|
+
def batch(event_sym, messages, resource)
|
33
40
|
topic = @pubsub.
|
34
|
-
topic(Events.
|
41
|
+
topic(Events.full_name event_sym)
|
35
42
|
messages.each do |data|
|
36
|
-
|
43
|
+
message = augmented(data, event_sym)
|
44
|
+
topic.publish_async(payload(validate_data(event_sym, message), resource),
|
37
45
|
publish_time: Time.now.utc) do |result|
|
38
46
|
unless result.succeeded?
|
39
47
|
Rails.logger.error(
|
40
|
-
"Failed to publish #{
|
48
|
+
"Failed to publish #{message} to #{event_sym} on #{resource} due to #{result.error}")
|
41
49
|
end
|
42
50
|
end
|
43
51
|
end
|
@@ -45,7 +53,7 @@ module PubSubTie
|
|
45
53
|
end
|
46
54
|
|
47
55
|
private
|
48
|
-
def
|
56
|
+
def payload(data, resource)
|
49
57
|
# TODO: embed resource in message
|
50
58
|
data.to_json
|
51
59
|
end
|
@@ -57,11 +65,44 @@ module PubSubTie
|
|
57
65
|
"Missing event required args for #{sym}: #{missing}")
|
58
66
|
end
|
59
67
|
|
60
|
-
|
68
|
+
validate_types(sym,
|
69
|
+
data.slice(*(Events.required(sym) + Events.optional(sym))))
|
61
70
|
end
|
62
71
|
|
63
72
|
def missing_required(sym, data)
|
64
73
|
Events.required(sym) - data.keys
|
65
74
|
end
|
75
|
+
|
76
|
+
def augmented(data, event_sym)
|
77
|
+
{event_name: Events.name(event_sym),
|
78
|
+
event_time: Time.current.utc}.merge(data.to_hash.to_options)
|
79
|
+
end
|
80
|
+
|
81
|
+
def validate_types(sym, data)
|
82
|
+
types = Events.types(sym)
|
83
|
+
|
84
|
+
data.each do |field, val|
|
85
|
+
case val
|
86
|
+
when String
|
87
|
+
bad_type(field, data) unless types[field.to_s] == "STRING"
|
88
|
+
when Integer
|
89
|
+
bad_type(field, data) unless ["INT", "FLOAT"].include? types[field.to_s]
|
90
|
+
when Numeric
|
91
|
+
bad_type(field, data) unless types[field.to_s] == "FLOAT"
|
92
|
+
when Time
|
93
|
+
bad_type(field, data) unless types[field.to_s] == "TIMESTAMP"
|
94
|
+
when DateTime
|
95
|
+
bad_type(field, data) unless types[field.to_s] == "DATETIME"
|
96
|
+
else
|
97
|
+
bad_type(field, data)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
data
|
102
|
+
end
|
103
|
+
|
104
|
+
def bad_type(field, data)
|
105
|
+
raise ArgumentError.new("Bad type for field #{field} in event #{data}")
|
106
|
+
end
|
66
107
|
end
|
67
108
|
end
|
data/lib/pubsub_tie/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pubsub_tie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pablo Calderon
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-cloud-pubsub
|
@@ -24,20 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - "~>"
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
47
|
+
version: '13.0'
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
52
|
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
54
|
+
version: '13.0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,7 +96,7 @@ homepage: https://github.com/ClipInteractive/pubsub-tie
|
|
82
96
|
licenses:
|
83
97
|
- MIT
|
84
98
|
metadata: {}
|
85
|
-
post_install_message:
|
99
|
+
post_install_message:
|
86
100
|
rdoc_options: []
|
87
101
|
require_paths:
|
88
102
|
- lib
|
@@ -97,8 +111,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
111
|
- !ruby/object:Gem::Version
|
98
112
|
version: '0'
|
99
113
|
requirements: []
|
100
|
-
rubygems_version: 3.0.
|
101
|
-
signing_key:
|
114
|
+
rubygems_version: 3.0.3
|
115
|
+
signing_key:
|
102
116
|
specification_version: 4
|
103
117
|
summary: Hook for Google PubSub for publication of events enforcing autoimposed rules
|
104
118
|
test_files: []
|