pechkin 0.1.3 → 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: 3e695894f50c29133f8399871c1dc8f1c8bdb9a489771ffe79c8bff0e8dc2afa
4
- data.tar.gz: bf863d530c1169f1416e8d267fc7a81543e5b4d70d254c3fe969c366f914f601
3
+ metadata.gz: b4d225464fc987cff4a7df181e175e4756c60ccc9982582d7906b4f85b194f3d
4
+ data.tar.gz: 5ca5b0e4c4aacf29e38a51a12217494539f5ef4a31f1eedaf799fc0170f9eb40
5
5
  SHA512:
6
- metadata.gz: bf403faa6d076ff2773e4dbfcedd80e364a396c873d5b23f2835883267e582e0d57306f93aee5556c1c7134f863101f61552b90efab632e5d75ea637aa630385
7
- data.tar.gz: 1960f894872b5112156aa893b9a38869f7ccc455ebe9104cf1f3bfe371c97035e54667dde86c7cb4d238802248d763f5550f0cd6a1ae6b510076748100493848
6
+ metadata.gz: f23b61d62cc9fbf3df9d4e578080147f9de3717f8e924d71329778674dcfa21a0bccd46b45e32d33c9ac30eb515d82b9cceeca2af34da1dea210414f20e6d8b3
7
+ data.tar.gz: ddc485f1678e2a4d4b6ab61f655dbaf69e7fbeb5e1dcc1ae338f2b039f6f77c4cdad6d7d1bfb828c7087c128d09a47e93cb40eb17b7c9a2aba455bef1ff5cdde
@@ -7,6 +7,7 @@ require_relative 'pechkin/connector'
7
7
  require_relative 'pechkin/channel'
8
8
  require_relative 'pechkin/api'
9
9
  require_relative 'pechkin/config'
10
+ require_relative 'pechkin/substitute'
10
11
 
11
12
  module Pechkin # :nodoc:
12
13
  class << self
@@ -16,6 +16,9 @@ module Pechkin # :nodoc:
16
16
  def create_chanels(chanels, bots)
17
17
  chanels.each do |chanel_name, chanel_desc|
18
18
  bot = bots[chanel_desc['bot']]
19
+
20
+ raise "'#{chanel_desc['bot']}' not found." unless bot
21
+
19
22
  connector = create_connector(bot, chanel_name)
20
23
 
21
24
  chat_ids = chanel_desc['chat_ids']
@@ -57,7 +60,6 @@ module Pechkin # :nodoc:
57
60
  end
58
61
  post message_name do
59
62
  template = message_desc['template']
60
- opts = message_desc['options'] || {}
61
63
  # Some services will send json, but without correct content-type, then
62
64
  # params will be parsed weirdely. So we try parse request body as json
63
65
  params = ensure_json(request.body.read, params)
@@ -67,7 +69,7 @@ module Pechkin # :nodoc:
67
69
  # received parameters.
68
70
  params = (message_desc['variables'] || {}).merge(params)
69
71
 
70
- channel.send_message(template, params, opts)
72
+ channel.send_message(template, params, message_desc)
71
73
  end
72
74
  # rubocop:enable Metrics/AbcSize
73
75
  end
@@ -10,15 +10,40 @@ module Pechkin
10
10
  @logger = ::Logger.new(STDOUT)
11
11
  end
12
12
 
13
- def send_message(message, data, options)
14
- text = Message.new(data).render(message)
13
+ def send_message(message, data, message_desc)
14
+ text = message.nil? ? '' : Message.new(data).render(message)
15
+
16
+ message_desc = substitute(data, message_desc)
17
+
15
18
  logger.warn 'Resulting text is empty' if text.empty?
16
- results = @channel_list.map { |id| @connector.send_message(id, text, options) }
19
+ results = @channel_list.map do |id|
20
+ @connector.send_message(id, text, message_desc)
21
+ end
22
+
17
23
  process_results(message, results)
18
24
  end
19
25
 
20
26
  private
21
27
 
