slack_messaging 3.2.3 → 3.3.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: f57c2e595525a83ea5221bb71ba88b1f7c0e09ff4bc60f433e67760318e66edf
4
- data.tar.gz: 04306b4b5f3b0fd5c6e3bad638bc29ed058b7d05120d06a35d2a02e07c5541ca
3
+ metadata.gz: f64abe8c431be41a49398d8ae7a8972968d9fc0c4ce18d814bd650d498d918be
4
+ data.tar.gz: dcafa39cde670c4dd5b0c089e0440e7c82de81d70415fb6d814b81a4211b61e4
5
5
  SHA512:
6
- metadata.gz: 000b6e3cd35178510a1bfa29b85893d344158ee726bbd01d42243b6c2a8d71ab9cce963c6bb04cdaa2dc1c86c059254d4758992dfa02c43ee57808ba97dc2fd6
7
- data.tar.gz: 27c6ba43e85064e4bf9757f24bfada8a8dcbb5d20313a75b07db291a778dd988fe6558b871c061ea27c2691ca8fa9d6177edd12b3521af885dddb24cea111572
6
+ metadata.gz: edff54c98cb3ff17bdb0aa42f0530f9a3560e999db259d1f7ef7ae2f998d0561978366aec5215be1061d7434c6afd5dd631f9161dff684b0ca3670fca2f2b6c3
7
+ data.tar.gz: cbc96620ccdc82142722873992e579f31e2d5f409a4620757959c662118e0fe673e5672f3e950af0e3a35f379ee968008eb8cc6bac097111392f1bf503d3967f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- slack_messaging (3.2.3)
4
+ slack_messaging (3.3.0)
5
5
  gli (~> 2.10)
6
6
  hashie (>= 4.1, <= 5)
7
7
  highline_wrapper (~> 1.1)
@@ -13,13 +13,13 @@ GEM
13
13
  specs:
14
14
  ast (2.4.2)
15
15
  coderay (1.1.3)
16
- concurrent-ruby (1.1.9)
17
- diff-lcs (1.4.4)
18
- faker (2.19.0)
19
- i18n (>= 1.6, < 2)
20
- ffi (1.15.4)
21
- formatador (0.3.0)
22
- gli (2.20.1)
16
+ concurrent-ruby (1.1.10)
17
+ diff-lcs (1.5.0)
18
+ faker (2.22.0)
19
+ i18n (>= 1.8.11, < 2)
20
+ ffi (1.15.5)
21
+ formatador (1.1.0)
22
+ gli (2.21.0)
23
23
  guard (2.18.0)
24
24
  formatador (>= 0.2.4)
25
25
  listen (>= 2.7, < 4.0)
@@ -41,65 +41,66 @@ GEM
41
41
  httparty (0.20.0)
42
42
  mime-types (~> 3.0)
43
43
  multi_xml (>= 0.5.2)
44
- i18n (1.8.11)
44
+ i18n (1.12.0)
45
45
  concurrent-ruby (~> 1.0)
46
- json (2.6.1)
47
- listen (3.7.0)
46
+ json (2.6.2)
47
+ listen (3.7.1)
48
48
  rb-fsevent (~> 0.10, >= 0.10.3)
49
49
  rb-inotify (~> 0.9, >= 0.9.10)
50
50
  lumberjack (1.2.8)
51
51
  method_source (1.0.0)
52
52
  mime-types (3.4.1)
53
53
  mime-types-data (~> 3.2015)
54
- mime-types-data (3.2021.1115)
54
+ mime-types-data (3.2022.0105)
55
55
  multi_xml (0.6.0)
56
56
  nenv (0.3.0)
57
57
  notiffany (0.1.3)
58
58
  nenv (~> 0.1)
59
59
  shellany (~> 0.0)
60
- parallel (1.21.0)
61
- parser (3.0.3.2)
60
+ parallel (1.22.1)
61
+ parser (3.1.2.1)
62
62
  ast (~> 2.4.1)
63
63
  pry (0.14.1)
64
64
  coderay (~> 1.1)
65
65
  method_source (~> 1.0)
66
- rainbow (3.0.0)
67
- rb-fsevent (0.11.0)
66
+ rainbow (3.1.1)
67
+ rb-fsevent (0.11.1)
68
68
  rb-inotify (0.10.1)
69
69
  ffi (~> 1.0)
70
- regexp_parser (2.2.0)
70
+ regexp_parser (2.5.0)
71
71
  rexml (3.2.5)
72
- rspec (3.10.0)
73
- rspec-core (~> 3.10.0)
74
- rspec-expectations (~> 3.10.0)
75
- rspec-mocks (~> 3.10.0)
76
- rspec-core (3.10.1)
77
- rspec-support (~> 3.10.0)
78
- rspec-expectations (3.10.1)
72
+ rspec (3.11.0)
73
+ rspec-core (~> 3.11.0)
74
+ rspec-expectations (~> 3.11.0)
75
+ rspec-mocks (~> 3.11.0)
76
+ rspec-core (3.11.0)
77
+ rspec-support (~> 3.11.0)
78
+ rspec-expectations (3.11.0)
79
79
  diff-lcs (>= 1.2.0, < 2.0)
