slack_message 3.0.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '098b332b278741ef63ef105fc7e79cbc7ef131a03dca79b0ed40a1d86001cae1'
4
- data.tar.gz: 40a4028d38c154fdb1d1835e0f536adc2e57671223290e43a139be1d70a359c3
3
+ metadata.gz: 100c64a0e3204d4715ffde4c0a11e0b380c7966289b8b841ef2ab7cb73f657b2
4
+ data.tar.gz: 3213f9c1817a211f57685002025dc72929f41652ba7c9e69e62d5314508fc3dd
5
5
  SHA512:
6
- metadata.gz: f99700c2fcb33cc7ad9e671f250dc23efffd47e6f4e36d9fdc7740c9ed1a8d4b224b523b6870b13cb3b164a0ae720f93824fae803368083919d776ec2c221236
7
- data.tar.gz: 1fb9ccc9bf2f9b9fabca5e1cdcdbcde87100f1c056613f0af1450f344bc82adcc5f7366d2f6ab8fb54e34f241018464283c750f2a0d022a67112b9570fc1287e
6
+ metadata.gz: 238cdf0160b6c2101cbabdadef3818dd0bcd2163d9a3ababba854affa0fbaca2533489aa203b27a2309af8e85aa7e814786a9ce8eb29dd51d949cefc1d209921
7
+ data.tar.gz: b0ad7654cfcac475f32eb81ede6e730046ef3721190ae1f255ceaff58331fbf6d4ee570a290dc16e660ca32611cc8639998677c5980f2eaaedd72388293b22df
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  matrix:
13
13
  os: [ubuntu-latest, macos-latest]
14
- ruby-version: [3.0, 2.7, 2.6, 2.5]
14
+ ruby-version: ['3.1', '3.0', '2.7', '2.6', '2.5']
15
15
  runs-on: ${{ matrix.os }}
16
16
 
17
17
  steps:
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.0.2] - 2022-04-16
4
+ - Fix tests on ruby 3.0.
5
+ - More adjustments and additions to docs.
6
+ - Add warnings when overriding notification text and context block.
7
+
3
8
  ## [3.0.1] - 2021-12-22
4
9
  - Major overhaul of error handling and expansion on which errors trigger
5
10
  friendly messages for users.
