slacks 0.0.1 → 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
  SHA1:
3
- metadata.gz: 789c9ac13d517eb62b249b38f9bdd781295e14e4
4
- data.tar.gz: d05efc4b0f64cdc399324b52257f3fd88884f19d
3
+ metadata.gz: 40d731ac92fa1fc207c6723ab3986302416c481f
4
+ data.tar.gz: 3e03fdfdd979b06b9103f4773f59225a0d8dde7b
5
5
  SHA512:
6
- metadata.gz: df416c6fdb36216f70a5d76537aef833ea11e1996f186aa9caaad4d0bf55e30ef7629a0e528fab52845e8b933e6ea500f2635dbc0ec6176f6fb8f710f5af409d
7
- data.tar.gz: 02e5185cc2714d40259aedd3b4211d4b764ac5c6ca4d2bc7892f5cb20e3989fbe8c79b5d729ab01e5ceb88b390850083405ec5f49b7d7b4f2cf9944fb9d67f9d
6
+ metadata.gz: f0360f432a06a1cfe599e8e246e87ce26e29f301574a3dc376f498c06a4c126cb6f6a4a1127af7001e37595a9756033665fc9df6433e3172156c07b84f6b0ab2
7
+ data.tar.gz: d5f46535abe6b9ce02298b41585fe8fe729bf355f910aa251d430d5b22449f4688e2ddf287dd1380ffa626b7d437a72745eb91efb39758d0819e1b0c2c66ab47
data/README.md CHANGED
@@ -1,15 +1,13 @@
1
1
  # Slacks
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/slacks`. 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
+ A library for communicating via Slack
6
4
 
7
5
  ## Installation
8
6
 
9
7
  Add this line to your application's Gemfile:
10
8
 
11
9
  ```ruby