80
- rspec-support (~> 3.10.0)
81
- rspec-mocks (3.10.2)
80
+ rspec-support (~> 3.11.0)
81
+ rspec-mocks (3.11.1)
82
82
  diff-lcs (>= 1.2.0, < 2.0)
83
- rspec-support (~> 3.10.0)
84
- rspec-support (3.10.3)
85
- rubocop (1.23.0)
83
+ rspec-support (~> 3.11.0)
84
+ rspec-support (3.11.0)
85
+ rubocop (1.35.1)
86
+ json (~> 2.3)
86
87
  parallel (~> 1.10)
87
- parser (>= 3.0.0.0)
88
+ parser (>= 3.1.2.1)
88
89
  rainbow (>= 2.2.2, < 4.0)
89
90
  regexp_parser (>= 1.8, < 3.0)
90
- rexml
91
- rubocop-ast (>= 1.12.0, < 2.0)
91
+ rexml (>= 3.2.5, < 4.0)
92
+ rubocop-ast (>= 1.20.1, < 2.0)
92
93
  ruby-progressbar (~> 1.7)
93
94
  unicode-display_width (>= 1.4.0, < 3.0)
94
- rubocop-ast (1.14.0)
95
- parser (>= 3.0.1.1)
95
+ rubocop-ast (1.21.0)
96
+ parser (>= 3.1.1.0)
96
97
  ruby-progressbar (1.11.0)
97
98
  shellany (0.0.1)
98
- thor (1.1.0)
99
- unicode-display_width (2.1.0)
99
+ thor (1.2.1)
100
+ unicode-display_width (2.2.0)
100
101
 
101
102
  PLATFORMS
102
- x86_64-darwin-19
103
+ arm64-darwin-21
103
104
 
104
105
  DEPENDENCIES
105
106
  bundler (~> 2.2)
@@ -111,4 +112,4 @@ DEPENDENCIES
111
112
  slack_messaging!
112
113
 
113
114
  BUNDLED WITH
114
- 2.2.32
115
+ 2.3.20
data/Guardfile CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  guard :rspec, cmd: 'bundle exec rspec', all_on_start: true do
4
+ watch('spec/spec_helper.rb') { 'spec' }
5
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
6
  watch(%r{^spec/.+_spec\.rb$})
5
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
6
- watch('spec/spec_helper.rb') { 'spec' }
7
7
  end
data/README.md CHANGED
@@ -22,11 +22,15 @@ Or install it yourself as:
22
22
  gem install slack_messaging
23
23
  ```
24
24
 
25
- ## Usage
25
+ ## Setup
26
26
 
27
27
  This project requires a config file that should look like this:
28
28
 
29
29
  ```yml
30
+ discord:
31
+ avatar_url: <PUBLIC URL OF AN IMAGE>
32
+ username: <AWESOME USER NAME>
33
+ webhook_url: <DISCORD WEBHOOK URL>
30
34
  slack:
31
35
  channel: <AWESOME CHANNEL NAME>
32
36
  username: <AWESOME USER NAME>
@@ -34,13 +38,13 @@ slack:
34
38
  icon_emoji: ':<SOME EMOJI>:'
35
39
  ```
36
40
 
37
- To generate this file at `~/.slack_messaging.yml`, please run this command:
41
+ A config file can have both Discord and Slack settings, or just one or the other. To easily generate this file at `~/.slack_messaging.yml`, please run this command once for each setting type:
38
42
 
39
43
  ```bash
40
44
  slack-messaging setup
41
45
  ```
42
46
 
43
- To obtain the webhook URL, go to [this link](https://api.slack.com/messaging/webhooks).
47
+ To obtain a Slack webhook URL, follow [these instructions](https://slack.com/help/articles/115005265063-Incoming-webhooks-for-Slack). To obtain a Discord webhook URL, follow [these instructions](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks).
44
48
 
45
49
  If you'd like to create the config file at a different directory, I recommend using the `setup` command, and then manually moving the file to your desired location:
46
50
 
@@ -50,13 +54,13 @@ slack-messaging setup
50
54
  mv ~/.slack_messaging.yml /PATH/TO/FILE/config.yml
51
55
  ```
52
56
 
53
- And then you can pass in that specific file location like this:
57
+ And then you can pass in that specific file location using the global `-c`/`--config` flag:
54
58
 
55
59
  ```bash
56
60
  slack-messaging --config="/PATH/TO/FILE/config.yml" send
57
61
  ```
58
62
 