data/README.md CHANGED
@@ -19,12 +19,11 @@ You'll find much more information about how to use SlackMessage by visiting
19
19
  [the docs](https://jmmastey.github.io/slack_message).
20
20
 
21
21
 
22
- ### Posting
22
+ ### A Rich DSL Focused on Maintainability
23
23
 
24
- SlackMessage is able to build all kinds of rich messages for you, and has been
25
- a real joy to use for the author at least. To understand a bit more about the
26
- possibilities of blocks, you should play around with Slack's [Block Kit
27
- Builder](https://app.slack.com/block-kit-builder/). There are lots of options:
24
+ SlackMessage is able to build all kinds of rich messages for you. It focuses on
25
+ writing code that looks similar to the output messages themselves, with as
26
+ little repetition and cruft as possible.
28
27
 
29
28
  ```ruby
30
29
  SlackMessage.post_to('#general') do
@@ -76,20 +75,26 @@ Accordingly, SlackMessage is developed with some strong opinions in mind:
76
75
  doesn't exist in the API), or leading spaces.
77
76
  * Configuration is kept simple, with helpers for frequently reused bots.
78
77
 
79
- Some behaviors that are still planned but not yet added:
78
+ Some changes that are still planned or desired, but not yet added:
80
79
 
81
80
  * any interactive elements at all: https://api.slack.com/interactivity/handling
82
81
  * multiple recipients: https://api.slack.com/methods/conversations.open
83
- * more mrkdwn syntax, like quotes or code blocks
84
- * more and better organized testing capability (scheduled messages, editing, deleting)
82
+ * more mrkdwn syntax, like quotes or code blocks https://api.slack.com/reference/surfaces/formatting#line-breaks
83
+ * more and better organized testing capability (for scheduled messages, editing, deleting)
85
84
  * posting ephemeral messages: https://api.slack.com/methods/chat.postEphemeral
85
+ * easier way to dump / load message responses
86
+ * updated docs w/ links to BlockBuilder
86
87
 
87
88
  ### Contributing
88
89
 
89
- Contributions are very welcome. Fork, fix, submit pull. Since simplicity of API is a strong priority, so opening an issue to discuss possible interface changes would be wise.
90
+ Contributions are very welcome. Fork, fix, submit pull. Since simplicity of API
91
+ is a strong priority, so opening an issue to discuss possible interface changes
92
+ would be wise.
90
93
 
91
- Contribution is expected to conform to the [Contributor Covenant](https://github.com/jmmastey/slack_message/blob/master/CODE_OF_CONDUCT.md).
94
+ Contribution is expected to conform to the [Contributor
95
+ Covenant](https://github.com/jmmastey/slack_message/blob/master/CODE_OF_CONDUCT.md).
92
96
 
93
97
  ### License
94
98
 
95
- This software is released under the [MIT License](https://github.com/jmmastey/slack_message/blob/master/MIT-LICENSE).
99
+ This software is released under the [MIT
100
+ License](https://github.com/jmmastey/slack_message/blob/master/MIT-LICENSE).
@@ -101,7 +101,7 @@ end
101
101
 
102
102
  ### Scheduling a Message
103
103
 
104
- To schedule a message, simply provide a `at` parameter to your post. Provide
104
+ To schedule a message, simply provide an `at` parameter to your post. Provide
105
105
  either a time object that responds to `to_i`, or an integer that represents a
106
106
  [unix timestamp](https://en.wikipedia.org/wiki/Unix_time) for the time at which
107
107
  you want your message posted.
@@ -121,8 +121,12 @@ nor can they be scheduled more than 120 days into the future.
121
121
 
122
122
  ### Best Practices
123
123
 
124
- Talk about having coherent methods that post a message, rather than a block
125
- that includes lots of indirection or ternaries.
124
+ From experience, building messages with maintainability in mind is key. Adding
125
+ lots of flow control and indirection will undermine your ability to understand
126
+ and change messages later.
127
+
128
+ For simple messages, using implicit sections is perfectly fine. However, if you
129
+ intend to create several sections, it's usually better to just declare them.
126
130
 
127
131
  See the [API documentation for
128
132
  chat.postMessage](https://api.slack.com/methods/chat.postMessage) or
@@ -1,10 +1,15 @@
1
- ### The Message DSL
1
+ ## The Message DSL
2
2
 
3
- A pretty good number of the elements available in BlockKit are usable in SlackMessage. There are also a few elements that haven't been implemented in the official API, but are too useful to be missing.
3
+ A pretty good number of the elements available in BlockKit are usable in
4
+ SlackMessage. There are also a few elements that haven't been implemented in
5
+ the official API, but are too useful to be missing.
4
6
 
5
- #### Basic Text
7
+ ### Basic Text
6
8
 
7
- While BlockKit officially requires that any elements are contained within a section element, that requirement is relaxed in SlackMessage. If you don't specify a section, one will silently be created to encapsulate your code. That's the secret behind the most basic messages in these docs.
9
+ While BlockKit officially requires that any elements are contained within a
10
+ section element, that requirement is relaxed in SlackMessage. If you don't
11
+ specify a section, one will silently be created to encapsulate your code.
12
+ That's the secret behind the most basic messages in these docs.
8
13
 
9
14
  ```ruby
10
15
  SlackMessage.build do
@@ -108,7 +113,51 @@ end
108
113
  Note that between the two newlines in the above example is a unicode emspace,
109
114
  which the API will respect as a line worth rendering.
110
115
 
111
- #### Buttons
116
+ ### Explicitly Declared Sections
117
+
118
+ Adding more sections is trivial. Simply declare each section and it will be
119
+ separated in the rendered message. This can often occur when looping.
120
+
121
+ ```ruby
122
+ SlackMessage.build do
123
+ pet_types.each do |type, breeds|
124
+ section do
125
+ text "*#{type}:* #{breeds.join(", ")}"
126
+ end
127
+ end
128
+ end
129
+ ```
130
+
131
+ It can also be useful to add a visual divider (similar to an `hr` in HTML)
132
+ between sections. To add one of these, use the `divider` helper. You can also
133
+ add a divider at the end of all the sections, but it often looks silly.
134
+
135
+ ```ruby
136
+ SlackMessage.build do
137
+ section do
138
+ text "*Topsiders:* Emily, Elsie, Derick"
139
+ end
140
+
141
+ divider
142
+
143
+ section do
144
+ text "*Undergrounders:* Kristina, Lauren, Different Emily"
145
+ end
146
+ end
147
+
148
+ # => [
149
+ # {:type=>"section", :text=>{:type=>"mrkdwn", :text=>"*Topsiders:* Emily, Elsie, Derick"}},
150
+ # {:type=>"divider"},
151
+ # {:type=>"section", :text=>{:type=>"mrkdwn", :text=>"*Undergrounders:* Kristina, Lauren, Different Emily"}}
152
+ # ]
153
+ ```
154
+
155
+ Note that a divider can only occur between sections, not within a single
156
+ section. Because of how implicit sections are built, it may look like this
157
+ works for simple messages. But, you may have troubles when you start adding
158
+ more complicated elements to your messages.
159
+
160
+ ### Buttons
112
161
 
113
162
  BlockKit allows you to specify a button to the right of a section / block. That
114
163
  button will be aligned outside the normal space for a section, and is meant to
@@ -132,10 +181,10 @@ end
132
181
  Slack allows three styles for buttons: `default`, `primary`, and `danger`.
133
182
  These correspond to gray, green and red buttons respectively. If not specified,
134
183
  SlackMessage will use the `primary` style for buttons. I get that this could be
135
- confusing when there is a default style, but in my experience, a colorful button
136
- is way more common.
184
+ confusing when there is a style specifically named default, but in my
185
+ experience, a colorful button is way more common.
137
186
 
138
- You can override the button style by specifying the style with your link button.
187
+ You can override button style by specifying the style with your link button.
139
188
 
140
189
  ```ruby
141
190
  SlackMessage.build do
@@ -152,7 +201,7 @@ end
152
201
  # :style=>:danger}}]
153
202
  ```
154
203
 
155
- #### Ordered and Unordered Lists
204
+ ### Ordered and Unordered Lists
156
205
 
157
206
  The Slack API doesn't have native support for HTML-style ordered and unordered
158
207
  lists, but there are convenience methods in SlackMessage to render a close
@@ -182,7 +231,7 @@ Because Slack automatically collapses leading whitespace, indention of lists is
182
231
  handled using unicode emspaces. Bullets for unordered lists are also unicode
183
232
  characters to avoid being read as markdown.
184
233
 
185
- #### List Items (e.g. HTML dt & dd)
234
+ ### List Items (e.g. HTML dt & dd)
186
235
 
187
236
  When trying to represent title / value lists, you can use the "list item" block
188
237
  type to pass a set of values. Slack does not allow you to customize how many
@@ -199,58 +248,67 @@ SlackMessage.build do
199
248
  end
200
249
  ```
201
250
 
202
- #### Including Multiple Sections
251
+ ### Images and Accessory Images
203
252
 
204
- Adding more sections is trivial. Simply declare each section and it will be
205
- separated in the rendered message. This can often occur when looping.
253
+ There are two main types of images in Slack: the
254
+ [image](https://imgur.com/XEUap1r) and the [accessory
255
+ image](https://imgur.com/zuhjBDq). In short, `accessory_image` is part of a
256
+ section itself and is shown alongside an existing block, while `image` is shown
257
+ as its own top-level element.
258
+
259
+ Accordingly, an accessory image should be used within a section. An accessory
260
+ image can accept alt-text, which is also a best practice, for usability
261
+ reasons.
206
262
 
207
263
  ```ruby
208
264
  SlackMessage.build do
209
- pet_types.each do |type, breeds|
210
- section do
211
- text "*#{type}:* #{breeds.join(", ")}"
212
- end
265
+ section do
266
+ text 'Looks like the coffee machine is empty.'
267
+ accessory_image 'https://your.com/empty_coffee_logo.jpg', alt_text: 'logo of a forlorn coffee cup'
213
268
  end
214
269
  end
215
270
  ```
216
271
 
217
- It can also be useful to add a visual divider (similar to a `hr` in HTML)
218
- between sections. To add one of these, use the `divider` helper. You can also
219
- add a divider at the end of all the sections, but it often looks silly.
272
+ Only one accessory image can be used per section, and declaring more will issue
273
+ a warning and simply override the previous accessory image.
274
+
275
+ By contrast, `image` can be used many times, and will create a new top-level
276
+ section for each call. Image accepts alt-text, but also a title, which will
277
+ be displayed above the image (along with an icon to collapse the image).
220
278
 
221
279
  ```ruby
222
280
  SlackMessage.build do
223
281
  section do
224
- text "*Topsiders:* Emily, Elsie, Derick"
282
+ text 'Most Recent Tiny Pig Images'
225
283
  end
226
284
 
227
- divider
228
-
229
- section do
230
- text "*Undergrounders:* Kristina, Lauren, Different Emily"
231
- end
285
+ image 'https://your.com/employee_pets/best/pig_1.jpg', alt_text: 'a tiny pig eating ice cream', title: 'Spider Pig'
286
+ image 'https://your.com/employee_pets/best/pig_2.jpg', alt_text: 'a tiny pig smiling mischeviously', title: 'Porkeypine'
287
+ image 'https://your.com/employee_pets/best/pig_3.jpg', alt_text: 'a tiny pig with wellies and an umbrella', title: 'Albert Sweinstein'
232
288
  end
233
-
234
- # => [
235
- # {:type=>"section", :text=>{:type=>"mrkdwn", :text=>"*Topsiders:* Emily, Elsie, Derick"}},
236
- # {:type=>"divider"},
237
- # {:type=>"section", :text=>{:type=>"mrkdwn", :text=>"*Undergrounders:* Kristina, Lauren, Different Emily"}}
238
- # ]
239
289
  ```
240
290
 
241
- Note that a divider can only occur between sections, not within a single
242
- section. Because of how implicit sections are built, it may look like this works
243
- for simple messages. You may have troubles when you start adding more
244
- complicated elements to your messages.
291
+ Sectionless messages can also use `accessory_image`, but this can get confusing
292
+ since they could potentially be interspersed with top-level images, so I
293
+ wouldn't recommend it.
294
+
295
+ ```ruby
296
+ # the difference between these two image styles is confusing, and the call
297
+ # to `image` closed the current section and started a new one.
298
+ SlackMessage.build do
299
+ text 'Looks like the coffee machine is empty.'
300
+ accessory_image 'https://your.com/empty_coffee_logo.jpg'
245
301
 
246
- #### Images
247
- TODO: image, accessory_image
302
+ text '*Most Recent Coffee Maker Surveillance Photo*'
303
+ image 'https://your.com/surveillance/coffee/current.jpg'
304
+ end
305
+ ```
248
306
 
249
- #### Footers (Context)
307
+ ### Footers (Context)
250
308
 
251
309
  Slack allows you to add a small additional piece of text to your message, which
252
- will be rendered in italics and small text. It can support both links and emoji,
253
- and is useful for providing minor details for your message.
310
+ will be rendered in italics and small text. It can support both links and
311
+ emoji, and is useful for providing minor details for your message.
254
312
 
255
313
  ```ruby
256
314
  SlackMessage.build do
@@ -268,15 +326,16 @@ end
268
326
  # }]
269
327
  ```
270
328
 
271
- Context does not belong to a section, and is per-message, not per-section.
272
- Specifying more than one context will simply overwrite previous calls.
329
+ Context does not belong to a section, and only one can be added to your entire
330
+ slack message. Specifying another `context` will issue a warning and overwrite
331
+ any previous call.
273
332
 
274
- #### Bot Customization
333
+ ### Bot Customization
275
334
 
276
335
  By default - and with scheduled messages - Slack will use the name and icon of
277
- the Slack app whose API key you configured. As seen before, it's
278
- possible to override those default names and icons in configuration. However, it
279
- can also be customized per-message.
336
+ the Slack app whose API key you configured. As seen before, it's possible to
337
+ override those default names and icons in configuration. However, it can also
338
+ be customized per-message.
280
339
 
281
340
  ```ruby
282
341
  SlackMessage.build do
@@ -290,13 +349,13 @@ end
290
349
  ```
291
350
 
292
351
  Notice that the bot details aren't shown in the output of the `build` command.
293
- To view the changes these methods cause, use `debug` mode.
352
+ To view the change to the message payload from these calls, use `debug` mode.
294
353
 
295
- The `bot_icon` can be specified as either an emoji (`:example:`), or a URL
354
+ The `bot_icon` can be specified as either an emoji (`:shipit:`), or a URL
296
355
  pointing to an image (`http://mysite.com/shipit.png`). Any other value seems to
297
356
  cause an error.
298
357
 
299
- #### Custom Notification Text
358
+ ### Custom Notification Text
300
359
 
301
360
  For users who have notifications turned on, Slack will provide a small message
302
361
  preview when you send them a message. By default, this preview will take the
@@ -319,7 +378,9 @@ end
319
378
  ```
320
379
 
321
380
  Again notice that notification text is not set within the blocks themselves, so
322
- you will need to enable debugging to see how it changes what is sent to the API.
381
+ you will need to enable debugging to see how it changes what is sent to the
382
+ API. Only one custom notification is allowed, so further calls will issue a
383
+ warning and replace the previous notification text.
323
384
 
324
385
  ---
325
386
 
@@ -1,4 +1,4 @@
1
- ### Updating a Previous Message
1
+ ## Updating a Previous Message
2
2
 
3
3
  After you've posted a message, you may want to edit it later. Interactive bots,
4
4
  for instance, may want to repeatedly update a message.
@@ -52,12 +52,11 @@ class SomeWorker < ApplicationWorker
52
52
  end
53
53
  ```
54
54
 
55
- #### Storing Response Objects for Later
55
+ ### Storing Response Objects for Later
56
56
 
57
- Since updates are likely to occur after you've long since finished posting the
58
- original message, you'll need to persist the message response somehow until you
59
- need to update it later. As one option, you could serialize the response object
60
- for later.
57
+ Since updates are likely to occur long after you post the original message, you
58
+ may want to persist a reference to the message until you need to update it
59
+ later. As one option, you could serialize the response object for later.
61
60
 
62
61
  ```ruby
63
62
  # initially
@@ -74,7 +73,7 @@ SlackMessage.update(message) do
74
73
  end
75
74
  ```
76
75
 
77
- #### Updating Scheduled Messages
76
+ ### Updating Scheduled Messages
78
77
 
79
78
  Sadly, there's currently no way to edit a scheduled message. You'll receive an
80
79
  error if you attempt to call `update` on a scheduled message.
@@ -1,26 +1,26 @@
1
- ### Deleting Messages
1
+ ## Deleting Messages
2
2
 
3
3
  Deleting a message is much like editing a message, only simpler. Just like when
4
4
  you edit a message, you'll need a reference to the message you posted.
5
5
 
6
- *Important Note: It's not possible to delete a message sent directly to a user.
7
- It's also not possible to delete a scheduled message once it's already posted.
8
- Don't send anything you don't want your boss to read.*
9
-
10
6
  ```ruby
11
7
  message = SlackMessage.post_to('#general') do
12
8
  text "Testing: #{SLACK_SECRET_KEY}"
13
9
  end
14
10
  ```
15
11
 
16
- Now you can simply call the `delete` method to make up for your mistakes.
12
+ Then you can simply call the `delete` method to make up for your mistakes.
17
13
 
18
14
  ```ruby
19
15
  SlackMessage.delete(message)
20
16
  ```
21
17
 
18
+ *Important Note: It's not possible to delete a message sent directly to a user.
19
+ It's also not possible to delete a scheduled message once it's already posted.
20
+ Don't send anything you don't want your boss to read.*
21
+
22
22
  As with editing a message, it's possible to persist messages to redis / your
23
- database and remove them using the timestamp and channel of your message.
23
+ database to be removed at a later date.
24
24
 
25
25
  ```ruby
26
26
  # initially
@@ -47,7 +47,7 @@ SlackMessage.post_to('hello@joemastey.com') do
47
47
  end
48
48
  ```
49
49
 
50
- #### Using @channel or @here
50
+ ### Using @channel or @here
51
51
 
52
52
  Not really a feature, but Slack will respect usage of `@here` and `@channel`.
53
53
 
data/docs/index.md CHANGED
@@ -47,3 +47,7 @@ end
47
47
 
48
48
  It has no dependencies and minimal configuration needs, so you can get up and
49
49
  running quickly.
50
+
51
+ ---
52
+
53
+ Next: [Get Started](https://jmmastey.github.io/slack_message/01_configuration)
@@ -63,6 +63,13 @@ class SlackMessage::Dsl
63
63
 
64
64
  text = self.enrich_text(text)
65
65
 
66
+
67
+ previous_context = @body.find { |element| element[:type] && element[:type] == "context" }
68
+ if previous_context
69
+ previous_text = previous_context[:elements].first[:text]
70
+ warn "WARNING: Overriding previous context in section: #{previous_text}"
71
+ end
72
+
66
73
  @body.push({ type: "context", elements: [{
67
74
  type: "mrkdwn", text: text
68
75
  }]})
@@ -94,6 +101,10 @@ class SlackMessage::Dsl
94
101
  end
95
102
 
96
103
  def notification_text(msg)
104
+ if @custom_notification
105
+ warn "WARNING: Overriding previous custom notification text: #{@custom_notification}"
106
+ end
107
+
97
108
  @custom_notification = msg
98
109
  end
99
110
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = 'slack_message'
3
- gem.version = "3.0.1"
3
+ gem.version = "3.0.2"
4
4
  gem.summary = "A nice DSL for composing rich messages in Slack"
5
5
  gem.authors = ["Joe Mastey"]
6
6
  gem.email = 'hello@joemastey.com'
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe SlackMessage do
4
+
4
5
  describe "DSL" do
5
6
  describe "#build" do
6
7
  it "renders some JSON" do
@@ -49,6 +50,13 @@ RSpec.describe SlackMessage do
49
50
  end
50
51
  end
51
52
 
53
+ fit do
54
+ SlackMessage.build do
55
+ notification_text 'one'
56
+ notification_text 'two'
57
+ end
58
+ end
59
+
52
60
  it "can assert expectations against posts" do
53
61
  expect {
54
62
  SlackMessage.post_to('#lieutenant') { text "foo" }
@@ -166,7 +174,7 @@ RSpec.describe SlackMessage do
166
174
  end
167
175
 
168
176
  it "raises nice error messages when API methods return errors" do
169
- SlackMessage::RSpec.respond_with('error' => 'nuffin')
177
+ SlackMessage::RSpec.respond_with({'error' => 'nuffin'})
170
178
 
171
179
  expect {
172
180
  SlackMessage.post_to('#general') { text 'nuh uh' }
@@ -188,7 +196,7 @@ RSpec.describe SlackMessage do
188
196
  it "raises errors w/ updates too" do
189
197
  message = SlackMessage.post_to('#general') { text 'nuh uh' }
190
198
 
191
- SlackMessage::RSpec.respond_with('error' => 'bad choice')
199
+ SlackMessage::RSpec.respond_with({'error' => 'bad choice'})
192
200
 
193
201
  expect {
194
202
  SlackMessage.update(message) { text 'nuh uh' }
@@ -198,7 +206,7 @@ RSpec.describe SlackMessage do
198
206
  it "even raises errors during deletes" do
199
207
  message = SlackMessage.post_to('#general') { text 'nuh uh' }
200
208
 
201
- SlackMessage::RSpec.respond_with('error' => 'bad choice')
209
+ SlackMessage::RSpec.respond_with({'error' => 'bad choice'})
202
210
 
203
211
  expect {
204
212
  SlackMessage.delete(message) { text 'nuh uh' }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack_message
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Mastey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-23 00:00:00.000000000 Z
11
+ date: 2022-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec