standup_md 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +24 -0
  3. data/.gitignore +1 -0
  4. data/Gemfile +10 -0
  5. data/Gemfile.lock +23 -0
  6. data/LICENSE +21 -0
  7. data/README.md +252 -0
  8. data/Rakefile +36 -0
  9. data/_config.yml +1 -0
  10. data/bin/standup +5 -0
  11. data/doc/README_md.html +290 -0
  12. data/doc/StandupMD/Cli.html +898 -0
  13. data/doc/StandupMD.html +1453 -0
  14. data/doc/TestHelper.html +282 -0
  15. data/doc/TestStandupMD.html +1938 -0
  16. data/doc/created.rid +8 -0
  17. data/doc/css/fonts.css +167 -0
  18. data/doc/css/rdoc.css +611 -0
  19. data/doc/fonts/Lato-Light.ttf +0 -0
  20. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  21. data/doc/fonts/Lato-Regular.ttf +0 -0
  22. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  23. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  24. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  25. data/doc/images/add.png +0 -0
  26. data/doc/images/arrow_up.png +0 -0
  27. data/doc/images/brick.png +0 -0
  28. data/doc/images/brick_link.png +0 -0
  29. data/doc/images/bug.png +0 -0
  30. data/doc/images/bullet_black.png +0 -0
  31. data/doc/images/bullet_toggle_minus.png +0 -0
  32. data/doc/images/bullet_toggle_plus.png +0 -0
  33. data/doc/images/date.png +0 -0
  34. data/doc/images/delete.png +0 -0
  35. data/doc/images/find.png +0 -0
  36. data/doc/images/loadingAnimation.gif +0 -0
  37. data/doc/images/macFFBgHack.png +0 -0
  38. data/doc/images/package.png +0 -0
  39. data/doc/images/page_green.png +0 -0
  40. data/doc/images/page_white_text.png +0 -0
  41. data/doc/images/page_white_width.png +0 -0
  42. data/doc/images/plugin.png +0 -0
  43. data/doc/images/ruby.png +0 -0
  44. data/doc/images/tag_blue.png +0 -0
  45. data/doc/images/tag_green.png +0 -0
  46. data/doc/images/transparent.png +0 -0
  47. data/doc/images/wrench.png +0 -0
  48. data/doc/images/wrench_orange.png +0 -0
  49. data/doc/images/zoom.png +0 -0
  50. data/doc/index.html +286 -0
  51. data/doc/js/darkfish.js +84 -0
  52. data/doc/js/navigation.js +105 -0
  53. data/doc/js/navigation.js.gz +0 -0
  54. data/doc/js/search.js +110 -0
  55. data/doc/js/search_index.js +1 -0
  56. data/doc/js/search_index.js.gz +0 -0
  57. data/doc/js/searcher.js +229 -0
  58. data/doc/js/searcher.js.gz +0 -0
  59. data/doc/table_of_contents.html +551 -0
  60. data/lib/standup_md/cli.rb +301 -0
  61. data/lib/standup_md/version.rb +9 -0
  62. data/lib/standup_md.rb +530 -0
  63. data/standup_md.gemspec +36 -0
  64. metadata +108 -0