59
- Once the config file is set up, the project is ready to go!
63
+ ## Usage
60
64
 
61
65
  To print a friendly message to Slack, run:
62
66
 
@@ -78,9 +82,29 @@ You can even print multiple messages at once:
78
82
  slack-messaging send 'MESSAGE 1' 'MESSAGE 2' 'MESSAGE 3' ... 'MESSAGE N'
79
83
  ```
80
84
 
81
- The output of slack_messaging will look something like this:
85
+ > When using special characters in your custom messages, use single quotes instead of double quotes
86
+
87
+ If your config file contains both Slack and Discord settings, then running a basic `send` command (either passing in a message or not), will notify both Slack and Discord. To specify which service to send a message to, you can pass in a `-s`/`--service` flag:
88
+
89
+ ```bash
90
+ slack-messaging send --service slack
91
+ # OR
92
+ slack-messaging send --service discord
93
+ ```
94
+
95
+ To specify a service _and_ send a customized message, you can pass both at once:
96
+
97
+ ```bash
98
+ slack-messaging send -s slack 'MESSAGE 1'
99
+ ```
100
+
101
+ The output of a Slack message will look something like this:
102
+
103
+ <img src="https://github.com/emmahsax/slack_messaging/blob/main/message_slack.png" width="500">
104
+
105
+ The output of a Discord message will look something like this:
82
106
 
83
- <img src="https://github.com/emmahsax/slack_messaging/blob/main/QuoteExample.png" width="500">
107
+ <img src="https://github.com/emmahsax/slack_messaging/blob/main/message_discord.png" width="500">
84
108
 
85
109
  I hope you enjoy printing fun and specialized messages to Slack!
86
110
 
data/bin/slack-messaging CHANGED
@@ -13,7 +13,7 @@ version SlackMessaging::VERSION
13
13
 
14
14
  wrap_help_text :verbatim
15
15
 
16
- flag [:config], desc: 'Slack Messaging config file path', default_value: SlackMessaging::DefaultPaths.config
16
+ flag %i[c config], desc: 'Slack Messaging config file path', default_value: SlackMessaging::DefaultPaths.config
17
17
 
18
18
  program_long_desc "
19
19
  DOCUMENTATION
@@ -28,6 +28,10 @@ end
28
28
 
29
29
  desc 'Prints a variety of messages to Slack'
30
30
  command 'send' do |c|
31
+ c.desc "The service ('slack' or 'discord') that you wish to notify - if none is given, Slack Messaging will " \
32
+ 'notify each service present in the config file'
33
+ c.flag %i[s service]
34
+
31
35
  c.action do |_global_options, options, args|
32
36
  SlackMessaging::Send.execute(args, options)
33
37
  end
@@ -9,10 +9,10 @@ module SlackMessaging
9
9
 
10
10
  def load(path)
11
11
  load_config(path)
12
- config
12
+ full_config
13
13
  end
14
14
 
15
- private def config
15
+ def full_config
16
16
  config_data.to_hash
17
17
  end
18
18
 
@@ -8,7 +8,7 @@ module SlackMessaging
8
8
  end
9
9
 
10
10
  private def home
11
- ENV['HOME'] || '.'
11
+ Dir.home || '.'
12
12
  end
13
13
  end
14
14
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlackMessaging
4
+ class NotifyDiscord
5
+ attr_accessor :avatar_url, :text, :username, :webhook_url
6
+
7
+ def initialize(text)
8
+ self.avatar_url = SlackMessaging::Config.discord[:avatar_url] || 'https://i.imgur.com/9ZTbiSF.jpg'
9
+ self.text = text
10
+ self.username = SlackMessaging::Config.discord[:username] || 'Slack Messaging'
11
+ self.webhook_url = SlackMessaging::Config.discord[:webhook_url]
12
+ end
13
+
14
+ def perform
15
+ options = {
16
+ avatar_url: avatar_url,
17
+ content: text,
18
+ username: username
19
+ }
20
+
21
+ `curl -s -H "Content-Type: application/json" -d '#{options.to_json.gsub("'", "'\\\\''")}' '#{webhook_url}'`
22
+ end
23
+ end
24
+ end
@@ -2,22 +2,22 @@
2
2
 
3
3
  module SlackMessaging
4
4
  class NotifySlack
5
- attr_accessor :text, :channel, :webhook_url, :username, :icon_url, :icon_emoji
5
+ attr_accessor :channel, :icon_emoji, :text, :username, :webhook_url
6
6
 
7
7
  def initialize(text)
8
+ self.channel = SlackMessaging::Config.slack[:channel] || 'general'
9
+ self.icon_emoji = SlackMessaging::Config.slack[:icon_emoji] || ':robot_face:'
8
10
  self.text = text
9
- self.channel = SlackMessaging::Config.slack[:channel]
11
+ self.username = SlackMessaging::Config.slack[:username] || 'Slack Messaging'
10
12
  self.webhook_url = SlackMessaging::Config.slack[:webhook_url]
11
- self.username = SlackMessaging::Config.slack[:username] || 'MessageMe'
12
- self.icon_emoji = SlackMessaging::Config.slack[:icon_emoji] || ':mailbox_with_mail'
13
13
  end
14
14
 
15
15
  def perform
16
16
  options = {
17
17
  channel: channel,
18
- username: username,
19
18
  icon_emoji: icon_emoji,
20
- text: text
19
+ text: text,
20
+ username: username
21
21
  }
22
22
 
23
23
  HTTParty.post(webhook_url, body: options.to_json)
@@ -5,19 +5,32 @@ module SlackMessaging
5
5
  class << self
6
6
  attr_accessor :options
7
7
 
8
- def execute(args, _options = nil)
8
+ def execute(args, options)
9
9
  if args.empty?
10
10
  message = SlackMessaging::RandomMessage.acquire_random_quote
11
- print_message(message)
11
+ distribute_notification(message, options[:service])
12
12
  else
13
13
  args.each do |arg_message|
14
- print_message(arg_message)
14
+ distribute_notification(arg_message, options[:service])
15
15
  end
16
16
  end
17
17
  end
18
18
 
19
- private def print_message(message)
20
- SlackMessaging::NotifySlack.new(message).perform
19
+ private def distribute_notification(message, service)
20
+ if service
21
+ print_message(message, service)
22
+ else
23
+ SlackMessaging::Config.full_config.each { |s, _| print_message(message, s) }
24
+ end
25
+ end
26
+
27
+ private def print_message(message, service)
28
+ case service
29
+ when 'discord'
30
+ SlackMessaging::NotifyDiscord.new(message).perform
31
+ when 'slack'
32
+ SlackMessaging::NotifySlack.new(message).perform
33
+ end
21
34
  end
22
35
  end
23
36
  end
@@ -1,38 +1,76 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Metrics/ClassLength
3
4
  module SlackMessaging
4
5
  class Setup
5
6
  class << self
7
+ # rubocop:disable Metrics/MethodLength
6
8
  # rubocop:disable Style/ConditionalAssignment
7
9
  def execute
8
10
  if config_file_exists?
9
11
  answer = highline.ask_yes_no(
10
- "It looks like the #{default_config} file already exists. Do you wish to replace it? (y/n)",
12
+ "It looks like the #{default_config} file already exists. Do you wish to edit it? (y/n)",
11
13
  { required: true }
12
14
  )
13
15
  else
14
16
  answer = true
15
17
  end
16
18
 
17
- create_or_update_config_file(ask_config_questions) if answer
19
+ exit unless answer
20
+
21
+ type = highline.ask_multiple_choice(
22
+ 'Which type of config do you wish to create/update?',
23
+ %w[Discord Slack],
24
+ required: true
25
+ )[:value]
26
+
27
+ case type
28
+ when 'Discord'
29
+ file_contents = generate_discord_config_file(ask_discord_config_questions)
30
+ when 'Slack'
31
+ file_contents = generate_slack_config_file(ask_slack_config_questions)
32
+ end
33
+
34
+ create_or_update_config_file(file_contents)
18
35
  end
36
+ # rubocop:enable Metrics/MethodLength
19
37
  # rubocop:enable Style/ConditionalAssignment
20
38
 
21
- private def create_or_update_config_file(answers)
22
- contents = generate_config_file(answers)
39
+ private def create_or_update_config_file(contents)
23
40
  puts "Creating or updating your #{default_config} file..."
24
41
  File.open(default_config, 'w') { |file| file.puts contents }
25
42
  puts 'Done!'
26
43
  end
27
44
 
28
- private def generate_config_file(answers)
45
+ private def generate_discord_config_file(answers)
46
+ file_contents = ''.dup
47
+ file_contents << "discord:\n"
48
+ file_contents << " avatar_url: #{answers[:avatar_url].strip}\n"
49
+ file_contents << " username: #{answers[:username].strip}\n"
50
+ file_contents << " webhook_url: #{answers[:webhook_url].strip}\n"
51
+ contents_regex = /(discord:\n\s+avatar_url: \S+\n\s+username: [ \S]+\n\s+webhook_url: \S+\n)/
52
+ compare_configs(contents_regex, file_contents)
53
+ end
54
+
55
+ private def generate_slack_config_file(answers)
29
56
  file_contents = ''.dup
30
57
  file_contents << "slack:\n"
31
58
  file_contents << " channel: #{answers[:channel].tr('#', '').strip}\n"
59
+ file_contents << " icon_emoji: '#{answers[:icon_emoji].strip}'\n"
32
60
  file_contents << " username: #{answers[:username].strip}\n"
33
61
  file_contents << " webhook_url: #{answers[:webhook_url].strip}\n"
34
- file_contents << " icon_emoji: '#{answers[:icon_emoji].strip}'"
35
- file_contents
62
+ contents_regex = /(slack:\n\s+channel: \S+\n\s+icon_emoji: \S+\n\s+username: [ \S]+\n\s+webhook_url: \S+\n)/
63
+ compare_configs(contents_regex, file_contents)
64
+ end
65
+
66
+ private def compare_configs(contents_regex, file_contents)
67
+ if config_file_exists? && contents_regex.match(File.read(default_config))
68
+ File.read(default_config).gsub(contents_regex, file_contents)
69
+ elsif config_file_exists?
70
+ File.read(default_config) << file_contents
71
+ else
72
+ file_contents
73
+ end
36
74
  end
37
75
 
38
76
  private def config_file_exists?
@@ -40,31 +78,55 @@ module SlackMessaging
40
78
  end
41
79
 
42
80
  # rubocop:disable Metrics/MethodLength
43
- private def ask_config_questions
81
+ private def ask_discord_config_questions
82
+ answers = {}
83
+
84
+ answers[:webhook_url] = ask_question(
85
+ "What is your Discord webhook URL? If you don't have one yet, please navigate " \
86
+ 'to https://discord.com/channels/@me to create one for your server, and then come back ' \
87
+ 'here and paste it in the Terminal.',
88
+ nil,
89
+ required: true
90
+ )
91
+
92
+ answers[:username] = ask_question(
93
+ 'What Discord username do you wish to post as? (default is "Slack Messaging")',
94
+ 'Slack Messaging'
95
+ )
96
+
97
+ answers[:avatar_url] = ask_question(
98
+ 'What avatar URL would you like to post with? (default is "https://i.imgur.com/9ZTbiSF.jpg")',
99
+ 'https://i.imgur.com/9ZTbiSF.jpg'
100
+ )
101
+
102
+ answers
103
+ end
104
+
105
+ private def ask_slack_config_questions
44
106
  answers = {}
45
107
 
46
108
  answers[:webhook_url] = ask_question(
47
- "What is your Slack webhook URL? If you don't have one yet, please navigate" \
48
- ' to https://api.slack.com/messaging/webhooks to create one, and then come back' \
49
- ' here and paste it in the Terminal.',
109
+ "What is your Slack webhook URL? If you don't have one yet, please navigate " \
110
+ 'to https://api.slack.com/messaging/webhooks to create one, and then come back ' \
111
+ 'here and paste it in the Terminal.',
50
112
  nil,
51
113
  required: true
52
114
  )
53
115
 
54
116
  answers[:channel] = ask_question(
55
- 'What slack channel do you wish to post to? (default is "#general")',
117
+ 'What Slack channel do you wish to post to? (default is "#general")',
56
118
  '#general'
57
119
  )
58
120
 
59
121
  answers[:username] = ask_question(
60
- "What slack username do you wish to post as? (default is \"Let's Get Quoty\")",
61
- "Let's Get Quoty"
122
+ 'What Slack username do you wish to post as? (default is "Slack Messaging")',
123
+ 'Slack Messaging'
62
124
  )
63
125
 
64
126
  answers[:icon_emoji] = ask_question(
65
- 'What emoji would you like to post with (include the colons at the beginning and end' \
66
- ' of the emoji name)? (default is ":mailbox_with_mail:")',
67
- ':mailbox_with_mail:'
127
+ 'What emoji would you like to post with (include the colons at the beginning and end ' \
128
+ 'of the emoji name)? (default is ":robot_face:")',
129
+ ':robot_face:'
68
130
  )
69
131
 
70
132
  answers
@@ -85,3 +147,4 @@ module SlackMessaging
85
147
  end
86
148
  end
87
149
  end
150
+ # rubocop:enable Metrics/ClassLength
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SlackMessaging
4
- VERSION = '3.2.3'
4
+ VERSION = '3.3.0'
5
5
  end
@@ -8,7 +8,7 @@ require 'json'
8
8
 
9
9
  files = "#{File.expand_path(File.join(File.dirname(File.absolute_path(__FILE__)), 'slack_messaging'))}/**/*.rb"
10
10
 
11
- Dir[files].each do |file|
11
+ Dir[files].sort.each do |file|
12
12
  require_relative file
13
13
  end
14
14
 
Binary file
data/message_slack.png ADDED
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack_messaging
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.3
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emma Sax
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-10 00:00:00.000000000 Z
11
+ date: 2022-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gli
@@ -182,23 +182,20 @@ files:
182
182
  - Gemfile.lock
183
183
  - Guardfile
184
184
  - LICENSE.md
185
- - QuoteExample.png
186
185
  - README.md
187
186
  - Rakefile
188
187
  - bin/slack-messaging
189
188
  - lib/slack_messaging.rb
190
189
  - lib/slack_messaging/config.rb
191
190
  - lib/slack_messaging/default_paths.rb
191
+ - lib/slack_messaging/notify_discord.rb
192
192
  - lib/slack_messaging/notify_slack.rb
193
193
  - lib/slack_messaging/random_message.rb
194
194
  - lib/slack_messaging/send.rb
195
195
  - lib/slack_messaging/setup.rb
196
196
  - lib/slack_messaging/version.rb
197
- - spec/slack_messaging/config_spec.rb
198
- - spec/slack_messaging/notify_slack_spec.rb
199
- - spec/slack_messaging/random_message_spec.rb
200
- - spec/slack_messaging/setup_spec.rb
201
- - spec/spec_helper.rb
197
+ - message_discord.png
198
+ - message_slack.png
202
199
  homepage: https://github.com/emmahsax/slack_messaging
203
200
  licenses:
204
201
  - BSD-3-Clause
@@ -219,13 +216,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
219
216
  - !ruby/object:Gem::Version
220
217
  version: '0'
221
218
  requirements: []
222
- rubygems_version: 3.2.32
219
+ rubygems_version: 3.3.17
223
220
  signing_key:
224
221
  specification_version: 4
225
222
  summary: Personalized quotes and messages sent straight to Slack
226
- test_files:
227
- - spec/spec_helper.rb
228
- - spec/slack_messaging/config_spec.rb
229
- - spec/slack_messaging/notify_slack_spec.rb
230
- - spec/slack_messaging/random_message_spec.rb
231
- - spec/slack_messaging/setup_spec.rb
223
+ test_files: []
data/QuoteExample.png DELETED
Binary file
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'slack_messaging'
5
-
6
- describe SlackMessaging::Config do
7
- subject { SlackMessaging::Config }
8
-
9
- context 'config key methods' do
10
- it 'should return nil when not set' do
11
- expect(subject.doesnt_exist).to eql(nil)
12
- expect(subject.doesnt_exist?).to eql(false)
13
- end
14
-
15
- it 'should return the config value when set' do
16
- config_value = Faker::Lorem.word
17
- subject.new_value = config_value
18
- expect(subject.new_value).to eql(config_value)
19
- end
20
- end
21
-
22
- context 'after loading a config file' do
23
- let(:domain) { Faker::Internet.domain_name }
24
- let(:sentence) { Faker::Lorem.sentence }
25
-
26
- let(:config_file) do
27
- {
28
- domain: domain,
29
- slack: {
30
- slack_option: true,
31
- username: Faker::Name.name,
32
- icon_url: Faker::Internet.url,
33
- channel: Faker::Lorem.word,
34
- webhook: Faker::Internet.url
35
- }
36
- }
37
- end
38
-
39
- before do
40
- allow(YAML).to receive(:load_file).and_return(config_file)
41
- allow(File).to receive(:exist?).and_return(true)
42
- subject.load(Faker::Lorem.word)
43
- end
44
-
45
- it 'calling a method corresponding to a key in the file should return the value' do
46
- expect(subject.domain).to eql(domain)
47
- expect(subject.slack).to be_kind_of(Hash)
48
- expect(subject.slack[:slack_option]).to eql(true)
49
- end
50
-
51
- it 'overwriting values should work' do
52
- expect(subject.slack).to be_kind_of(Hash)
53
- subject.slack = sentence
54
- expect(subject.slack).to eql(sentence)
55
- end
56
- end
57
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'slack_messaging'
5
-
6
- describe SlackMessaging::NotifySlack do
7
- let(:sentence) { Faker::Lorem.sentence }
8
- let(:channel) { Faker::Lorem.word }
9
- let(:username) { Faker::Name.name }
10
- let(:webhook) { Faker::Internet.url }
11
- let(:emoji) { Faker::Internet.url }
12
-
13
- let(:config_file) do
14
- {
15
- slack: {
16
- slack_option: true,
17
- username: username,
18
- icon_emoji: emoji,
19
- channel: channel,
20
- webhook_url: webhook
21
- }
22
- }
23
- end
24
-
25
- before :each do
26
- allow(YAML).to receive(:load_file).and_return(config_file)
27
- allow(File).to receive(:exist?).and_return(true)
28
- SlackMessaging::Config.load(Faker::Lorem.word)
29
- end
30
-
31
- subject { SlackMessaging::NotifySlack.new(sentence) }
32
-
33
- it 'should call HTTParty' do
34
- expect(HTTParty).to receive(:post)
35
- subject.perform
36
- end
37
-
38
- it 'should define certain values' do
39
- expect(subject.text).to eq(sentence)
40
- expect(subject.channel).to eq(channel)
41
- expect(subject.username).to eq(username)
42
- expect(subject.webhook_url).to eq(webhook)
43
- expect(subject.icon_emoji).to eq(emoji)
44
- end
45
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'slack_messaging'
5
-
6
- describe SlackMessaging::RandomMessage do
7
- let(:quote_object) { double(:quote_object, body: quote_json) }
8
-
9
- let(:quote_json) do
10
- "{\"_id\":\"4MRaRRKq4Tcg\",
11
- \"tags\":[\"famous-quotes\"],
12
- \"content\":\"There are two ways of spreading light: to be the candle or the mirror that reflects it.\",
13
- \"author\":\"Edith Wharton\",\"length\":87
14
- }"
15
- end
16
-
17
- before do
18
- allow(HTTParty).to receive(:get).and_return(quote_object)
19
- end
20
-
21
- subject { SlackMessaging::RandomMessage }
22
-
23
- it 'should get a string message' do
24
- message = subject.acquire_random_quote
25
- expect(message).to be_instance_of(String)
26
- end
27
-
28
- it 'should get a message that includes a newline' do
29
- message = subject.acquire_random_quote
30
- expect(message.include?("\n")).to eq(true)
31
- end
32
-
33
- it 'should get a message that includes a —' do
34
- message = subject.acquire_random_quote
35
- expect(message.include?('—')).to eq(true)
36
- end
37
-
38
- it 'should use HTTParty to ping an API' do
39
- expect(HTTParty).to receive(:get)
40
- subject.acquire_random_quote
41
- end
42
-
43
- it 'should have the JSON parse the response content twice' do
44
- expect(JSON).to receive(:parse).at_least(2).times.and_return(JSON.parse(quote_json))
45
- subject.acquire_random_quote
46
- end
47
- end
@@ -1,140 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require 'slack_messaging'
5
-
6
- describe SlackMessaging::Setup do
7
- let(:highline_wrapper) { double(:highline_wrapper, ask: Faker::Lorem.word, ask_yes_no: true) }
8
- let(:answers) do
9
- {
10
- channel: Faker::Lorem.word,
11
- username: Faker::Lorem.word,
12
- webhook_url: Faker::Internet.url,
13
- icon_emoji: ":#{Faker::Lorem.word}:"
14
- }
15
- end
16
-
17
- before do
18
- allow(HighlineWrapper).to receive(:new).and_return(highline_wrapper)
19
- allow(subject).to receive(:puts)
20
- end
21
-
22
- after do
23
- SlackMessaging::Setup.instance_variable_set('@highline', nil)
24
- end
25
-
26
- subject { SlackMessaging::Setup }
27
-
28
- describe '#self.execute' do
29
- it 'should ask a question if the config file exists' do
30
- allow(subject).to receive(:config_file_exists?).and_return(true)
31
- allow(File).to receive(:exists?).and_return(true)
32
- expect(highline_wrapper).to receive(:ask_yes_no).and_return(true)
33
- allow(subject).to receive(:create_or_update_config_file).and_return(true)
34
- allow(subject).to receive(:ask_config_questions).and_return(true)
35
- subject.execute
36
- end
37
-
38
- it 'should call to create or update the config file' do
39
- allow(File).to receive(:exists?).and_return(true)
40
- allow(highline_wrapper).to receive(:ask_yes_no).and_return(true)
41
- expect(subject).to receive(:create_or_update_config_file).and_return(true)
42
- expect(subject).to receive(:ask_config_questions).and_return(true)
43
- subject.execute
44
- end
45
-
46
- it 'should skip if the user opts not to continue' do
47
- allow(subject).to receive(:config_file_exists?).and_return(true)
48
- allow(File).to receive(:exists?).and_return(true)
49
- allow(highline_wrapper).to receive(:ask_yes_no).and_return(false)
50
- expect(subject).not_to receive(:create_or_update_config_file)
51
- expect(subject).not_to receive(:ask_config_questions)
52
- subject.execute
53
- end
54
- end
55
-
56
- describe '#self.create_or_update_config_file' do
57
- it 'should generate the file based on the answers to the questions' do
58
- expect(subject).to receive(:generate_config_file)
59
- allow(File).to receive(:open).and_return(nil)
60
- subject.send(:create_or_update_config_file, answers)
61
- end
62
-
63
- it 'should open the file for writing' do
64
- allow(subject).to receive(:generate_config_file)
65
- expect(File).to receive(:open).and_return(nil)
66
- subject.send(:create_or_update_config_file, answers)
67
- end
68
- end
69
-
70
- describe '#self.generate_config_file' do
71
- it 'returns a string' do
72
- expect(subject.send(:generate_config_file, answers)).to be_a(String)
73
- end
74
- end
75
-
76
- describe '#self.config_file_exists?' do
77
- it 'should return true if the file exists' do
78
- allow(File).to receive(:exist?).and_return(true)
79
- expect(subject.send(:config_file_exists?)).to eq(true)
80
- end
81
-
82
- it 'should return false if the file does not exist' do
83
- allow(File).to receive(:exist?).and_return(false)
84
- expect(subject.send(:config_file_exists?)).to eq(false)
85
- end
86
- end
87
-
88
- describe '#self.ask_question' do
89
- it 'should use highline to ask a question' do
90
- expect(highline_wrapper).to receive(:ask).and_return('')
91
- subject.send(:ask_question, Faker::Lorem.sentence, nil)
92
- end
93
-
94
- it 'should return nil if the highline client gets an empty string' do
95
- allow(highline_wrapper).to receive(:ask).and_return(nil)
96
- expect(subject.send(:ask_question, Faker::Lorem.sentence, nil)).to be_nil
97
- end
98
-
99
- it 'should return the answer if it is given' do
100
- answer = Faker::Lorem.sentence
101
- allow(highline_wrapper).to receive(:ask).and_return(answer)
102
- expect(subject.send(:ask_question, Faker::Lorem.sentence, :default)).to be(answer)
103
- end
104
- end
105
-
106
- describe '#self.ask_config_questions' do
107
- it 'should call to ask at least four questions' do
108
- expect(subject).to receive(:ask_question).at_least(4).times.and_return(Faker::Lorem.word)
109
- subject.send(:ask_config_questions)
110
- end
111
-
112
- it 'should return the defaults if nothing is given' do
113
- slack_url = Faker::Internet.url
114
- defaults = {
115
- channel: 'general',
116
- username: "Let's Get Quoty",
117
- webhook_url: slack_url,
118
- icon_emoji: ':mailbox_with_mail:'
119
- }
120
- allow(subject).to receive(:ask_question).with(
121
- "What is your Slack webhook URL? If you don't have one yet, please navigate to https://api.slack.com/messaging/webhooks to create one, and then come back here and paste it in the Terminal.",
122
- nil,
123
- required: true
124
- ).and_return(slack_url)
125
- allow(subject).to receive(:ask_question).with(
126
- 'What slack channel do you wish to post to? (default is "#general")',
127
- '#general'
128
- ).and_return('general')
129
- allow(subject).to receive(:ask_question).with(
130
- "What slack username do you wish to post as? (default is \"Let's Get Quoty\")",
131
- "Let's Get Quoty"
132
- ).and_return("Let's Get Quoty")
133
- allow(subject).to receive(:ask_question).with(
134
- 'What emoji would you like to post with (include the colons at the beginning and end of the emoji name)? (default is ":mailbox_with_mail:")',
135
- ':mailbox_with_mail:'
136
- ).and_return(':mailbox_with_mail:')
137
- expect(subject.send(:ask_config_questions)).to eq(defaults)
138
- end
139
- end
140
- end
data/spec/spec_helper.rb DELETED
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'faker'
4
- require 'pry'
5
-
6
- # This file was generated by the `rspec --init` command. Conventionally, all
7
- # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
8
- # The generated `.rspec` file contains `--require spec_helper` which will cause
9
- # this file to always be loaded, without a need to explicitly require it in any
10
- # files.
11
- #
12
- # Given that it is always loaded, you are encouraged to keep this file as
13
- # light-weight as possible. Requiring heavyweight dependencies from this file
14
- # will add to the boot time of your test suite on EVERY test run, even for an
15
- # individual file that may not need all of that loaded. Instead, consider making
16
- # a separate helper file that requires the additional dependencies and performs
17
- # the additional setup, and require it from the spec files that actually need
18
- # it.
19
- #
20
- # The `.rspec` file also contains a few flags that are not defaults but that
21
- # users commonly want.
22
- #
23
- # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
24
- RSpec.configure do |config|
25
- # rspec-expectations config goes here. You can use an alternate
26
- # assertion/expectation library such as wrong or the stdlib/minitest
27
- # assertions if you prefer.
28
- config.expect_with :rspec do |expectations|
29
- # This option will default to `true` in RSpec 4. It makes the `description`
30
- # and `failure_message` of custom matchers include text for helper methods
31
- # defined using `chain`, e.g.:
32
- # be_bigger_than(2).and_smaller_than(4).description
33
- # # => "be bigger than 2 and smaller than 4"
34
- # ...rather than:
35
- # # => "be bigger than 2"
36
- expectations.include_chain_clauses_in_custom_matcher_descriptions = true
37
- end
38
-
39
- config.filter_run focus: true
40
- config.run_all_when_everything_filtered = true
41
-
42
- # rspec-mocks config goes here. You can use an alternate test double
43
- # library (such as bogus or mocha) by changing the `mock_with` option here.
44
- config.mock_with :rspec do |mocks|
45
- # Prevents you from mocking or stubbing a method that does not exist on
46
- # a real object. This is generally recommended, and will default to
47
- # `true` in RSpec 4.
48
- mocks.verify_partial_doubles = true
49
- end
50
- end