active_notifier 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bbb1a3370063f78b39543cb4d5fc05d8acea444503c2f230f9bfd2d19abdd979
4
- data.tar.gz: 81999de8ce52f5cee7ec78f6fadbab107b9ca74fdceef9d34eaee7dc70074867
3
+ metadata.gz: 24d5eac70996ae751cbfac298f4bd78074b53f913c19325347bf50bfcd557eb9
4
+ data.tar.gz: 7716f56010b04db00fe06e7a3b5773350a9a58ffcb4b117a64bfd17ed3fe18a7
5
5
  SHA512:
6
- metadata.gz: 885d46d316433753c76d29c8be098b1f1b8d9c67da748fc0122ce1d54253ad76aaa4b0be76a4f13efe56286ea1284637ca47ed773f58cfcb3cfc9dde1ca87f7f
7
- data.tar.gz: d98d5c3cf396d0e8d71fdf29c5121d2fda78e029a3fdfa80a5d9a59935e8274e9a04de877da0ad9d2302999f0dbb2abc012e9f7144fa88e038e6ed93eb3a0992
6
+ metadata.gz: c4793839706e3f4fad3151255736fc0b820611997cd044e793c125b93e1375aab281dd476165525748f6229cd6b45693d0536dad31cc66a47a3924f43119adf4
7
+ data.tar.gz: 77e1fa443c84606455d712a7340d474b607ebcfa3fb59567f334a19a370384d5d7656fd94a9cd0f9fe4a7265c8b42139ca210e5dfe83cbf8567918e991fc00a5
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # ActiveNotifier
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/active_notifier`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ Notify message through webhooks.
6
4
 
7
5
  ## Installation
8
6
 
@@ -22,7 +20,116 @@ Or install it yourself as:
22
20
 
23
21
  ## Usage
24
22
 
25
- TODO: Write usage instructions here
23
+ ### Basic
24
+
25
+ ```ruby
26
+ ActiveNotifer.config.channel_tokens = { default: "xxx" }
27
+ ActiveNotifier.exec(:default)
28
+ # This will notifier message, use options:
29
+ # token: config.channel_tokens[:default],
30
+ # template: "#{config.template_home}/default.*.erb"
31
+
32
+ ActiveNotifier.exec(:default, template: "orders/create")
33
+ # Use specific template file but not get by channel
34
+ # This will notifier message, use options:
35
+ # token: config.channel_tokens[:default],
36
+ # template: "#{config.template_home}/orders/create.*.erb"
37
+
38
+ ActiveNotifier.exec(:default, token: "special_token", data: { title: "Title", message: "Message" })
39
+ # Use specific token but not get by channel
40
+ # This will notifier message, use options:
41
+ # token: "special_token",
42
+ # template: "#{config.template_home}/default.*.erb"
43
+ # And the Hash data will inject to template, and get a dynamic message after parse template
44
+ ```
45
+
46
+ ### Use custom template
47
+
48
+ Set token and template home for Rails application
49
+
50
+ ```ruby
51
+ ActiveNotifier.configure do |config|
52
+ config.channel_tokens = { default: "xxx" }
53
+ config.template_home = Rails.root.join("app", "views", "active_notifier")
54
+ end
55
+ ```
56
+
57
+ Set the default message template
58
+
59
+ > app/views/active_notifier/default.markdown.erb
60
+
61
+ ```erb
62
+ ## #{data[:title]}
63
+ > #{data[:message]}
64
+ ```
65
+
66
+ Notify message
67
+
68
+ ```ruby
69
+ ActiveNotifier.exec(:default, data: { title: "Title", message: "Message" }) # => Notifer OK
70
+ ```
71
+
72
+ ### Send message with dynamic type
73
+
74
+ Message type will dynamic set according by valid template files, when we
75
+ set a template named `order.text.erb`
76
+
77
+ ```ruby
78
+ ActiveNotifier.configure do |config|
79
+ config.channel_tokens = { order: "xxx" }
80
+ config.template_home = Rails.root.join("app", "views", "active_notifier")
81
+ ```
82
+
83
+ > app/views/active_notifier/order.text.erb
84
+
85
+ ```erb
86
+ title: #{data[:title]}
87
+ message: #{data[:message]}
88
+ ```
89
+
90
+ When there is only text type template for order, it will be OK the
91
+ notify message without set type option
92
+
93
+ ```ruby
94
+ ActiveNotifier.exec(:default, data: { title: "Title", message: "Message" }) # => Notifer message OK
95
+ ```
96
+
97
+ Also, even though there are multiple types templates, like both `order.text.erb` and `order.markdown.erb`
98
+ are exist, we still can make it OK which no need for type option, just
99
+ set the priority type
100
+
101
+ > app/views/active_notifier/order.text.erb
102
+
103
+ ```erb
104
+ title: #{data[:title]}
105
+ message: #{data[:message]}
106
+ ```
107
+
108
+ > app/views/active_notifier/order.markdown.erb
109
+
110
+ ```erb
111
+ ## #{data[:title]}
112
+ > #{data[:message]}
113
+ ```
114
+
115
+ ```ruby
116
+ # default priority_type is :markdown
117
+ ActiveNotifer.config.priority_type = :text
118
+
119
+ # Now this will choose text by default
120
+ ActiveNotifier.exec(:default, data: { title: "Title", message: "Message" }) # => Notifer message OK by text type template
121
+ ```
122
+
123
+ ### Set a short constant to notify(Rails initializer will set this by default)
124
+
125
+ ```ruby
126
+ ActiveNotifer.config.const_name = :Notifier
127
+ Notifer.exec(...)
128
+ ```
129
+
130
+ ### Other
131
+
132
+ See complete abilities of ActiveNotifier, please follow [Spec files](https://github.com/pinewong/active_notifier/blob/master/spec/active_adapter_spec.rb)
26
133
 
27
134
  ## Development
28
135
 
@@ -1,8 +1,6 @@
1
1
  module ActiveNotifier
2
2
  module Adaptable
3
- def self.included(base)
4
- base.extend ClassMethods
5
- end
3
+ extend ActiveSupport::Concern
6
4
 
7
5
  module ClassMethods
8
6
  def adapters
@@ -6,6 +6,16 @@ module ActiveNotifier
6
6
  @adapter = adapter_class.new
7
7
  end
8
8
 
9
+ # Notify message
10
+ # @abstract Implement through setting a real adapter, like :dingtalk
11
+ # @param token [String] Channel webhook token
12
+ # @param type [Symbol] Message type
13
+ # @param message [String] Message body
14
+ # @param options [Hash] ({}) Adapter message options,
15
+ # some adapters require some another options
16
+ # @raise [AdapterOptionsInvalidError]
17
+ # @raise [AdapterTypeInvalidError]
18
+ # @raise [MessageBlankError]
9
19
  def notify(token, type, message, **options)
10
20
  adapter.notify(token, type, message, **options)
11
21
  end
@@ -8,9 +8,9 @@ module ActiveNotifier
8
8
  error_message = "适配器 type 暂时只支持:#{VALID_TYPES.join(', ')}"
9
9
  raise ActiveNotifier::AdapterTypeInvalidError, error_message
10
10
  end
11
- raise ActiveNotifier::MessageBlankError, "消息不能为空, 请检查 template 模板" if message.empty?
11
+ raise ActiveNotifier::MessageBlankError, "message can't be blank, please check template file" if message.empty?
12
12
  title = options[:title].to_s
13
- raise ActiveNotifier::AdapterOptionsInvalidError, "钉钉适配器还需提供必须值:title" if title.empty?
13
+ raise ActiveNotifier::AdapterOptionsInvalidError, "Dingtalk adapter require other options: title" if title.empty?
14
14
 
15
15
  body = {
16
16
  'msgtype' => type,
@@ -1,75 +1,103 @@
1
1
  module ActiveNotifier
2
2
  module Configurable
3
- def self.included(base)
4
- base.extend ClassMethods
5
- end
3
+ extend ActiveSupport::Concern
6
4
 
7
5
  module ClassMethods
8
- def config
9
- @config ||= Configuration.new
10
- end
11
-
6
+ # Configure for ActiveNotifier
7
+ # @yield [config] Give a Configuration instance for settings
8
+ # @raise [ConfigureError]
9
+ # @example
10
+ # ActiveNotifier.configure do |config|
11
+ # config.const_name = :Message
12
+ # config.adapter = :slack
13
+ # # ...
14
+ # end
12
15
  def configure
13
16
  yield config
14
17
  end
18
+
19
+ def config
20
+ @config ||= Configuration.new
21
+ end
15
22
  end
16
23
 
17
24
  class Configuration
18
- # 常量名, 简化调用, 符号,默认 :Notifier (如果被占用请更换)
25
+ # Alias const for ActiveNotifier
26
+ # @!attribute [r]
19
27
  attr_reader :const_name
20
28
 
29
+ # Set alias const for ActiveNotifier
30
+ # @param const_name [#to_sym] (:Notifier) Alias const name
31
+ # @example
32
+ # ActiveNotifier.config.const_name = :Message
33
+ # ::Message == ::ActiveNotifier # => true
21
34
  def const_name=(const_name)
22
35
  const_name = const_name.to_sym
23
- const_name = "Notifier" if const_name.empty?
24
- raise ActiveNotifier::ConfigureError, "const_name 已经存在,请配置其他值" if Kernel.const_defined?(const_name)
36
+ const_name = :Notifier if const_name.empty?
37
+ error_message = "const_name is already defined, please set another value"
38
+ raise ActiveNotifier::ConfigureError, error_message if Kernel.const_defined?(const_name)
25
39
  Kernel.const_set(const_name, ActiveNotifier)
26
40
  @const_name = const_name
27
41
  end
28
42
 
29
- # 消息适配器, 字符串, 默认 :dingtalk
43
+ # Message Adapter
30
44
  def adapter
31
45
  @adapter || :dingtalk
32
46
  end
33
47
 
48
+ # Set message Adapter
49
+ # @param adapter [#to_sym] (:dingtalk)
34
50
  def adapter=(adapter)
35
51
  adapter = adapter.to_sym
36
52
  unless adapters_with_base_url.key?(adapter)
37
- raise ActiveNotifier::ConfigureError, "adapter 当前只支持:#{adapters_with_base_url.keys.join(', ')}"
53
+ raise ActiveNotifier::ConfigureError, "adapter only support: #{adapters_with_base_url.keys.join(', ')}"
38
54
  end
39
55
  @adapter = adapter
40
56
  end
41
57
 
42
- # 消息渠道的 channel_tokens 设置
58
+ # The tokens of channel
43
59
  def channel_tokens
44
60
  @channel_tokens || {}
45
61
  end
46
62
 
63
+ # Set the tokens of channel
64
+ # @param channel_tokens [Hash] ({})
65
+ # @example
66
+ # ActiveNotifier.config.channel_tokens = {
67
+ # default: "xxx",
68
+ # order: "xxx"
69
+ # }
47
70
  def channel_tokens=(channel_tokens)
48
71
  channel_tokens = channel_tokens.to_h.symbolize_keys
49
72
  @channel_tokens = channel_tokens
50
73
  end
51
74
 
52
- # 消息模版主目录, 字符串, 默认 views/notifier/application), 不需要加模版后缀
75
+ # The template home directory
53
76
  def template_home
54
77
  @template_home || "#{File.expand_path(__dir__)}/templates"
55
78
  end
56
79
 
80
+ # Set the template home directory
81
+ # @param template_home [String] (lib/active_notifier/templates)
57
82
  def template_home=(template_home)
58
83
  template_home = template_home.to_s
59
- raise ActiveNotifier::ConfigureError, "模板主目录不能为空" if template_home.empty?
84
+ raise ActiveNotifier::ConfigureError, "template_home value can't be blank" if template_home.empty?
60
85
  @template_home = template_home
61
86
  end
62
87
 
63
- # 消息优先类型, 字符串, 默认 :markdown, 对应模板后缀名,如果未指定该参数且存在多个模板,则优先选择此类型
88
+ # The priority type for message, if notifier execute without type option and there are multiple valid types,
89
+ # then ActiveNotifier will use the template with this type first
64
90
  def priority_type
65
91
  @priority_type || :markdown
66
92
  end
67
93
 
94
+ # Set the priority type
95
+ # @param priority_type [#to_sym] (:markdown)
68
96
  def priority_type=(priority_type)
69
97
  @priority_type = priority_type.to_sym
70
98
  end
71
99
 
72
- # 适配器以及基本连接
100
+ # The adapters and its base url
73
101
  def adapters_with_base_url
74
102
  @adapters_with_base_url ||= {
75
103
  dingtalk: "https://oapi.dingtalk.com/robot/send?access_token="
@@ -1,25 +1,38 @@
1
1
  module ActiveNotifier
2
2
  module Core
3
- def self.included(base)
4
- base.extend ClassMethods
5
- end
3
+ extend ActiveSupport::Concern
6
4
 
7
5
  module ClassMethods
8
- # Params:
9
- # channel: 消息渠道, 符号,
10
- # 例如设置为 :order, 则使用 channel_tokens[:order] 和 order.markdown.erb 模板发送消息
11
- # options:
12
- # template: 消息模版, 字符串, 默认 "default", 不需要加模版后缀
13
- # token: webhook token, 类型符号则取 chanenl_tokens[:symbol] 值,类型字符串则使用原值
14
- # type: 消息类型, 符号, 默认 :markdown, 对应模板后缀名
15
- # data: 传递数据, Hash, 默认 {}
16
- # 其他键的值会被当成适配器选项值,直接传到适配器中处理
6
+ # Message execute
7
+ # @param channel [#to_sym] Message channel, it will set template and token together
8
+ # @param options [Hash] ({})
9
+ # @option options [String] :template (nil) Message template, will use `options[:channel]` when this value is blank
10
+ # @option options [String, Symbol] :token (nil) Message webhook token,
11
+ # will use `options[:channel]` when this value is blank
12
+ # @option options [Symbol] :type (nil) Message type, it will use a specific template file, for example,
13
+ # when type is :text and template is order, then ActiveNotifier will choose `order.text.erb` for template file
14
+ # @option options [Hash] :data ({}) Message variable data for template, it can used in erb template file:
15
+ # ## #{data[:title]}
16
+ # > #{data[:order].to_json}
17
+ # @option options [Anything] Other options will used in adapter message execute,
18
+ # like Dingtalk require title for message, we can pass it here:
19
+ # `ActiveNotifer.exec(:default, title: "dingtalk title")`
20
+ # @raise [TemplateNotFoundError]
21
+ # @raise [UndefinedTokenError]
22
+ # @raise [AdapterOptionsInvalidError]
23
+ # @raise [AdapterTypeInvalidError]
24
+ # @raise [MessageBlankError]
25
+ # @example
26
+ # ActiveNotifer.config.channel_tokens = {
27
+ # default: "xxx"
28
+ # }
29
+ # ActiveNotifier.exec(:default)
17
30
  def exec(channel, **options)
18
31
  channel = channel&.to_sym
19
- raise ArgumentError, "Channel 不能为空" if channel.blank?
32
+ raise ArgumentError, ":channel can't be blank" if channel.blank?
20
33
  template = options[:template].to_s.presence || channel.to_s
21
34
  token = get_token(channel, options[:token])
22
- raise UndefinedTokenError, "Token 值未定义" if token.blank?
35
+ raise UndefinedTokenError if token.blank?
23
36
  type = options[:type]&.to_sym.presence || guess_type_by_files(template)
24
37
  data = options[:data].to_h
25
38
 
@@ -1,22 +1,9 @@
1
1
  module ActiveNotifier
2
- # 顶级错误
3
2
  class Error < StandardError; end
4
-
5
- # 配置错误
6
3
  class ConfigureError < Error; end
7
-
8
- # 模板未找到
9
4
  class TemplateNotFoundError < Error; end
10
-
11
- # 消息为空
12
5
  class MessageBlankError < Error; end
13
-
14
- # 适配器 type 无效
15
6
  class AdapterTypeInvalidError < Error; end
16
-
17
- # 适配器 options 无效
18
7
  class AdapterOptionsInvalidError < Error; end
19
-
20
- # Token 未定义
21
8
  class UndefinedTokenError < Error; end
22
9
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveNotifier
2
- VERSION = "0.1.0".freeze
2
+ VERSION = "0.2.0".freeze
3
3
  end
@@ -1,5 +1,4 @@
1
1
  require "active_notifier/version"
2
- require "active_support"
3
2
  require "active_support/all"
4
3
 
5
4
  module ActiveNotifier
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_notifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pine Wong
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-23 00:00:00.000000000 Z
11
+ date: 2018-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport