hey-you 0.1.8 → 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/README.md +9 -4
- data/lib/hey_you/builder.rb +32 -15
- data/lib/hey_you/channels/_base.rb +4 -4
- data/lib/hey_you/channels/email.rb +30 -15
- data/lib/hey_you/config.rb +19 -9
- data/lib/hey_you/config/conigurable.rb +3 -2
- data/lib/hey_you/config/email.rb +3 -3
- data/lib/hey_you/config/push.rb +1 -1
- data/lib/hey_you/helper.rb +7 -0
- data/lib/hey_you/receiver.rb +7 -8
- data/lib/hey_you/sender.rb +11 -13
- data/lib/hey_you/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5ce0968273a44b7121fd2d9799905b2f2c8ca013f40f3e497ff45f7e83feeb0
|
4
|
+
data.tar.gz: fc8c194e95f2f76314339dbfb64ddf36f38c818cc07296cd9516fb9a44135f56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3630186f02e156de3db5cbbe7195d4ba83d2bc31a4f000c3fc5afd7d1b69f193f742e6a4acab1eef1a741727c14e9f296856fe28e79e4df2eb6ff92b7006da6
|
7
|
+
data.tar.gz: 14d5065592601334769ca13f815a6d10665c8718d2ea14317867d40be0d713fd88c9a1e67c8b27f9b7805281e58bc64682c7e77498c4ffcab2b46edaa4c44644
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# HeyYou [Alpha]
|
2
2
|
[](https://travis-ci.com/QNester/hey-you#)
|
3
|
+
[](https://badge.fury.io/rb/hey-you)
|
3
4
|
|
4
5
|
Send multichannel notifications with one command.
|
5
6
|
Сonvenient storage of notifications texts. Create your
|
@@ -67,14 +68,18 @@ environment. You can set it like `notifications.#{ENV['APP_ENV]}.yml`
|
|
67
68
|
builder. Default: `.`
|
68
69
|
* __config.registered_channels__ - Avialable channels for your
|
69
70
|
applications. Default: `[:push, :email]`
|
71
|
+
* __config.require_all_channels__ - Boolean. If true, when data for channel will not found in
|
72
|
+
file collection, error will be raised. Default: `false`
|
70
73
|
* __config.localization__ - Boolean. If true, hey-you begin support I18n locales for notifications collection. Your
|
71
|
-
notifications for build should be nested in `I18n.locale` key. For example:
|
74
|
+
notifications for build should be nested in `I18n.locale` key. Default: `false`. For example:
|
72
75
|
|
73
76
|
```ruby
|
74
77
|
# config/initializers/hey-you.rb
|
75
78
|
HeyYou::Config.configure do
|
76
79
|
...
|
77
|
-
config.collection_files =
|
80
|
+
config.collection_files = Rails.application.config.i18n.available_locales.map do |locale|
|
81
|
+
"config/notifications/#{locale}.yml"
|
82
|
+
end
|
78
83
|
...
|
79
84
|
end
|
80
85
|
```
|
@@ -124,7 +129,7 @@ Default 60
|
|
124
129
|
Default 30
|
125
130
|
##### Email
|
126
131
|
* __config.email.layout__ - default layout for email letters.
|
127
|
-
* __config.email.
|
132
|
+
* __config.email.use_default_mailing__ - use default mail sending or use custom mailer classes
|
128
133
|
* __config.email.default_mailer_class__ - default mailer class for email notifications
|
129
134
|
* __config.email.default_mailer_method__ - default mailer_method for mailer_class
|
130
135
|
* __config.email.default_delivery_method__ - expects, that mailer_method will build message and delivery_method will send it.
|
@@ -359,7 +364,7 @@ in your channel config.
|
|
359
364
|
Now, when you will send notification, it will be send with your channel too.
|
360
365
|
|
361
366
|
## Extensions
|
362
|
-
* [Slack channel](https://github.com/QNester/hey-you)
|
367
|
+
* [Slack channel](https://github.com/QNester/hey-you-slack)
|
363
368
|
[](https://badge.fury.io/rb/hey-you-slack)
|
364
369
|
|
365
370
|
## Development
|
data/lib/hey_you/builder.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require 'i18n'
|
2
|
-
|
3
|
-
|
2
|
+
require 'hey_you/helper'
|
3
|
+
require 'hey_you/builder/email'
|
4
|
+
require 'hey_you/builder/push'
|
4
5
|
|
5
6
|
module HeyYou
|
6
7
|
class Builder
|
7
|
-
|
8
|
+
include HeyYou::Helper
|
9
|
+
|
10
|
+
attr_reader :data, :options, :keys
|
8
11
|
|
9
12
|
# Load data from collection yaml via key and interpolate variables.
|
10
13
|
# Define methods for each registered channel. After initialize you can use
|
@@ -14,18 +17,32 @@ module HeyYou
|
|
14
17
|
@data = fetch_from_collection_by_key(key, options[:locale])
|
15
18
|
@options = options
|
16
19
|
config.registered_channels.each do |ch|
|
17
|
-
|
18
|
-
HeyYou::Builder.const_get("#{ch.downcase.capitalize}").new(data, key, options)
|
19
|
-
instance_variable_set("@#{ch}".to_sym, ch_builder)
|
20
|
-
|
21
|
-
define_ch_method(ch)
|
20
|
+
init_channel_builder(ch, key)
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
25
24
|
private
|
26
25
|
|
27
|
-
def
|
28
|
-
|
26
|
+
def init_channel_builder(ch, key)
|
27
|
+
if config.require_all_channels
|
28
|
+
unless data[ch.to_s]
|
29
|
+
raise RequiredChannelNotFound, "For key #{key} and channel #{ch} data not exists in collection."
|
30
|
+
end
|
31
|
+
end
|
32
|
+
unless data[ch.to_s]
|
33
|
+
define_ch_method(ch, true)
|
34
|
+
return
|
35
|
+
end
|
36
|
+
|
37
|
+
ch_builder =
|
38
|
+
HeyYou::Builder.const_get("#{ch.downcase.capitalize}").new(data, key, options)
|
39
|
+
instance_variable_set("@#{ch}".to_sym, ch_builder)
|
40
|
+
|
41
|
+
define_ch_method(ch)
|
42
|
+
end
|
43
|
+
|
44
|
+
def define_ch_method(ch, empty = false)
|
45
|
+
method_proc = empty ? -> { nil } : -> { instance_variable_get("@#{ch}".to_sym) }
|
29
46
|
self.class.send(:define_method, ch, method_proc)
|
30
47
|
end
|
31
48
|
|
@@ -37,15 +54,15 @@ module HeyYou
|
|
37
54
|
keys << locale
|
38
55
|
end
|
39
56
|
keys = keys + key.to_s.split(config.splitter)
|
40
|
-
keys.reduce(config.collection) do |memo, nested_key|
|
57
|
+
data = keys.reduce(config.collection) do |memo, nested_key|
|
41
58
|
memo[nested_key.to_s] if memo
|
42
59
|
end
|
43
|
-
|
44
|
-
|
45
|
-
def config
|
46
|
-
Config.config
|
60
|
+
return data if data
|
61
|
+
raise DataNotFound, "collection data not found for `#{keys.join(config.splitter)}`"
|
47
62
|
end
|
48
63
|
|
49
64
|
class UnknownLocale < StandardError; end
|
65
|
+
class DataNotFound < StandardError; end
|
66
|
+
class RequiredChannelNotFound < StandardError; end
|
50
67
|
end
|
51
68
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
+
require 'hey_you/helper'
|
1
2
|
module HeyYou
|
2
3
|
module Channels
|
3
4
|
class Base
|
5
|
+
include HeyYou::Helper
|
6
|
+
extend HeyYou::Helper
|
7
|
+
|
4
8
|
class << self
|
5
9
|
def send!
|
6
10
|
raise NotImplementedError, 'You should define #send! method in your channel.'
|
@@ -25,10 +29,6 @@ module HeyYou
|
|
25
29
|
[]
|
26
30
|
end
|
27
31
|
|
28
|
-
def config
|
29
|
-
Config.config
|
30
|
-
end
|
31
|
-
|
32
32
|
def ch_name
|
33
33
|
self.class.name.split('::').last.downcase
|
34
34
|
end
|
@@ -6,31 +6,31 @@ module HeyYou
|
|
6
6
|
class Email < Base
|
7
7
|
class << self
|
8
8
|
def send!(builder, to:, **options)
|
9
|
-
|
10
|
-
|
11
|
-
method = config.email.default_mailing ? :send_via_mail : :send_via_custom_class
|
9
|
+
method = config.email.use_default_mailing ? :send_via_mail : :send_via_custom_class
|
12
10
|
public_send(method, builder, to, options)
|
13
11
|
end
|
14
12
|
|
15
13
|
# Send email via custom class instance.
|
16
14
|
def send_via_custom_class(builder, to, **options)
|
17
15
|
mailer = mailer_class_from_builder(builder, options)
|
18
|
-
|
19
|
-
mailer_method = options[:mailer_method] ||
|
20
|
-
builder.email.mailer_method ||
|
21
|
-
config.email.default_mailer_method
|
22
|
-
|
16
|
+
mailer_method = mailer_method_from_builder(mailer, builder, options)
|
23
17
|
delivery_method = options[:delivery_method] ||
|
24
18
|
builder.email.delivery_method ||
|
25
19
|
config.email.default_delivery_method
|
26
20
|
|
27
21
|
log("Build mail via #{mailer}##{mailer_method}. Delivery with #{delivery_method}")
|
28
22
|
mailer_msg = mailer.public_send(mailer_method, data: builder.email, to: to)
|
29
|
-
mailer_msg.public_send(delivery_method)
|
23
|
+
return mailer_msg.public_send(delivery_method) if mailer_msg.respond_to?(delivery_method)
|
24
|
+
raise(
|
25
|
+
DeliveryMethodNotDefined,
|
26
|
+
"Instance of mailer #{mailer} with method #{mailer_method} not respond to #{delivery_method}"
|
27
|
+
)
|
30
28
|
end
|
31
29
|
|
32
30
|
# Send email with standard mail (gem 'mail')
|
33
31
|
def send_via_mail(builder, to, **_)
|
32
|
+
raise CredentialsNotExists unless credentials_present?
|
33
|
+
|
34
34
|
context = self
|
35
35
|
mail = Mail.new do
|
36
36
|
from HeyYou::Config.instance.email.from
|
@@ -74,14 +74,29 @@ module HeyYou
|
|
74
74
|
|
75
75
|
mailer
|
76
76
|
end
|
77
|
-
end
|
78
77
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
78
|
+
def mailer_method_from_builder(mailer_class, builder, **options)
|
79
|
+
mailer_method = options[:mailer_method] ||
|
80
|
+
builder.email.mailer_method ||
|
81
|
+
config.email.default_mailer_method
|
82
|
+
unless mailer_method
|
83
|
+
raise(
|
84
|
+
MailerMethodNotDefined,
|
85
|
+
'You must set mailer_method in notifications collection or pass :mailer_method option.'
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
89
|
+
return mailer_method if mailer_class.respond_to?(mailer_method)
|
90
|
+
raise MailerMethodNotDefined, "Method ##{mailer_method} not defined for #{mailer_class}."
|
91
|
+
end
|
84
92
|
end
|
93
|
+
|
94
|
+
class CredentialsNotExists < StandardError; end
|
95
|
+
class ActionMailerClassNotDefined < StandardError; end
|
96
|
+
class MailerClassNotDefined < StandardError; end
|
97
|
+
class MailerMethodNotDefined < StandardError; end
|
98
|
+
class DeliveryMethodNotDefined < StandardError; end
|
99
|
+
|
85
100
|
end
|
86
101
|
end
|
87
102
|
end
|
data/lib/hey_you/config.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'yaml'
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
require 'hey_you/config/conigurable'
|
3
|
+
require 'hey_you/config/push'
|
4
|
+
require 'hey_you/config/email'
|
5
5
|
|
6
6
|
#
|
7
7
|
# @config REQUIRED collection_file [String] - File path for general notifications file
|
@@ -17,7 +17,15 @@ module HeyYou
|
|
17
17
|
class Config
|
18
18
|
extend Configurable
|
19
19
|
|
20
|
-
|
20
|
+
DEFAULTS = {
|
21
|
+
registered_channels: %i[email push],
|
22
|
+
splitter: '.',
|
23
|
+
log_tag: 'HeyYou',
|
24
|
+
localization: false,
|
25
|
+
require_all_channels: false
|
26
|
+
}
|
27
|
+
|
28
|
+
DEFAULT_REGISTERED_CHANNELS =
|
21
29
|
DEFAULT_SPLITTER = '.'
|
22
30
|
DEFAULT_GLOBAL_LOG_TAG = 'HeyYou'
|
23
31
|
DEFAULT_LOCALIZATION_FLAG = false
|
@@ -27,15 +35,17 @@ module HeyYou
|
|
27
35
|
attr_reader :collection, :env_collection, :configured, :registered_receivers
|
28
36
|
attr_accessor(
|
29
37
|
:collection_files, :env_collection_file, :splitter,
|
30
|
-
:registered_channels, :localization, :logger, :log_tag
|
38
|
+
:registered_channels, :localization, :logger, :log_tag,
|
39
|
+
:require_all_channels
|
31
40
|
)
|
32
41
|
|
33
42
|
def initialize
|
34
|
-
@registered_channels ||=
|
35
|
-
@splitter ||=
|
43
|
+
@registered_channels ||= DEFAULTS[:registered_channels]
|
44
|
+
@splitter ||= DEFAULTS[:splitter]
|
36
45
|
@registered_receivers = []
|
37
|
-
@log_tag ||=
|
38
|
-
@localization ||=
|
46
|
+
@log_tag ||= DEFAULTS[:log_tag]
|
47
|
+
@localization ||= DEFAULTS[:localization]
|
48
|
+
@require_all_channels = DEFAULTS[:require_all_channels]
|
39
49
|
define_ch_config_methods
|
40
50
|
end
|
41
51
|
|
@@ -11,14 +11,15 @@ module HeyYou
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def configure(&block)
|
14
|
-
|
15
|
-
@configured ? nil : instance_eval(&block)
|
14
|
+
@configured ? raise(AlreadyConfiguredError, 'You already configure HeyYou') : instance_eval(&block)
|
16
15
|
@configured = true
|
17
16
|
end
|
18
17
|
|
19
18
|
def config
|
20
19
|
@config ||= self.instance
|
21
20
|
end
|
21
|
+
|
22
|
+
class AlreadyConfiguredError < StandardError; end
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
data/lib/hey_you/config/email.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require 'hey_you/config/conigurable'
|
2
2
|
require 'mail'
|
3
3
|
|
4
4
|
module HeyYou
|
@@ -13,7 +13,7 @@ module HeyYou
|
|
13
13
|
attr_accessor(
|
14
14
|
:from,
|
15
15
|
:mail_delivery_method,
|
16
|
-
:
|
16
|
+
:use_default_mailing,
|
17
17
|
:default_delivery_method,
|
18
18
|
:default_mailer_class,
|
19
19
|
:default_mailer_method
|
@@ -21,7 +21,7 @@ module HeyYou
|
|
21
21
|
|
22
22
|
def initialize
|
23
23
|
@mail_delivery_method ||= MAIL_DELIVERY_METHOD
|
24
|
-
@
|
24
|
+
@use_default_mailing ||= !default_mailer_class.nil?
|
25
25
|
@async ||= true
|
26
26
|
@default_mailer_method ||= DEFAULT_ACTION_MAILER_METHOD
|
27
27
|
@default_delivery_method ||= DEFAULT_DELIVERY_METHOD
|
data/lib/hey_you/config/push.rb
CHANGED
data/lib/hey_you/receiver.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
-
|
1
|
+
require 'hey_you/sender'
|
2
|
+
require 'hey_you/helper'
|
2
3
|
|
3
4
|
module HeyYou
|
4
5
|
module Receiver
|
6
|
+
include HeyYou::Helper
|
7
|
+
|
5
8
|
attr_reader :receiver_channels, :receiver_data
|
6
9
|
|
7
10
|
def self.extended klass
|
@@ -48,7 +51,7 @@ module HeyYou
|
|
48
51
|
|
49
52
|
@receiver_data = receiver_data
|
50
53
|
@receiver_channels = receiver_data.keys
|
51
|
-
|
54
|
+
config.registrate_receiver(self)
|
52
55
|
|
53
56
|
define_receive_info_methods
|
54
57
|
end
|
@@ -57,10 +60,10 @@ module HeyYou
|
|
57
60
|
|
58
61
|
def check_channels(channels)
|
59
62
|
channels.all? do |ch|
|
60
|
-
next if
|
63
|
+
next if config.registered_channels.include?(ch.to_sym)
|
61
64
|
raise(
|
62
65
|
NotRegisteredChannel,
|
63
|
-
"Channel #{ch} not registered. Registered channels: #{
|
66
|
+
"Channel #{ch} not registered. Registered channels: #{config.registered_channels}"
|
64
67
|
)
|
65
68
|
end
|
66
69
|
@received_channels = channels
|
@@ -79,10 +82,6 @@ module HeyYou
|
|
79
82
|
end
|
80
83
|
end
|
81
84
|
|
82
|
-
def hey_you_config
|
83
|
-
Config.config
|
84
|
-
end
|
85
|
-
|
86
85
|
class NotRegisteredChannel < StandardError;
|
87
86
|
end
|
88
87
|
end
|
data/lib/hey_you/sender.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
require 'hey_you/helper'
|
2
|
+
require 'hey_you/builder'
|
3
|
+
require 'hey_you/channels/push'
|
4
|
+
require 'hey_you/channels/email'
|
5
5
|
|
6
6
|
module HeyYou
|
7
7
|
class Sender
|
8
|
+
include HeyYou::Helper
|
9
|
+
extend HeyYou::Helper
|
10
|
+
|
8
11
|
class << self
|
9
12
|
# Send notifications for receiver
|
10
13
|
#
|
@@ -41,9 +44,9 @@ module HeyYou
|
|
41
44
|
builder = Builder.new(notification_key, options)
|
42
45
|
response = {}
|
43
46
|
config.registered_channels.each do |ch|
|
44
|
-
if channel_allowed?(ch, receive_info, builder, options)
|
47
|
+
if channel_allowed?(ch, receive_info, builder, options) && builder.respond_to?(ch) && builder.public_send(ch)
|
45
48
|
config.log(
|
46
|
-
"Send #{ch}-message to #{receive_info[ch][:subject]} with data: #{builder.
|
49
|
+
"Send #{ch}-message to #{receive_info[ch][:subject]} with data: #{builder.public_send(ch).data}" \
|
47
50
|
" and options: #{receive_info[ch][:options]}"
|
48
51
|
)
|
49
52
|
receive_options = receive_info[ch].fetch(:options, {}) || {}
|
@@ -60,9 +63,8 @@ module HeyYou
|
|
60
63
|
private
|
61
64
|
|
62
65
|
def channel_allowed?(ch, to, builder, **options)
|
63
|
-
|
64
|
-
|
65
|
-
end
|
66
|
+
condition = to[ch].is_a?(Hash) ? to[ch.to_sym][:subject] || to[ch.to_s][:subject] : to[ch.to_sym] || to[ch.to_s]
|
67
|
+
return false unless condition
|
66
68
|
channel_allowed_by_only?(ch, options[:only]) && !builder.send(ch).nil?
|
67
69
|
end
|
68
70
|
|
@@ -75,10 +77,6 @@ module HeyYou
|
|
75
77
|
return only.map(&:to_sym).include?(ch.to_sym) if only.is_a?(Array)
|
76
78
|
only.to_sym == ch.to_sym
|
77
79
|
end
|
78
|
-
|
79
|
-
def config
|
80
|
-
Config.config
|
81
|
-
end
|
82
80
|
end
|
83
81
|
|
84
82
|
class NotRegisteredReceiver < StandardError; end
|
data/lib/hey_you/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hey-you
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergey Nesterov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fcm
|
@@ -139,6 +139,7 @@ files:
|
|
139
139
|
- lib/hey_you/config/conigurable.rb
|
140
140
|
- lib/hey_you/config/email.rb
|
141
141
|
- lib/hey_you/config/push.rb
|
142
|
+
- lib/hey_you/helper.rb
|
142
143
|
- lib/hey_you/receiver.rb
|
143
144
|
- lib/hey_you/sender.rb
|
144
145
|
- lib/hey_you/version.rb
|
@@ -160,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
161
|
- !ruby/object:Gem::Version
|
161
162
|
version: '0'
|
162
163
|
requirements: []
|
163
|
-
rubygems_version: 3.0.
|
164
|
+
rubygems_version: 3.0.6
|
164
165
|
signing_key:
|
165
166
|
specification_version: 4
|
166
167
|
summary: Send multichannel notification with one command.
|