12
- gem 'slacks'
10
+ gem "slacks"
13
11
  ```
14
12
 
15
13
  And then execute:
@@ -20,9 +18,19 @@ Or install it yourself as:
20
18
 
21
19
  $ gem install slacks
22
20
 
21
+
22
+
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ ```ruby
26
+ require "slacks"
27
+ slack = Slacks::Connection.new("xoxb-0123456789-abcdefghijklmnopqrstuvwx")
28
+ slack.listen! do |message|
29
+ p message
30
+ end
31
+ ```
32
+
33
+
26
34
 
27
35
  ## Development
28
36
 
@@ -30,12 +38,14 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
30
38
 
31
39
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
40
 
41
+
42
+
33
43
  ## Contributing
34
44
 
35
45
  Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/slacks.
36
46
 
37
47
 
48
+
38
49
  ## License
39
50
 
40
51
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
41
-
@@ -2,8 +2,8 @@ module Slacks
2
2
  class Channel
3
3
  attr_reader :id, :name, :type
4
4
 
5
- def initialize(session, attributes={})
6
- @session = session
5
+ def initialize(slack, attributes={})
6
+ @slack = slack
7
7
  @id = attributes["id"]
8
8
  @name = attributes["name"]
9
9
  @type = :channel
@@ -18,11 +18,11 @@ module Slacks
18
18
  first_message = messages.shift
19
19
  message_options = {}
20
20
  message_options = messages.shift if messages.length == 1 && messages[0].is_a?(Hash)
21
- session.slack.send_message(first_message, message_options.merge(channel: id))
21
+ slack.send_message(first_message, message_options.merge(channel: id))
22
22
 
23
23
  messages.each do |message|
24
- sleep message.length / session.typing_speed
25
- session.slack.send_message(message, channel: id)
24
+ sleep message.length / slack.typing_speed
25
+ slack.send_message(message, channel: id)
26
26
  end
27
27
  end
28
28
  alias :say :reply
@@ -74,6 +74,6 @@ module Slacks
74
74
  end
75
75
 
76
76
  private
77
- attr_reader :session
77
+ attr_reader :slack
78
78
  end
79
79
  end
@@ -1,26 +1,27 @@
1
1
  require "slacks/bot_user"
2
- require "slacks/team"
3
2
  require "slacks/channel"
4
- require "slacks/guest_channel"
5
- require "slacks/conversation"
6
3
  require "slacks/driver"
4
+ require "slacks/errors"
5
+ require "slacks/guest_channel"
7
6
  require "slacks/rtm_event"
8
- require "slacks/listener"
9
- require "slacks/message"
7
+ require "slacks/team"
10
8
  require "slacks/user"
11
- require "slacks/errors"
12
9
  require "faraday"
13
10
  require "faraday/raise_errors"
14
11
 
15
12
  module Slacks
16
13
  class Connection
17
14
  attr_reader :team, :bot, :token
15
+ attr_accessor :typing_speed
18
16
 
19
17
  EVENT_MESSAGE = "message".freeze
20
18
  EVENT_GROUP_JOINED = "group_joined".freeze
21
19
  EVENT_USER_JOINED = "team_join".freeze
22
20
 
23
- def initialize(session, token)
21
+ def initialize(token, options={})
22
+ @token = token
23
+ @typing_speed = options.fetch(:typing_speed, 100.0)
24
+
24
25
  @user_ids_dm_ids = {}
25
26
  @users_by_id = {}
26
27
  @user_id_by_name = {}
@@ -28,9 +29,6 @@ module Slacks
28
29
  @group_id_by_name = {}
29
30
  @channels_by_id = {}
30
31
  @channel_id_by_name = {}
31
-
32
- @session = session
33
- @token = token
34
32
  end
35
33
 
36
34
 
@@ -48,6 +46,7 @@ module Slacks
48
46
  :unfurl_links, :unfurl_media, :icon_url, :icon_emoji].member?(key) })
49
47
  api("chat.postMessage", params)
50
48
  end
49
+ alias :say :send_message
51
50
 
52
51
  def add_reaction(emojis, message)
53
52
  Array(emojis).each do |emoji|
@@ -60,7 +59,7 @@ module Slacks
60
59
 
61
60
 
62
61
 
63
- def listen!
62
+ def listen!(callbacks)
64
63
  response = api("rtm.start")
65
64
 
66
65
  unless response["ok"]
@@ -70,6 +69,8 @@ module Slacks
70
69
 
71
70
  store_context!(response)
72
71
 
72
+ callbacks.connected
73
+
73
74
  client = Slacks::Driver.new
74
75
  client.connect_to websocket_url
75
76
 
@@ -94,7 +95,7 @@ module Slacks
94
95
  next if data["user"] == bot.id
95
96
  # ...or to messages with no text
96
97
  next if data["text"].nil? || data["text"].empty?
97
- yield data
98
+ callbacks.message(data)
98
99
  end
99
100
  end
100
101
 
@@ -102,7 +103,7 @@ module Slacks
102
103
 
103
104
  rescue EOFError
104
105
  # Slack hung up on us, we'll ask for a new WebSocket URL and reconnect.
105
- session.error "Websocket Driver received EOF; reconnecting"
106
+ callbacks.error "Websocket Driver received EOF; reconnecting"
106
107
  retry
107
108
  end
108
109
 
@@ -119,23 +120,23 @@ module Slacks
119
120
  when /^U/ then find_user(id)
120
121
  when /^D/
121
122
  user = find_user(get_user_id_for_dm(id))
122
- Slacks::Channel.new session, {
123
+ Slacks::Channel.new self, {
123
124
  "id" => id,
124
125
  "is_im" => true,
125
126
  "name" => user.username }
126
127
  when /^G/
127
- Slacks::Channel.new session, groups_by_id.fetch(id) do
128
+ Slacks::Channel.new self, groups_by_id.fetch(id) do
128
129
  raise ArgumentError, "Unable to find a group with the ID #{id.inspect}"
129
130
  end
130
131
  else
131
- Slacks::Channel.new session, channels_by_id.fetch(id) do
132
+ Slacks::Channel.new self, channels_by_id.fetch(id) do
132
133
  raise ArgumentError, "Unable to find a channel with the ID #{id.inspect}"
133
134
  end
134
135
  end
135
136
  end
136
137
 
137
138
  def find_user(id)
138
- Slacks::User.new session, users_by_id.fetch(id) do
139
+ Slacks::User.new self, users_by_id.fetch(id) do
139
140
  raise ArgumentError, "Unable to find a user with the ID #{id.inspect}"
140
141
  end
141
142
  end
@@ -157,8 +158,7 @@ module Slacks
157
158
 
158
159
 
159
160
  private
160
- attr_reader :session,
161
- :user_ids_dm_ids,
161
+ attr_reader :user_ids_dm_ids,
162
162
  :users_by_id,
163
163
  :user_id_by_name,
164
164
  :groups_by_id,
@@ -12,8 +12,8 @@ module Slacks
12
12
  @listeners = ThreadSafe::Array.new
13
13
  end
14
14
 
15
- def listen_for(matcher, flags=[], &block)
16
- session.listen_for(matcher, flags, &block).tap do |listener|
15
+ def listen_for(*args, &block)
16
+ session.listen_for(*args, &block).tap do |listener|
17
17
  listener.conversation = self
18
18
  listeners.push listener
19
19
  end
@@ -29,7 +29,7 @@ module Slacks
29
29
  alias :say :reply
30
30
 
31
31
  def ask(question, expect: nil)
32
- listen_for(expect) do |e|
32
+ listen_for(*Array(expect)) do |e|
33
33
  e.stop_listening!
34
34
  yield e
35
35
  end
data/lib/slacks/errors.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require "slacks/core_ext/exception"
2
+
1
3
  module Slacks
2
4
  class MigrationInProgress < RuntimeError
3
5
  def initialize
@@ -1,44 +1,17 @@
1
+ require "attentive/listener"
2
+
1
3
  module Slacks
2
- class Listener
3
- attr_reader :matcher, :flags
4
+ class Listener < Attentive::Listener
4
5
  attr_accessor :conversation
5
6
 
6
- def initialize(listeners, matcher, direct, flags, callback)
7
- # flags.each do |flag|
8
- # unless Slacks::Message.can_apply?(flag)
9
- # raise ArgumentError, "#{flag.inspect} is not a recognized flag"
10
- # end
11
- # end
12
-
13
- @listeners = listeners
14
- @matcher = matcher.freeze
15
- @flags = flags.sort.freeze
16
- @direct = direct
17
- @callback = callback
18
- end
19
-
20
- def match(message)
21
- matcher.match message.to_s(flags)
22
- end
23
-
24
- def direct?
25
- @direct
26
- end
27
-
28
- def indirect?
29
- !direct?
30
- end
31
-
32
- def stop_listening!
33
- listeners.delete self
34
- self
35
- end
7
+ def matches_context?(message)
8
+ contexts = message.contexts.dup
9
+ contexts << :conversation if conversation && conversation.includes?(message)
36
10
 
37
- def call(e)
38
- @callback.call(e)
11
+ return false unless contexts.superset? @required_contexts
12
+ return false unless contexts.disjoint? @prohibited_contexts
13
+ true
39
14
  end
40
15
 
41
- private
42
- attr_reader :listeners
43
16
  end
44
17
  end
@@ -1,31 +1,22 @@
1
- require "thread_safe"
1
+ require "attentive/listener_collection"
2
+ require "slacks/listener"
2
3
 
3
4
  module Slacks
4
- class ListenerCollection
5
+ class ListenerCollection < Attentive::ListenerCollection
5
6
 
6
- def initialize
7
- @listeners = ThreadSafe::Array.new
7
+ def overhear(*args, &block)
8
+ options = args.last.is_a?(::Hash) ? args.pop : {}
9
+ options[:context] = { in: :any }
10
+ listen_for(*args, options, &block)
8
11
  end
9
12
 
10
- def listen_for(matcher, flags=[], &block)
11
- Listener.new(self, matcher, true, flags, block).tap do |listener|
12
- @listeners.push listener
13
- end
14
- end
13
+ def listen_for(*args, &block)
14
+ options = args.last.is_a?(::Hash) ? args.pop : {}
15
15
 
16
- def overhear(matcher, flags=[], &block)
17
- Listener.new(self, matcher, false, flags, block).tap do |listener|
18
- @listeners.push listener
16
+ Slacks::Listener.new(self, args, options, block).tap do |listener|
17
+ push listener
19
18
  end
20
19
  end
21
20
 
22
- def each(&block)
23
- @listeners.each(&block)
24
- end
25
-
26
- def delete(listener)
27
- @listeners.delete listener
28
- end
29
-
30
21
  end
31
22
  end
@@ -1,12 +1,13 @@
1
+ require "attentive/message"
2
+
1
3
  module Slacks
2
- class Message
4
+ class Message < ::Attentive::Message
3
5
 
4
- def initialize(session, data)
6
+ def initialize(session, data, params={})
5
7
  @session = session
6
8
  @data = data
7
- @processed_text = Hash.new do |hash, flags|
8
- hash[flags] = flags.inject(text) { |text, flag| session.apply(flag, text) }.strip
9
- end
9
+ super data["text"], params
10
+ contexts << :conversation if channel.direct_message?
10
11
  end
11
12
 
12
13
 
@@ -28,19 +29,6 @@ module Slacks
28
29
  data.fetch("subtype", "message")
29
30
  end
30
31
 
31
- def text
32
- return @text if defined?(@text)
33
- @text = self.class.normalize(data["text"])
34
- end
35
- alias :to_str :text
36
-
37
- def to_s(flags=[])
38
- processed_text[flags]
39
- end
40
-
41
- def inspect
42
- "#{text.inspect} (from: #{sender}, channel: #{channel})"
43
- end
44
32
 
45
33
  def add_reaction(emoji)
46
34
  session.slack.add_reaction(emoji, self)
@@ -57,15 +45,7 @@ module Slacks
57
45
  super
58
46
  end
59
47
 
60
-
61
- def self.normalize(text)
62
- text
63
- .gsub(/[“”]/, "\"")
64
- .gsub(/[‘’]/, "'")
65
- .strip
66
- end
67
-
68
48
  private
69
- attr_reader :session, :data, :processed_text
49
+ attr_reader :session, :data
70
50
  end
71
51
  end
@@ -2,17 +2,17 @@ require "slacks/event"
2
2
 
3
3
  module Slacks
4
4
  class RtmEvent < Event
5
- attr_reader :match, :message_object
5
+ attr_reader :match
6
6
 
7
- def initialize(session: nil, message: nil, match_data: nil, listener: nil)
8
- super(session: session, message: message.text, channel: message.channel, sender: message.sender)
9
- @message_object = message
10
- @match = match_data
11
- @listener = listener
7
+ def initialize(session, match)
8
+ @match = match
9
+ @listener = match.listener
10
+ message = match.message
11
+ super(session: session, message: message, channel: message.channel, sender: message.sender)
12
12
  end
13
13
 
14
14
  def matched?(key)
15
- match[key].present?
15
+ match.matched?(key)
16
16
  end
17
17
 
18
18
  def stop_listening!
@@ -20,7 +20,7 @@ module Slacks
20
20
  end
21
21
 
22
22
  def react(emoji)
23
- message_object.add_reaction(emoji)
23
+ message.add_reaction(emoji)
24
24
  end
25
25
 
26
26
  private
@@ -1,14 +1,16 @@
1
1
  require "slacks/connection"
2
2
  require "slacks/listener_collection"
3
+ require "slacks/message"
4
+ require "attentive"
3
5
 
4
6
  module Slacks
5
7
  class Session
6
- attr_reader :listeners, :typing_speed, :token, :slack
8
+ include Attentive
9
+
10
+ attr_reader :slack
7
11
 
8
12
  def initialize(token, &block)
9
- @typing_speed = 100.0
10
- @token = token
11
- @listeners = Slacks::ListenerCollection.new
13
+ @slack = Slacks::Connection.new(token)
12
14
 
13
15
  if block_given?
14
16
  listeners.instance_eval(&block)
@@ -16,44 +18,30 @@ module Slacks
16
18
  end
17
19
  end
18
20
 
19
- def listen_for(matcher, flags=[], &block)
20
- listeners.listen_for(matcher, flags, &block)
21
- end
22
-
23
- def overhear(matcher, flags=[], &block)
24
- listeners.overhear(matcher, flags, &block)
21
+ def listeners
22
+ @listeners ||= Slacks::ListenerCollection.new
25
23
  end
26
24
 
27
- def start!
28
- @slack = Slacks::Connection.new(self, token)
29
25
 
30
- slack.listen! do |message|
31
- process_message(message)
32
- end
33
- end
34
26
 
35
- def error(message)
36
- # TODO
37
- puts "\e[33m[slack:error] #{message}\e[0m"
27
+ def start!
28
+ slack.listen!(self)
38
29
  end
39
30
 
40
- def apply(flag, text)
41
- send :"_apply_#{flag}", text
31
+ def connected
32
+ Attentive.invocations = [slack.bot.name, slack.bot.to_s]
42
33
  end
43
34
 
44
- def can_apply?(flag)
45
- respond_to? :"_apply_#{flag}", true
35
+ def error(error_message)
46
36
  end
47
37
 
48
- protected
49
-
50
- def process_message(data)
38
+ def message(data)
51
39
 
52
40
  # Don't respond to things that another bot said
53
41
  return if data.fetch("subtype", "message") == "bot_message"
54
42
 
55
43
  # Normalize mentions of users
56
- data["text"].gsub!(/<@U[^|]+\|([^>]*)>/, "@\\1")
44
+ data["text"].gsub!(/<@U[^|]+\|([^>]*)>/, %q{@\1})
57
45
 
58
46
  # Normalize mentions of channels
59
47
  data["text"].gsub!(/<[@#]?([UC][^>]+)>/) do |match|
@@ -65,82 +53,20 @@ module Slacks
65
53
  end
66
54
 
67
55
  message = Slacks::Message.new(self, data)
56
+ hear(message).each do |match|
68
57
 
69
- # Is someone talking directly to the bot?
70
- direct_mention = message.channel.direct_message? || message[slack.bot.name]
71
-
72
- listeners.each do |listener|
73
- # Listeners come in two flavors: direct and indirect
74
- #
75
- # To trigger a direct listener, the but must be directly
76
- # spoken to: as when the bot is mentioned or it is in
77
- # a conversation with someone.
78
- #
79
- # An indirect listener is triggered in any context
80
- # when it matches.
81
- #
82
- # We can ignore any listener that definitely doesn't
83
- # meet these criteria.
84
- next unless listener.indirect? or direct_mention or listener.conversation
85
-
86
- message = Slacks::Message.new(self, data)
87
-
88
- # Does the message match one of our listeners?
89
- match_data = listener.match message
90
- next unless match_data
91
-
92
- # TODO: Want event.message to be the processed text
93
- event = Slacks::RtmEvent.new(
94
- session: self,
95
- message: message,
96
- match_data: match_data,
97
- listener: listener)
98
-
99
- # Skip listeners if they are not part of this conversation
100
- next unless listener.indirect? or direct_mention or listener.conversation.includes?(event)
101
-
102
- invoke! listener, event
58
+ event = Slacks::RtmEvent.new(self, match)
59
+ invoke! match.listener, event
60
+
61
+ # Invoke only one listener per message
62
+ return
103
63
  end
104
- # rescue Exception
105
- # # TODO
106
- # # Houston.report_exception $!
107
- # puts "\e[31m[slack:exception] (#{$!.class}) #{$!.message}\n #{$!.backtrace.join("\n ")}\e[0m"
108
64
  end
109
65
 
110
- def invoke!(listener, event)
111
- # # TODO
112
- # puts "\e[35m[slack:hear:#{event.message_object.type}] #{event.message_object.inspect}\e[0m"
66
+ protected
113
67
 
68
+ def invoke!(listener, event)
114
69
  listener.call(event)
115
- # Thread.new do
116
- # begin
117
- # @callback.call(e)
118
- # rescue Exception # rescues StandardError by default; but we want to rescue and report all errors
119
- # # TODO
120
- # # Houston.report_exception $!, parameters: {channel: e.channel, message: e.message, sender: e.sender}
121
- # puts "\e[31m[slack:exception] (#{$!.class}) #{$!.message}\n #{$!.backtrace.join("\n ")}\e[0m"
122
- # e.reply "An error occurred when I was trying to answer you"
123
- # ensure
124
- # ActiveRecord::Base.clear_active_connections! if defined?(ActiveRecord)
125
- # end
126
- # end
127
- end
128
-
129
- def _apply_downcase(text)
130
- text.downcase
131
- end
132
-
133
- def _apply_no_punctuation(text)
134
- # Need to leave @ and # in @mentions and #channels
135
- text.gsub(/[^\w\s@#]/, "")
136
- end
137
-
138
- def _apply_no_mentions(text)
139
- text.gsub(/(?:^|\W+)#{slack.bot}\b/, "")
140
- end
141
-
142
- def _apply_no_emoji(text)
143
- text.gsub(/(?::[^:]+:)/, "")
144
70
  end
145
71
 
146
72
  end
data/lib/slacks/user.rb CHANGED
@@ -2,8 +2,8 @@ module Slacks
2
2
  class User
3
3
  attr_reader :id, :username, :email, :first_name, :last_name
4
4
 
5
- def initialize(session, attributes={})
6
- @session = session
5
+ def initialize(slack, attributes={})
6
+ @slack = slack
7
7
 
8
8
  profile = attributes["profile"]
9
9
  @id = attributes["id"]
@@ -25,5 +25,7 @@ module Slacks
25
25
  "@#{username}"
26
26
  end
27
27
 
28
+ private
29
+ attr_reader :slack
28
30
  end
29
31
  end
@@ -1,3 +1,3 @@
1
1
  module Slacks
2
- VERSION = "0.0.1"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/slacks.rb CHANGED
@@ -1,3 +1,2 @@
1
1
  require "slacks/version"
2
- require "slacks/core_ext/exception"
3
2
  require "slacks/session"
data/slacks.gemspec CHANGED
@@ -24,9 +24,12 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency "faraday"
25
25
  spec.add_dependency "faraday-raise-errors"
26
26
  spec.add_dependency "thread_safe"
27
+ spec.add_dependency "attentive"
27
28
 
28
29
  spec.add_development_dependency "bundler", "~> 1.10"
29
30
  spec.add_development_dependency "rake", "~> 10.0"
30
31
  spec.add_development_dependency "minitest", "~> 5.0"
31
32
  spec.add_development_dependency "pry"
33
+ spec.add_development_dependency "minitest-reporters"
34
+ spec.add_development_dependency "minitest-reporters-turn_reporter"
32
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slacks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Lail
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-04-19 00:00:00.000000000 Z
11
+ date: 2016-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: websocket-driver
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: attentive
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: bundler
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +150,34 @@ dependencies:
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: minitest-reporters
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: minitest-reporters-turn_reporter
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
139
181
  description:
140
182
  email:
141
183
  - bob.lailfamily@gmail.com