data/lib/standup_md.rb ADDED
@@ -0,0 +1,530 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require 'fileutils'
5
+ require_relative 'standup_md/version'
6
+
7
+ ##
8
+ # The class for handing reading/writing of entries.
9
+ #
10
+ # @example
11
+ # su = StandupMD.new
12
+ class StandupMD
13
+
14
+ ##
15
+ # Convenience method for calling +new+ + +load+
16
+ #
17
+ # @param [Hash] attributes Attributes to set before loading.
18
+ #
19
+ # @example
20
+ # su = StandupMD.load(bullet_character: '*')
21
+ def self.load(attributes = {})
22
+ self.new do |s|
23
+ attributes.each do |k, v|
24
+ next unless s.respond_to?(k)
25
+ s.send("#{k}=", v)
26
+ end
27
+ end.load
28
+ end
29
+
30
+ # :section: Attributes that aren't settable by user, but are gettable.
31
+
32
+ ##
33
+ # The string that will be used for the entry headers.
34
+ #
35
+ # @return [String]
36
+ attr_reader :header
37
+
38
+ ##
39
+ # The file name should equal file_name_format parsed by Date.strftime.
40
+ # The default is +Date.today.strftime('%Y_%m.md')+
41
+ #
42
+ # @return [String]
43
+ #
44
+ # @example
45
+ # su = StandupMD.new { |s| s.file_name_format = '%y_%m.markdown' }
46
+ # su.file
47
+ # # => Users/johnsmith/.cache/standup_md/20_04.markdown
48
+ attr_reader :file
49
+
50
+ ##
51
+ # The file that contains previous entries. When last month's file exists, but
52
+ # this month's doesn't or is empty, previous_file should equal last month's
53
+ # file.
54
+ #
55
+ # @return [String]
56
+ #
57
+ # @example
58
+ # # Assuming the current month is April, 2020
59
+ #
60
+ # Dir.entries(su.directory)
61
+ # # => []
62
+ # su = StandupMD.new
63
+ # su.previous_file
64
+ # # => ''
65
+ #
66
+ # Dir.entries(su.directory)
67
+ # # => ['2020_03.md']
68
+ # su = StandupMD.new
69
+ # su.previous_file
70
+ # # => '2020_03.md'
71
+ #
72
+ # Dir.entries(su.directory)
73
+ # # => ['2020_03.md', '2020_04.md']
74
+ # su = StandupMD.new
75
+ # su.previous_file
76
+ # # => '2020_04.md'
77
+ attr_reader :previous_file
78
+
79
+ ##
80
+ # The entry for today's date as a hash. If +file+ already has an entry for
81
+ # today, it will be read and used as +current_entry+. If there is no entry
82
+ # for today, one should be generated from scaffolding.
83
+ #
84
+ # @return [Hash]
85
+ #
86
+ # @example
87
+ # StandupMD.new.current_entry
88
+ # # => {
89
+ # # '2020-04-02' => {
90
+ # # 'Previous' => ['Task from yesterday'],
91
+ # # 'Current' => ["<!-- ADD TODAY'S WORK HERE -->"],
92
+ # # 'Impediments' => ['None'],
93
+ # # 'Notes' => [],
94
+ # # }
95
+ # # }
96
+ attr_reader :current_entry
97
+
98
+ ##
99
+ # All previous entry for the same month as today. If it's the first day of
100
+ # the month, +all_previous_entries+ will be all of last month's entries. They
101
+ # will be a hash in the same format as +current_entry+.
102
+ #
103
+ # @return [Hash]
104
+ attr_reader :all_previous_entries
105
+
106
+ ##
107
+ # Current entry plus all previous entries. This will be a hash in the same
108
+ # format at +current_entry+ and +all_previous_entries+.
109
+ #
110
+ # @return [Hash]
111
+ attr_reader :all_entries
112
+
113
+ # :section: Attributes that are settable by the user, but have custom setters.
114
+
115
+ ##
116
+ # The directory where the markdown files are kept.
117
+ #
118
+ # @return [String]
119
+ #
120
+ # @default
121
+ # File.join(ENV['HOME'], '.cache', 'standup_md')
122
+ attr_reader :directory
123
+
124
+ ##
125
+ # Array of tasks for today. This is the work expected to be performed today.
126
+ # Default is an empty array, but when writing to file, the default is
127
+ #
128
+ # @return [Array]
129
+ #
130
+ # @default
131
+ # ["<!-- ADD TODAY'S WORK HERE -->"]
132
+ attr_reader :current_entry_tasks
133
+
134
+ ##
135
+ # Array of impediments for today's entry.
136
+ #
137
+ # @return [Array]
138
+ attr_reader :impediments
139
+
140
+ ##
141
+ # Character used as bullets for list entries.
142
+ #
143
+ # @return [String] either - (dash) or * (asterisk)
144
+ attr_reader :bullet_character
145
+
146
+ ##
147
+ # Number of octothorps that should preface entry headers.
148
+ #
149
+ # @return [Integer] between 1 and 5
150
+ attr_reader :header_depth
151
+
152
+ ##
153
+ # Number of octothorps that should preface sub-headers.
154
+ #
155
+ # @return [Integer] between 2 and 6
156
+ attr_reader :sub_header_depth
157
+
158
+ ##
159
+ # The tasks from the previous task's "Current" section.
160
+ #
161
+ # @return [Array]
162
+ attr_reader :previous_entry_tasks
163
+
164
+ ##
165
+ # Array of notes to add to today's entry.
166
+ #
167
+ # @return [Array]
168
+ attr_reader :notes
169
+
170
+ # :section: Attributes with default getters and setters.
171
+
172
+ ##
173
+ # The format to use for file names. This should include a month (%m) and
174
+ # year (%y) so the file can rotate every month. This will prevent files
175
+ # from getting too large.
176
+ #
177
+ # @param [String] file_name_format Parsed by +strftime+
178
+ #
179
+ # @return [String]
180
+ attr_accessor :file_name_format
181
+
182
+ ##
183
+ # The date format to use for entry headers.
184
+ #
185
+ # @param [String] header_date_format Parsed by +strftime+
186
+ #
187
+ # @return [String]
188
+ attr_accessor :header_date_format
189
+
190
+ ##
191
+ # The header to use for the +Current+ section.
192
+ #
193
+ # @param [String] current_header
194
+ #
195
+ # @return [String]
196
+ attr_accessor :current_header
197
+
198
+ ##
199
+ # The header to use for the +Previous+ section.
200
+ #
201
+ # @param [String] previous_header
202
+ #
203
+ # @return [String]
204
+ attr_accessor :previous_header
205
+
206
+ ##
207
+ # The header to use for the +Impediments+ section.
208
+ #
209
+ # @param [String] impediments_header
210
+ #
211
+ # @return [String]
212
+ attr_accessor :impediments_header
213
+
214
+ ##
215
+ # The header to use for the +Notes+ section.
216
+ #
217
+ # @param [String] notes_header
218
+ #
219
+ # @return [String]
220
+ attr_accessor :notes_header
221
+
222
+ ##
223
+ # Constructor. Yields the instance so you can pass a block to access setters.
224
+ #
225
+ # @return [self]
226
+ #
227
+ # @example
228
+ # su = StandupMD.new do |s|
229
+ # s.directory = @workdir
230
+ # s.file_name_format = '%y_%m.markdown'
231
+ # s.bullet_character = '*'
232
+ # end
233
+ def initialize
234
+ @notes = []
235
+ @header_depth = 1
236
+ @sub_header_depth = 2
237
+ @bullet_character = '-'
238
+ @current_entry_tasks = ["<!-- ADD TODAY'S WORK HERE -->"]
239
+ @impediments = ['None']
240
+ @file_name_format = '%Y_%m.md'
241
+ @directory = File.join(ENV['HOME'], '.cache', 'standup_md')
242
+ @header_date_format = '%Y-%m-%d'
243
+ @current_header = 'Current'
244
+ @previous_header = 'Previous'
245
+ @impediments_header = 'Impediments'
246
+ @notes_header = 'Notes'
247
+ @sub_header_order = %w[previous current impediments notes]
248
+
249
+ yield self if block_given?
250
+ end
251
+
252
+ # :section: Booleans
253
+ # Helper methods for booleans.
254
+
255
+ ##
256
+ # Has the file been written since instantiated?
257
+ #
258
+ # @return [boolean]
259
+ #
260
+ # @example
261
+ # su = StandupMD.new
262
+ # su.file_written?
263
+ # # => false
264
+ # su.write
265
+ # su.file_written?
266
+ # # => true
267
+ def file_written?
268
+ @file_written
269
+ end
270
+
271
+ ##
272
+ # Was today's entry already in the file?
273
+ #
274
+ # @return [boolean] true if today's entry was already in the file
275
+ def entry_previously_added?
276
+ @entry_previously_added
277
+ end
278
+
279
+ # :section: Custom setters
280
+ # Setters that required validations.
281
+
282
+ ##
283
+ # Setter for current entry tasks.
284
+ #
285
+ # @param [Array] tasks
286
+ #
287
+ # @return [Array]
288
+ def previous_entry_tasks=(tasks)
289
+ raise 'Must be an Array' unless tasks.is_a?(Array)
290
+ @previous_entry_tasks = tasks
291
+ end
292
+
293
+ ##
294
+ # Setter for notes.
295
+ #
296
+ # @param [Array] notes
297
+ #
298
+ # @return [Array]
299
+ def notes=(tasks)
300
+ raise 'Must be an Array' unless tasks.is_a?(Array)
301
+ @notes = tasks
302
+ end
303
+
304
+ ##
305
+ # Setter for current entry tasks.
306
+ #
307
+ # @param [Array] tasks
308
+ #
309
+ # @return [Array]
310
+ def current_entry_tasks=(tasks)
311
+ raise 'Must be an Array' unless tasks.is_a?(Array)
312
+ @current_entry_tasks = tasks
313
+ end
314
+
315
+ ##
316
+ # Setter for impediments.
317
+ #
318
+ # @param [Array] tasks
319
+ #
320
+ # @return [Array]
321
+ def impediments=(tasks)
322
+ raise 'Must be an Array' unless tasks.is_a?(Array)
323
+ @impediments = tasks
324
+ end
325
+
326
+ ##
327
+ # Setter for bullet_character. Must be * (asterisk) or - (dash).
328
+ #
329
+ # @param [String] character
330
+ #
331
+ # @return [String]
332
+ def bullet_character=(character)
333
+ raise 'Must be "-" or "*"' unless %w[- *].include?(character)
334
+ @bullet_character = character
335
+ end
336
+
337
+ ##
338
+ # Setter for directory. Must be expanded in case the user uses `~` for home.
339
+ # If the directory doesn't exist, it will be created. To reset instance
340
+ # variables after changing the directory, you'll need to call load.
341
+ #
342
+ # @param [String] directory
343
+ #
344
+ # @return [String]
345
+ def directory=(directory)
346
+ # TODO test this
347
+ directory = File.expand_path(directory)
348
+ FileUtils.mkdir_p(directory) unless File.directory?(directory)
349
+ @directory = directory
350
+ end
351
+
352
+ ##
353
+ # Number of octothorps (#) to use before the main header.
354
+ #
355
+ # @param [Integer] depth
356
+ #
357
+ # @return [Integer]
358
+ def header_depth=(depth)
359
+ if !depth.between?(1, 5)
360
+ raise 'Header depth out of bounds (1..5)'
361
+ elsif depth >= sub_header_depth
362
+ raise 'header_depth must be larger than sub_header_depth'
363
+ end
364
+ @header_depth = depth
365
+ end
366
+
367
+ ##
368
+ # Number of octothorps (#) to use before sub headers (Current, Previous, etc).
369
+ #
370
+ # @param [Integer] depth
371
+ #
372
+ # @return [Integer]
373
+ def sub_header_depth=(depth)
374
+ if !depth.between?(2, 6)
375
+ raise 'Sub-header depth out of bounds (2..6)'
376
+ elsif depth <= header_depth
377
+ raise 'sub_header_depth must be smaller than header_depth'
378
+ end
379
+ @sub_header_depth = depth
380
+ end
381
+
382
+ ##
383
+ # Preferred order for sub-headers.
384
+ #
385
+ # @param [Array] Values must be %w[previous current impediment notes]
386
+ #
387
+ # @return [Array]
388
+ def sub_header_order=(array)
389
+ order = %w[previous current impediments notes]
390
+ raise "Values must be #{order.join{', '}}" unless order.sort == array.sort
391
+ @sub_header_order = array
392
+ end
393
+
394
+ # :section: Misc
395
+ # Misc.
396
+
397
+ ##
398
+ # Return a copy of the sub-header order so the user can't modify the array.
399
+ #
400
+ # @return [Array]
401
+ def sub_header_order
402
+ @sub_header_order.dup
403
+ end
404
+
405
+ ##
406
+ # Writes a new entry to the file if the first entry in the file isn't today.
407
+ #
408
+ # @return [Boolean]
409
+ def write
410
+ File.open(file, 'w') do |f|
411
+ all_entries.each do |head, s_heads|
412
+ f.puts '#' * header_depth + ' ' + head
413
+ sub_header_order.map { |value| "#{value}_header" }.each do |sub_head|
414
+ sh = send(sub_head).capitalize
415
+ next if !s_heads[sh] || s_heads[sh].empty?
416
+ f.puts '#' * sub_header_depth + ' ' + sh
417
+ s_heads[sh].each { |task| f.puts bullet_character + ' ' + task }
418
+ end
419
+ f.puts
420
+ end
421
+ end
422
+ @file_written = true
423
+ end
424
+
425
+ ##
426
+ # Sets internal instance variables. Called when first instantiated, or after
427
+ # directory is set.
428
+ #
429
+ # @return [self]
430
+ def load
431
+ FileUtils.mkdir_p(directory) unless File.directory?(directory)
432
+
433
+ @today = Date.today
434
+ @header = today.strftime(header_date_format)
435
+ @file_written = false
436
+ @file = File.expand_path(File.join(directory, today.strftime(file_name_format)))
437
+ @previous_file = get_previous_file
438
+ @all_previous_entries = get_all_previous_entries
439
+ @entry_previously_added = all_previous_entries.key?(header)
440
+ @previous_entry_tasks = previous_entry[current_header]
441
+ @current_entry = @all_previous_entries.delete(header) || new_entry
442
+ @all_entries = {header => current_entry}.merge(all_previous_entries)
443
+
444
+ FileUtils.touch(file) unless File.file?(file)
445
+ self
446
+ end
447
+
448
+ ##
449
+ # Alias of +load+
450
+ #
451
+ # @return [self]
452
+ alias_method :reload, :load
453
+
454
+ private
455
+
456
+ ##
457
+ # Scaffolding with which new entries will be created.
458
+ def new_entry # :nodoc:
459
+ {
460
+ previous_header => previous_entry_tasks || [],
461
+ current_header => current_entry_tasks,
462
+ impediments_header => impediments,
463
+ notes_header => notes,
464
+ }
465
+ end
466
+
467
+ ##
468
+ # Date object of today's date.
469
+ def today # :nodoc:
470
+ @today
471
+ end
472
+
473
+ ##
474
+ # The file that contains the previous entry. If previous entry was same month,
475
+ # previous_file will be the same as file. If previous entry was last month,
476
+ # and a file exists for last month, previous_file is last month's file.
477
+ # If neither is true, returns an empty string.
478
+ def get_previous_file # :nodoc:
479
+ return file if File.file?(file) && !File.zero?(file)
480
+ prev_month_file = File.expand_path(File.join(
481
+ directory,
482
+ today.prev_month.strftime(file_name_format)
483
+ ))
484
+ File.file?(prev_month_file) ? prev_month_file : ''
485
+ end
486
+
487
+ def get_all_previous_entries # :nodoc:
488
+ return {} unless File.file?(previous_file)
489
+ prev_entries = {}
490
+ entry_header = ''
491
+ section_type = ''
492
+ File.foreach(previous_file) do |line|
493
+ line.chomp!
494
+ next if line.strip.empty?
495
+ if line.match(%r{^#{'#' * header_depth}\s+})
496
+ entry_header = line.sub(%r{^\#{#{header_depth}}\s*}, '')
497
+ section_type = notes_header
498
+ prev_entries[entry_header] ||= {}
499
+ elsif line.match(%r{^#{'#' * sub_header_depth}\s+})
500
+ section_type = determine_section_type(
501
+ line.sub(%r{^\#{#{sub_header_depth}}\s*}, '')
502
+ )
503
+ prev_entries[entry_header][section_type] = []
504
+ else
505
+ prev_entries[entry_header][section_type] << line.sub(
506
+ %r{\s*#{bullet_character}\s*}, ''
507
+ )
508
+ end
509
+ end
510
+ prev_entries
511
+ rescue => e
512
+ raise "File malformation: #{e}"
513
+ end
514
+
515
+ def determine_section_type(line) # :nodoc:
516
+ [
517
+ current_header,
518
+ previous_header,
519
+ impediments_header,
520
+ notes_header
521
+ ].each { |header| return header if line.include?(header) }
522
+ raise "Unknown header type [#{line}]"
523
+ end
524
+
525
+ def previous_entry # :nodoc:
526
+ all_previous_entries.each do |key, value|
527
+ return value unless key == header
528
+ end
529
+ end
530
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'lib/standup_md/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'standup_md'
5
+ spec.version = StandupMD::VERSION
6
+ spec.authors = ['Evan Gray']
7
+ spec.email = 'evanthegrayt@vivaldi.net'
8
+ spec.license = 'MIT'
9
+ spec.date = Time.now.strftime('%Y-%m-%d')
10
+
11
+ spec.summary = %q{The cure for all your standup woes}
12
+ spec.description = %q{Generate and edit standups in markdown format}
13
+ spec.homepage = 'https://github.com/evanthegrayt/standup_md'
14
+
15
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
16
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
17
+ if spec.respond_to?(:metadata)
18
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
19
+
20
+ spec.metadata['homepage_uri'] = spec.homepage
21
+ spec.metadata['source_code_uri'] = spec.homepage
22
+ else
23
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
24
+ 'public gem pushes.'
25
+ end
26
+
27
+ # Specify which files should be added to the gem when it is released.
28
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
29
+ # spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
30
+ # `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
31
+ # end
32
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
33
+ spec.bindir = 'bin'
34
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
35
+ spec.require_paths = ['lib']
36
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: standup_md
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.10
5
+ platform: ruby
6
+ authors:
7
+ - Evan Gray
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-04-27 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Generate and edit standups in markdown format
14
+ email: evanthegrayt@vivaldi.net
15
+ executables:
16
+ - standup
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - ".github/workflows/ruby.yml"
21
+ - ".gitignore"
22
+ - Gemfile
23
+ - Gemfile.lock
24
+ - LICENSE
25
+ - README.md
26
+ - Rakefile
27
+ - _config.yml
28
+ - bin/standup
29
+ - doc/README_md.html
30
+ - doc/StandupMD.html
31
+ - doc/StandupMD/Cli.html
32
+ - doc/TestHelper.html
33
+ - doc/TestStandupMD.html
34
+ - doc/created.rid
35
+ - doc/css/fonts.css
36
+ - doc/css/rdoc.css
37
+ - doc/fonts/Lato-Light.ttf
38
+ - doc/fonts/Lato-LightItalic.ttf
39
+ - doc/fonts/Lato-Regular.ttf
40
+ - doc/fonts/Lato-RegularItalic.ttf
41
+ - doc/fonts/SourceCodePro-Bold.ttf
42
+ - doc/fonts/SourceCodePro-Regular.ttf
43
+ - doc/images/add.png
44
+ - doc/images/arrow_up.png
45
+ - doc/images/brick.png
46
+ - doc/images/brick_link.png
47
+ - doc/images/bug.png
48
+ - doc/images/bullet_black.png
49
+ - doc/images/bullet_toggle_minus.png
50
+ - doc/images/bullet_toggle_plus.png
51
+ - doc/images/date.png
52
+ - doc/images/delete.png
53
+ - doc/images/find.png
54
+ - doc/images/loadingAnimation.gif
55
+ - doc/images/macFFBgHack.png
56
+ - doc/images/package.png
57
+ - doc/images/page_green.png
58
+ - doc/images/page_white_text.png
59
+ - doc/images/page_white_width.png
60
+ - doc/images/plugin.png
61
+ - doc/images/ruby.png
62
+ - doc/images/tag_blue.png
63
+ - doc/images/tag_green.png
64
+ - doc/images/transparent.png
65
+ - doc/images/wrench.png
66
+ - doc/images/wrench_orange.png
67
+ - doc/images/zoom.png
68
+ - doc/index.html
69
+ - doc/js/darkfish.js
70
+ - doc/js/navigation.js
71
+ - doc/js/navigation.js.gz
72
+ - doc/js/search.js
73
+ - doc/js/search_index.js
74
+ - doc/js/search_index.js.gz
75
+ - doc/js/searcher.js
76
+ - doc/js/searcher.js.gz
77
+ - doc/table_of_contents.html
78
+ - lib/standup_md.rb
79
+ - lib/standup_md/cli.rb
80
+ - lib/standup_md/version.rb
81
+ - standup_md.gemspec
82
+ homepage: https://github.com/evanthegrayt/standup_md
83
+ licenses:
84
+ - MIT
85
+ metadata:
86
+ allowed_push_host: https://rubygems.org
87
+ homepage_uri: https://github.com/evanthegrayt/standup_md
88
+ source_code_uri: https://github.com/evanthegrayt/standup_md
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements: []
104
+ rubygems_version: 3.0.3
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: The cure for all your standup woes
108
+ test_files: []