28
+ def substitute(data, message_desc)
29
+ substitute_recursive(Substitute.new(data), message_desc)
30
+ end
31
+
32
+ def substitute_recursive(substitutions, object)
33
+ case object
34
+ when String
35
+ substitutions.process(object)
36
+ when Array
37
+ object.map { |o| substitute_recursive(substitutions, o) }
38
+ when Hash
39
+ r = {}
40
+ object.each { |k, v| r[k] = substitute_recursive(substitutions, v) }
41
+ r
42
+ else
43
+ object
44
+ end
45
+ end
46
+
22
47
  def process_results(message, results)
23
48
  success, error = results.partition { |_chat, code, _body| code < 400 }
24
49
  error.each do |chat, code, body|
@@ -7,9 +7,10 @@ require 'cgi'
7
7
  module Pechkin
8
8
  # Base connector
9
9
  class Connector
10
- def send_message(chat, message, options); end
10
+ def send_message(chat, message, message_desc); end
11
11
 
12
12
  def post_data(url, data, headers: {})
13
+ puts data.inspect
13
14
  uri = URI.parse(url)
14
15
  headers = { 'Content-Type' => 'application/json' }.merge(headers)
15
16
  http = Net::HTTP.new(uri.host, uri.port)
@@ -27,8 +28,8 @@ module Pechkin
27
28
  @bot_token = bot_token
28
29
  end
29
30
 
30
- def send_message(chat_id, message, options = {})
31
- options = { markup: 'HTML' }.update(options)
31
+ def send_message(chat_id, message, message_desc)
32
+ options = { parse_mode: message_desc['telegram_parse_mode'] || 'HTML' }
32
33
  params = options.update(chat_id: chat_id, text: message)
33
34
 
34
35
  response = post_data(method_url('sendMessage'), params)
@@ -47,12 +48,17 @@ module Pechkin
47
48
  @headers = { 'Authorization' => "Bearer #{bot_token}" }
48
49
  end
49
50
 
50
- def send_message(chat, message, options)
51
+ def send_message(chat, message, message_desc)
51
52
  text = CGI.unescape_html(message)
52
53
 
53
- return [chat, 'not sent: empty', ''] if text.strip.empty?
54
+ attachments = message_desc['slack_attachments'] || {}
55
+
56
+ if text.strip.empty? && attachments.empty?
57
+ return [chat, 400, 'not sent: empty']
58
+ end
59
+
60
+ params = { channel: chat, text: text, attachments: attachments }
54
61
 
55
- params = options.update(channel: chat, text: text)
56
62
  url = 'https://slack.com/api/chat.postMessage'
57
63
  response = post_data(url, params, headers: @headers)
58
64
 
@@ -0,0 +1,24 @@
1
+ module Pechkin # :nodoc:
2
+ # Replaces ${:varname:} patterns inside strings. All posible substitutions are
3
+ # provided through constructor.
4
+ #
5
+ # Complex templating and text fromatting (like float numbers formatting) is
6
+ # not a goal. We do not aim to implement new templating engine here. Just
7
+ # simple stuff.
8
+ class Substitute
9
+ # @param substitutions [Hash] hash of possible substitutions for replacement
10
+ def initialize(substitutions)
11
+ @substitutions = substitutions
12
+ end
13
+
14
+ def process(string)
15
+ string.gsub(/\$\{([A-Za-z0-9_]+)\}/) do |m|
16
+ key = m[2..-2]
17
+
18
+ value = @substitutions[key] || @substitutions[key.to_sym]
19
+
20
+ (value || m).to_s
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,7 +1,7 @@
1
1
  module Pechkin
2
2
  # Keeps actual version
3
3
  module Version
4
- VERSION = [0, 1, 3].freeze
4
+ VERSION = [0, 2, 0].freeze
5
5
  class << self
6
6
  def version_string
7
7
  VERSION.join('.')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pechkin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Arkhanhelsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-16 00:00:00.000000000 Z
11
+ date: 2019-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
@@ -53,6 +53,7 @@ files:
53
53
  - lib/pechkin/config.rb
54
54
  - lib/pechkin/connector.rb
55
55
  - lib/pechkin/message.rb
56
+ - lib/pechkin/substitute.rb
56
57
  - lib/pechkin/version.rb
57
58
  homepage: https://github.com/iarkhanhelsky/pechkin
58
59
  licenses: