megaphone-client 1.1.0 → 1.1.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 +5 -5
- data/CHANGELOG.md +14 -0
- data/README.md +42 -11
- data/lib/megaphone/client.rb +3 -2
- data/lib/megaphone/client/errors.rb +10 -14
- data/lib/megaphone/client/event.rb +20 -0
- data/lib/megaphone/client/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 2d48043a0df8afb5fba26820a9a09e32c57c6c2658795ae38869c979062b5d67
|
|
4
|
+
data.tar.gz: ebababb0d2f28825df5587fba9a792864360836fe40a1a0843be3837acbd779d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f9e5512231b6bcb86b8180851fe0091e3fcc9c03caf87c445121cf7cef2f05abdef37582d97bdc184c9c1cf8c14dfb42114a59859e3fc7296c27762592d20505
|
|
7
|
+
data.tar.gz: 181405d9073d0616d7a2a91db1f852d9c852f63801877f12575f7a9eea5a6f6b34b564cb60d918b2d4bc128064e9d15362d95a5b2e15bab4ea0c4f6d4378f1eb
|
data/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,19 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and
|
|
6
6
|
this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.1.1] - 2018-02-09
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
* A [code of conduct][coc] and [contributing guidelines][contributing].
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
* Validation of events to ensure that Kinesis will accept them.
|
|
17
|
+
|
|
18
|
+
[coc]: ./CODE_OF_CONDUCT.md
|
|
19
|
+
[contributing]: ./CONTRIBUTING.md
|
|
20
|
+
|
|
8
21
|
## [1.1.0] - 2018-01-30
|
|
9
22
|
|
|
10
23
|
### Added
|
|
@@ -62,6 +75,7 @@ this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
|
|
|
62
75
|
|
|
63
76
|
* Initial implementation of the `Megaphone::Client.publish!` method
|
|
64
77
|
|
|
78
|
+
[1.1.1]: https://github.com/redbubble/megaphone-client-ruby/compare/v1.1.0...v1.1.1
|
|
65
79
|
[1.1.0]: https://github.com/redbubble/megaphone-client-ruby/compare/v1.0.1...v1.1.0
|
|
66
80
|
[1.0.1]: https://github.com/redbubble/megaphone-client-ruby/compare/v1.0.0...v1.0.1
|
|
67
81
|
[1.0.0]: https://github.com/redbubble/megaphone-client-ruby/compare/v0.3.0...v1.0.0
|
data/README.md
CHANGED
|
@@ -1,10 +1,28 @@
|
|
|
1
1
|
# Megaphone::Client
|
|
2
2
|
|
|
3
|
-
[](https://travis-ci.org/redbubble/megaphone-client-ruby)
|
|
4
4
|
[](https://badge.fury.io/rb/megaphone-client)
|
|
5
5
|

|
|
6
|
+

|
|
6
7
|
|
|
7
|
-
Send events to [Megaphone](https://github.com/redbubble/Megaphone).
|
|
8
|
+
Send events to [Megaphone (private)](https://github.com/redbubble/Megaphone).
|
|
9
|
+
|
|
10
|
+
> **DISCLAIMER**: This is part of a currently private event broadcasting system called Megaphone. Please be aware that some links may lead to private repositories. Questions are welcome, though, and we're happy to help if you find a use for this gem, or get inspired by it!
|
|
11
|
+
>
|
|
12
|
+
> More of Megaphone could become public in the future, but there is currently no clear roadmap for it. -- [GB](https://github.com/gonzalo-bulnes)
|
|
13
|
+
|
|
14
|
+
## Table of contents
|
|
15
|
+
|
|
16
|
+
1. [**Getting started**](#getting-started)
|
|
17
|
+
1. [**Usage**](#usage)
|
|
18
|
+
1. [Publishing events](#publishing-events)
|
|
19
|
+
1. [**Error handling**](#error-handling)
|
|
20
|
+
1. [Exceptions the client will raise](#exceptions-the-client-will-raise)
|
|
21
|
+
1. [Internal buffering upon error](#internal-buffering-upon-error)
|
|
22
|
+
1. [Buffer overflow callback handler](#buffer-overflow-callback-handler)
|
|
23
|
+
1. [Handling time-sensitive events and errors](#handling-time-sensitive-events-and-errors)
|
|
24
|
+
1. [**Development**](#development)
|
|
25
|
+
1. [Testing](#testing)
|
|
8
26
|
|
|
9
27
|
## Getting Started
|
|
10
28
|
|
|
@@ -61,17 +79,23 @@ client.publish!(topic, subtopic, schema, partition_key, payload)
|
|
|
61
79
|
|
|
62
80
|
### Exceptions the client will raise
|
|
63
81
|
|
|
64
|
-
`
|
|
65
|
-
|
|
82
|
+
#### `MegaphoneInvalidEventError`
|
|
83
|
+
|
|
84
|
+
Raised when the message is invalid by Kinesis's standards.
|
|
85
|
+
|
|
86
|
+
#### `MegaphoneMessageDelayWarning`
|
|
66
87
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
88
|
+
This indicates a transient failure occurred, but the message will
|
|
89
|
+
probably be re-sent later. See the section on
|
|
90
|
+
_[Internal buffering](#internal-buffering-upon-error)_ below for more
|
|
91
|
+
details.
|
|
70
92
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
93
|
+
#### `MegaphoneUnavailableError`
|
|
94
|
+
|
|
95
|
+
This is raised for all other errors. Note that
|
|
96
|
+
these _may or may not_ also buffer the message for later
|
|
97
|
+
transmission. Unfortunately the underlying client library does not
|
|
98
|
+
make the distinction.
|
|
75
99
|
|
|
76
100
|
### Internal buffering upon error
|
|
77
101
|
|
|
@@ -149,6 +173,13 @@ Unfortunately there is no means to do this with the underlying Ruby client
|
|
|
149
173
|
for Fluentd. It would require patches to the upstream code to expose a flush
|
|
150
174
|
method.
|
|
151
175
|
|
|
176
|
+
## Contributing
|
|
177
|
+
|
|
178
|
+
Want to contribute? Amazing! Our [contributing guidelines][contributing], and [code of conduct][coc] are here to get you started and make you feel welcome!
|
|
179
|
+
|
|
180
|
+
[coc]: ./CODE_OF_CONDUCT.md
|
|
181
|
+
[contributing]: ./CONTRIBUTING.md
|
|
182
|
+
|
|
152
183
|
## Credits
|
|
153
184
|
|
|
154
185
|
[][redbubble]
|
data/lib/megaphone/client.rb
CHANGED
|
@@ -22,11 +22,12 @@ module Megaphone
|
|
|
22
22
|
|
|
23
23
|
def publish!(topic, subtopic, schema, partition_key, payload)
|
|
24
24
|
event = Event.new(topic, subtopic, origin, schema, partition_key, payload)
|
|
25
|
+
raise MegaphoneInvalidEventError.new(event.errors.join(', ')) unless event.valid?
|
|
25
26
|
unless logger.post(topic, event.to_hash)
|
|
26
27
|
if transient_error?(logger.last_error)
|
|
27
|
-
raise MegaphoneMessageDelayWarning.new(logger.last_error.message, event)
|
|
28
|
+
raise MegaphoneMessageDelayWarning.new(logger.last_error.message, event.stream_id)
|
|
28
29
|
else
|
|
29
|
-
raise MegaphoneUnavailableError.new(logger.last_error.message, event)
|
|
30
|
+
raise MegaphoneUnavailableError.new(logger.last_error.message, event.stream_id)
|
|
30
31
|
end
|
|
31
32
|
end
|
|
32
33
|
end
|
|
@@ -2,27 +2,23 @@ module Megaphone
|
|
|
2
2
|
class Client
|
|
3
3
|
class MegaphoneUnavailableError < StandardError
|
|
4
4
|
|
|
5
|
-
def initialize(msg,
|
|
6
|
-
super(msg)
|
|
7
|
-
@msg = msg
|
|
8
|
-
@event = event
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def to_s
|
|
12
|
-
"#{@msg} - An event could not be immediately published, but may be retried: #{@event.stream_id}"
|
|
5
|
+
def initialize(msg, stream_id)
|
|
6
|
+
super("#{msg} - An event could not be immediately published, but may be retried: #{stream_id}")
|
|
13
7
|
end
|
|
14
8
|
end
|
|
15
9
|
|
|
16
10
|
class MegaphoneMessageDelayWarning < StandardError
|
|
17
11
|
|
|
18
|
-
def initialize(msg,
|
|
19
|
-
super(msg)
|
|
20
|
-
@msg = msg
|
|
21
|
-
@event = event
|
|
12
|
+
def initialize(msg, stream_id)
|
|
13
|
+
super("#{msg} - Event delayed and will be reattempted: #{stream_id}")
|
|
22
14
|
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class MegaphoneInvalidEventError < StandardError
|
|
23
18
|
|
|
24
|
-
def
|
|
25
|
-
"
|
|
19
|
+
def initialize(msg)
|
|
20
|
+
super("Invalid Megaphone event was not sent: #{msg}")
|
|
21
|
+
@msg = msg
|
|
26
22
|
end
|
|
27
23
|
end
|
|
28
24
|
end
|
|
@@ -30,6 +30,26 @@ module Megaphone
|
|
|
30
30
|
def to_s
|
|
31
31
|
JSON.dump(to_hash)
|
|
32
32
|
end
|
|
33
|
+
|
|
34
|
+
def errors
|
|
35
|
+
errors = []
|
|
36
|
+
errors << 'partition_key must not be empty' if missing?(@partition_key)
|
|
37
|
+
errors << 'topic must not be empty' if missing?(@topic)
|
|
38
|
+
errors << 'subtopic must not be empty' if missing?(@subtopic)
|
|
39
|
+
errors << 'payload must not be empty' if missing?(@payload)
|
|
40
|
+
errors << 'origin must not be empty' if missing?(@origin)
|
|
41
|
+
errors
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def valid?
|
|
45
|
+
errors.empty?
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def missing?(field)
|
|
51
|
+
not (field && field.to_s.length > 0)
|
|
52
|
+
end
|
|
33
53
|
end
|
|
34
54
|
end
|
|
35
55
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: megaphone-client
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Redbubble
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2018-
|
|
13
|
+
date: 2018-02-09 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: fluent-logger
|
|
@@ -94,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
94
94
|
version: '0'
|
|
95
95
|
requirements: []
|
|
96
96
|
rubyforge_project:
|
|
97
|
-
rubygems_version: 2.
|
|
97
|
+
rubygems_version: 2.7.5
|
|
98
98
|
signing_key:
|
|
99
99
|
specification_version: 4
|
|
100
100
|
summary: Send events to Megaphone.
|