milestoner 18.4.0 → 18.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.adoc +137 -33
- data/lib/milestoner/builders/feed.rb +0 -1
- data/lib/milestoner/builders/web.rb +4 -3
- data/lib/milestoner/cli/actions/cache/create.rb +12 -6
- data/lib/milestoner/cli/actions/cache/list.rb +9 -1
- data/lib/milestoner/commits/tagger.rb +20 -3
- data/lib/milestoner/renderers/asciidoc.rb +12 -3
- data/lib/milestoner/renderers/markdown.rb +14 -1
- data/lib/milestoner/sanitizer.rb +16 -7
- data/lib/milestoner/syndication/builder.rb +1 -1
- data/lib/milestoner/templates/public/page.css.erb +363 -1
- data/milestoner.gemspec +2 -1
- data.tar.gz.sig +0 -0
- metadata +16 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 013c7206025524458c33b20bceec9005313ae98a1ae4c6f93030548886bf24c2
|
4
|
+
data.tar.gz: 95a22be79d0443573db5b347a1f519c99ea2eab1c0298f8098824a1171e0d104
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef5612eea45a857439702238c5fc40a5ecdc01d024a60815b07d69ba9eea1fe4eced7e88fc4f62574445dd92df4e6916ec3522d062153280c03c7bdee9fcc111
|
7
|
+
data.tar.gz: e6f69f7dea0b85b11af8ee52060692141e27cff663ace8313694ed48745f31671026a9ef5f0afcabc9bdb089e7d5edf5c236b219b28f366a18fc5f0fa1a879d6
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.adoc
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
:figure-caption!:
|
4
4
|
|
5
5
|
:ascii_doc_link: link:https://asciidoctor.org/docs/what-is-asciidoc[ASCII Doc]
|
6
|
+
:ascii_doctor_link: link:https://asciidoctor.org[Asciidoctor]
|
6
7
|
:cff_link: link:https://github.com/citation-file-format/ruby-cff[CFF]
|
7
8
|
:etcher_link: link:https://alchemists.io/projects/etcher[Etcher]
|
8
9
|
:firefox_link: link:https://www.mozilla.org/en-US/firefox[Firefox]
|
@@ -11,8 +12,8 @@
|
|
11
12
|
:git_commit_anatomy_link: link:https://alchemists.io/articles/git_commit_anatomy[Git Commit Anatomy]
|
12
13
|
:git_link: link:https://git-scm.com[Git]
|
13
14
|
:git_lint_link: link:https://alchemists.io/projects/git-lint[Git Lint]
|
14
|
-
:git_trailers_link: link:https://alchemists.io/articles/git_trailers[Git Trailers]
|
15
15
|
:git_notes_link: link:https://alchemists.io/articles/git_notes[Git Notes]
|
16
|
+
:git_trailers_link: link:https://alchemists.io/articles/git_trailers[Git Trailers]
|
16
17
|
:hanami_link: link:https://hanamirb.org[Hanami]
|
17
18
|
:hanami_views_link: link:https://alchemists.io/articles/hanami_views[Hanami Views]
|
18
19
|
:hanamismith_link: link:https://alchemists.io/projects/hanamismith[Hanamismith]
|
@@ -21,12 +22,15 @@
|
|
21
22
|
:markdown_link: link:https://daringfireball.net/projects/markdown[Markdown]
|
22
23
|
:marked_link: link:https://marked2app.com[Marked 2]
|
23
24
|
:net_news_wire_link: link:https://netnewswire.com[NetNewsWire]
|
25
|
+
:redcarpet_link: link:https://github.com/vmg/redcarpet[Redcarpet]
|
26
|
+
:rouge_link: link:https://rouge.jneen.net[Rouge]
|
24
27
|
:ruby_link: link:https://www.ruby-lang.org[Ruby]
|
25
28
|
:rubygems_link: link:https://rubygems.org[RubyGems]
|
26
29
|
:rubysmith_link: link:https://alchemists.io/projects/rubysmith[Rubysmith]
|
27
30
|
:runcom_link: link:https://alchemists.io/projects/runcom[Runcom]
|
31
|
+
:sanitize_link: link:https://github.com/rgrove/sanitize[Sanitize]
|
28
32
|
:strict_semantic_versioning_link: link:https://alchemists.io/articles/strict_semantic_versioning[Strict Semantic Versioning]
|
29
|
-
:string_formats_link: link:https://ruby-
|
33
|
+
:string_formats_link: link:https://docs.ruby-lang.org/en/master/format_specifications_rdoc.html[String Formats]
|
30
34
|
:syndication_link: link:https://alchemists.io/articles/syndication[Syndication]
|
31
35
|
:versionaire_link: link:https://alchemists.io/projects/versionaire[Versionaire]
|
32
36
|
:xdg_link: link:https://alchemists.io/projects/xdg[XDG]
|
@@ -50,7 +54,7 @@ toc::[]
|
|
50
54
|
|
51
55
|
The following are screenshots of using this gem to render release notes for the {lode_link} gem. Even though {lode_link} is used for example purposes, keep in mind that Milestoner can be used for _any project and/or programming language_.
|
52
56
|
|
53
|
-
=== ASCII Doc
|
57
|
+
=== ASCII Doc
|
54
58
|
|
55
59
|
image:https://alchemists.io/images/projects/milestoner/screenshots/build-ascii_doc-collapsed.png[Release Notes,width=1149,height=830,role=focal_point]
|
56
60
|
|
@@ -59,7 +63,7 @@ image:https://alchemists.io/images/projects/milestoner/screenshots/build-ascii_d
|
|
59
63
|
* *Command*: `milestoner build --format ascii_doc`
|
60
64
|
* *Renderer*: {ascii_doc_link}
|
61
65
|
|
62
|
-
=== Feed
|
66
|
+
=== Feed
|
63
67
|
|
64
68
|
image:https://alchemists.io/images/projects/milestoner/screenshots/build-feed-collapsed.png[Release Notes,width=1109,height=1143,role=focal_point]
|
65
69
|
|
@@ -75,14 +79,14 @@ image:https://alchemists.io/images/projects/milestoner/screenshots/build-markdow
|
|
75
79
|
* *Command*: `milestoner build --format markdown`
|
76
80
|
* *Renderer*: {marked_link}
|
77
81
|
|
78
|
-
=== Stream
|
82
|
+
=== Stream
|
79
83
|
|
80
84
|
image:https://alchemists.io/images/projects/milestoner/screenshots/build-stream.png[Release Notes,width=586,height=341,role=focal_point]
|
81
85
|
|
82
86
|
* *Command*: `milestoner build --format stream`
|
83
87
|
* *Renderer*: {iterm_link}
|
84
88
|
|
85
|
-
=== Web
|
89
|
+
=== Web
|
86
90
|
|
87
91
|
image:https://alchemists.io/images/projects/milestoner/screenshots/build-web-collapsed.png[Release Notes,width=1195,height=878,role=focal_point]
|
88
92
|
|
@@ -112,7 +116,7 @@ image:https://alchemists.io/images/projects/milestoner/screenshots/build-web-exp
|
|
112
116
|
** Stream (console)
|
113
117
|
** link:https://html.spec.whatwg.org/multipage[Web]
|
114
118
|
* Supports {git_notes_link}.
|
115
|
-
* Supports customization via your personal {xdg_link} and {hanami_views_link} configuration.
|
119
|
+
* Supports customization via your personal {xdg_link}, {runcom_link}, and/or {hanami_views_link} configuration.
|
116
120
|
|
117
121
|
== Requirements
|
118
122
|
|
@@ -297,34 +301,38 @@ User information should be sourced from whatever service you use for managing yo
|
|
297
301
|
[source,bash]
|
298
302
|
----
|
299
303
|
milestoner cache --list
|
300
|
-
# 🟢 Listing users...
|
301
|
-
# 🟢 No users found.
|
304
|
+
# 🟢 [milestoner] Listing users...
|
305
|
+
# 🟢 [milestoner] No users found.
|
302
306
|
|
303
307
|
milestoner cache --create "111,jsmith,Jane Smith"
|
304
|
-
# 🟢 Created: "Jane Smith"
|
308
|
+
# 🟢 [milestoner] Created: "Jane Smith"
|
305
309
|
|
306
310
|
milestoner cache --create "222,jdoe,John Doe"
|
307
|
-
# 🟢 Created: "John Doe"
|
311
|
+
# 🟢 [milestoner] Created: "John Doe"
|
308
312
|
|
309
313
|
milestoner cache --create "333,jgrey,Jill Grey"
|
310
|
-
# 🟢 Created: "Jill Grey"
|
314
|
+
# 🟢 [milestoner] Created: "Jill Grey"
|
311
315
|
|
312
316
|
milestoner cache --list
|
313
|
-
# 🟢 Listing users...
|
314
|
-
#
|
315
|
-
#
|
316
|
-
#
|
317
|
+
# 🟢 [milestoner] Listing users...
|
318
|
+
# External ID, Handle, Name
|
319
|
+
# -------------------------
|
320
|
+
# "111", "jsmith", "Jane Smith"
|
321
|
+
# "222", "jdoe", "John Doe"
|
322
|
+
# "333", "jgrey", "Jill Grey"
|
317
323
|
|
318
324
|
milestoner cache --delete "Jill Grey"
|
319
|
-
🟢 Deleted: "Jill Grey".
|
325
|
+
# 🟢 [milestoner] Deleted: "Jill Grey".
|
320
326
|
|
321
327
|
milestoner cache --list
|
322
|
-
# 🟢 Listing users...
|
323
|
-
#
|
324
|
-
#
|
328
|
+
# 🟢 [milestoner] Listing users...
|
329
|
+
# External ID, Handle, Name
|
330
|
+
# -------------------------
|
331
|
+
# "111", "jsmith", "Jane Smith"
|
332
|
+
# "222", "jdoe", "John Doe"
|
325
333
|
|
326
334
|
milestoner cache --info
|
327
|
-
# 🟢 Path: /Users/
|
335
|
+
# 🟢 [milestoner] Path: /Users/bkuhlmann/.cache/milestoner/database.store.
|
328
336
|
----
|
329
337
|
|
330
338
|
💡 Use `+https://api.github.com/users/<handle>+` to acquire the external ID for any GitHub user.
|
@@ -333,7 +341,7 @@ Once team member information is stored in your cache, you'll be able to build re
|
|
333
341
|
|
334
342
|
If you don't use the cache, your release notes use a question mark (?) and _unknown_ for team members as highlighted below:
|
335
343
|
|
336
|
-
image:https://alchemists.io/images/projects/milestoner/screenshots/no_cache.png[Usage,width=
|
344
|
+
image:https://alchemists.io/images/projects/milestoner/screenshots/no_cache.png[Usage,width=916,height=397,role=focal_point]
|
337
345
|
|
338
346
|
=== Build
|
339
347
|
|
@@ -344,8 +352,9 @@ The build command allows you to quickly build release notes to check the current
|
|
344
352
|
[source,bash]
|
345
353
|
----
|
346
354
|
milestoner build --format web
|
347
|
-
# 🟢 Building
|
348
|
-
# 🟢
|
355
|
+
# 🟢 [milestoner] Building Milestoner (web)...
|
356
|
+
# 🟢 [milestoner] Built: /Users/bkuhlmann/Engineering/OSS/milestoner/tmp/milestones/page.css.
|
357
|
+
# 🟢 [milestoner] Built: /Users/bkuhlmann/Engineering/OSS/milestoner/tmp/milestones/index.html.
|
349
358
|
----
|
350
359
|
|
351
360
|
The above command is so useful that I use the following `msw` (i.e. Milestoner Web) Bash alias to build current release notes or release notes for several tags:
|
@@ -357,22 +366,113 @@ The above command is so useful that I use the following `msw` (i.e. Milestoner W
|
|
357
366
|
# Parameters: $1 (optional): Maximum tags to build. Default: 1.
|
358
367
|
msw() {
|
359
368
|
local max=${1:-1}
|
369
|
+
local root="tmp/milestones"
|
370
|
+
local path="$root/index.html"
|
360
371
|
|
361
372
|
rm -rf tmp/milestones
|
362
373
|
|
363
374
|
if [[ "$max" == 1 ]]; then
|
364
|
-
milestoner build --max "$max" --format web
|
375
|
+
milestoner build --max "$max" --format web
|
376
|
+
|
377
|
+
if [[ -f "$path" ]]; then
|
378
|
+
open "$path"
|
379
|
+
fi
|
365
380
|
else
|
366
381
|
milestoner build --max "$max" --stylesheet "../page" --format web
|
367
|
-
|
368
|
-
|
369
|
-
|
382
|
+
|
383
|
+
if [[ -d "$root" ]]; then
|
384
|
+
ruby -run -e httpd "tmp/milestones" --port 3030 &
|
385
|
+
open "http://localhost:3030"
|
386
|
+
fg
|
387
|
+
fi
|
370
388
|
fi
|
371
389
|
}
|
372
390
|
----
|
373
391
|
|
374
392
|
Check out the help documentation (i.e. `milestoner build --help`) for addition usage that explains what command line options you can use to overwrite the current configuration.
|
375
393
|
|
394
|
+
==== Commits
|
395
|
+
|
396
|
+
By default, all {git_link} commit messages support {ascii_doc_link} syntax but you can use {markdown_link} if customized.
|
397
|
+
|
398
|
+
{ascii_doc_link} is rendered using the {ascii_doctor_link} gem while {markdown_link} is rendered using the {redcarpet_link} gem. Regardless of what renderer you choose, each supports syntax highlighting via the {rouge_link} gem. This also means you can customize the {rouge_style} stylesheet as documented in the xref:_templates[Templates] section below.
|
399
|
+
|
400
|
+
Here's a couple examples of commit messages using {ascii_doc_link} and {markdown_link} syntax:
|
401
|
+
|
402
|
+
*ASCII Doc*
|
403
|
+
|
404
|
+
image:https://alchemists.io/images/projects/milestoner/screenshots/syntax-ascii_doc.png[ASCII Doc,width=950,height=763,role=focal_point]
|
405
|
+
|
406
|
+
*Markdown*
|
407
|
+
|
408
|
+
image:https://alchemists.io/images/projects/milestoner/screenshots/syntax-markdown.png[Markdown,width=933,height=921,role=focal_point]
|
409
|
+
|
410
|
+
💡 To see an example of what this renders to HTML as, see the xref:_formats[Formats] section below.
|
411
|
+
|
412
|
+
==== Sanitization
|
413
|
+
|
414
|
+
Sanitization of commit messages is handled by the {sanitize_link} gem. This means you can only use a limited set of HTML elements (this includes {ascii_doc_link} and {markdown_link} rendering). Here's what's allowed:
|
415
|
+
|
416
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b[b]
|
417
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em[em]
|
418
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/i[i]
|
419
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong[strong]
|
420
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/u[u]
|
421
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a[a]
|
422
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/abbr[abbr]
|
423
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote[blockquote]
|
424
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br[br]
|
425
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite[cite]
|
426
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/code[code]
|
427
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dd[dd]
|
428
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dfn[dfn]
|
429
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl[dl]
|
430
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dt[dt]
|
431
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd[kbd]
|
432
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li[li]
|
433
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/mark[mark]
|
434
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol[ol]
|
435
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p[p]
|
436
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre[pre]
|
437
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q[q]
|
438
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/s[s]
|
439
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/samp[samp]
|
440
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/small[small]
|
441
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strike[strike]
|
442
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sub[sub]
|
443
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sup[sup]
|
444
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time[time]
|
445
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul[ul]
|
446
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/var[var]
|
447
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio[audio]
|
448
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details[details]
|
449
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img[img]
|
450
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source[source]
|
451
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span[span]
|
452
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary[summary]
|
453
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video[video]
|
454
|
+
|
455
|
+
The following global attributes are allowed for all elements:
|
456
|
+
|
457
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id[id]
|
458
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class[class]
|
459
|
+
|
460
|
+
The following attributes are limited to only a few elements like `a`, `abbr`, and `dfn` for the most part.
|
461
|
+
|
462
|
+
* link:https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/title[title]
|
463
|
+
|
464
|
+
Other attributes are allowed as well but are specific to each element. Ultimately, if you don't see an attribute being rendered then it's because it's not allowed.
|
465
|
+
|
466
|
+
==== Trailers
|
467
|
+
|
468
|
+
Multiple {git_trailers_link} for your commits are supported which are detailed in the linked article. At a minimum, the `Milestone` trailer is highly recommended since this is how Milestoner handles xref:_automatic_versioning[Automatic Versioning] for you.
|
469
|
+
|
470
|
+
One of the more powerful features of using {git_trailers_link} in your commit messages is they give you the ability to fully resolve what is defined in your default global xref:_customization[configuration]. Here's a more detailed breakdown:
|
471
|
+
|
472
|
+
* *Format* (optional): Use `ascii_doc` or `markdown` for the value to control what syntax used to render your commit message. The default is `ascii_doc` but if your configuration uses a different default you can override that per commit message if desired.
|
473
|
+
* *Issue* (optional): When supplied, Milestoner will automatically associate your commit with the corresponding issue ID you provide as a value. This works in conjunction with your xref:_customization[configuration].
|
474
|
+
* *Milestone* (optional): This is detailed in the xref:_automatic_versioning[Automatic Versioning] section below.
|
475
|
+
|
376
476
|
==== Automatic Versioning
|
377
477
|
|
378
478
|
As mentioned earlier, the calculation of version information happens automatically based on your last {git_link} tag and any {git_link} commit trailer metadata used. If none of this information is present, then the default version of `0.0.0` is used instead. All of this information is available to you via the following command:
|
@@ -494,23 +594,27 @@ Of all build formats supported, the web format is the most powerful and feature
|
|
494
594
|
|
495
595
|
*With Basic Git Commit*
|
496
596
|
|
497
|
-
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-overview.png[Overview,width=1119,height=
|
597
|
+
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-overview.png[Overview,width=1119,height=902,role=focal_point]
|
498
598
|
|
499
599
|
*With Collaborators and Signers*
|
500
600
|
|
501
|
-
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-collaborators_and_signers.png[Collaborators and Signers,width=
|
601
|
+
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-collaborators_and_signers.png[Collaborators and Signers,width=903,height=903,role=focal_point]
|
502
602
|
|
503
603
|
*With Invalid Tag*
|
504
604
|
|
505
|
-
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-tag_invalid.png[Invalid Tag,width=
|
605
|
+
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-tag_invalid.png[Invalid Tag,width=881,height=403,role=focal_point]
|
506
606
|
|
507
607
|
*With Valid Tag*
|
508
608
|
|
509
|
-
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-tag_valid.png[Valid Tag,width=
|
609
|
+
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-tag_valid.png[Valid Tag,width=688,height=771,role=focal_point]
|
510
610
|
|
511
611
|
*With Notes*
|
512
612
|
|
513
|
-
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-notes.png[Notes,width=
|
613
|
+
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-notes.png[Notes,width=903,height=757,role=focal_point]
|
614
|
+
|
615
|
+
*With ASCII Doc/Markdown*
|
616
|
+
|
617
|
+
image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-asdcii_doc[ASCII Doc,width=908,height=1938,role=focal_point]
|
514
618
|
|
515
619
|
💡 See {git_notes_link} to learn more.
|
516
620
|
|
@@ -17,9 +17,6 @@ module Milestoner
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def call
|
20
|
-
settings.build_root.make_path
|
21
|
-
copy_stylesheet
|
22
|
-
|
23
20
|
tagger.call
|
24
21
|
.fmap { |tags| build tags }
|
25
22
|
.alt_map { |message| failure message }
|
@@ -30,10 +27,14 @@ module Milestoner
|
|
30
27
|
attr_reader :tagger, :view
|
31
28
|
|
32
29
|
def build tags
|
30
|
+
make_root
|
31
|
+
copy_stylesheet
|
33
32
|
tags.each { |tag| write tag }
|
34
33
|
settings.build_root
|
35
34
|
end
|
36
35
|
|
36
|
+
def make_root = settings.build_root.make_path
|
37
|
+
|
37
38
|
def copy_stylesheet
|
38
39
|
return unless settings.build_stylesheet
|
39
40
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "core"
|
3
4
|
require "sod"
|
4
5
|
|
5
6
|
module Milestoner
|
@@ -17,17 +18,22 @@ module Milestoner
|
|
17
18
|
on %w[-c --create], argument: "external_id,handle,name"
|
18
19
|
|
19
20
|
def call values
|
20
|
-
|
21
|
+
case values.split ","
|
22
|
+
in String => external_id, String => handle, String => name
|
23
|
+
client.write(:users) { upsert({external_id:, handle:, name:}) }
|
24
|
+
.bind { |user| log_info "Created: #{user.name.inspect}" }
|
25
|
+
in String, String then log_error "Name must be supplied."
|
26
|
+
in [String] then log_error "Handle and Name must be supplied."
|
27
|
+
in Core::EMPTY_ARRAY then log_error "No values given."
|
28
|
+
else log_error "Too many values given."
|
29
|
+
end
|
21
30
|
end
|
22
31
|
|
23
32
|
private
|
24
33
|
|
25
|
-
def process values
|
26
|
-
external_id, handle, name = values.split ","
|
27
|
-
client.write(:users) { upsert({external_id:, handle:, name:}) }
|
28
|
-
end
|
29
|
-
|
30
34
|
def log_info(message) = logger.info { message }
|
35
|
+
|
36
|
+
def log_error(message) = logger.error { message }
|
31
37
|
end
|
32
38
|
end
|
33
39
|
end
|
@@ -24,7 +24,15 @@ module Milestoner
|
|
24
24
|
def print users
|
25
25
|
return logger.info { "No users found." } if users.empty?
|
26
26
|
|
27
|
-
|
27
|
+
header
|
28
|
+
users.each { |user| io.puts user.to_h.values.map(&:inspect).join ", " }
|
29
|
+
end
|
30
|
+
|
31
|
+
def header
|
32
|
+
header = "External ID, Handle, Name"
|
33
|
+
|
34
|
+
io.puts header
|
35
|
+
io.puts "-" * header.size
|
28
36
|
end
|
29
37
|
end
|
30
38
|
end
|
@@ -24,15 +24,17 @@ module Milestoner
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def call
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
collect.fmap { |tags| tail tags.last(settings.build_max).map(&:version) }
|
28
|
+
.fmap { |references| slice(references).reverse }
|
29
|
+
.bind { |tags| tags.empty? ? Failure("No tags or commits.") : Success(tags) }
|
30
30
|
end
|
31
31
|
|
32
32
|
private
|
33
33
|
|
34
34
|
attr_reader :enricher, :model
|
35
35
|
|
36
|
+
def collect = git.tagged? ? git.tags("--sort=taggerdate") : placeholder_with_commits
|
37
|
+
|
36
38
|
def tail references
|
37
39
|
references.append "HEAD" if settings.build_tail == "head"
|
38
40
|
references
|
@@ -68,6 +70,21 @@ module Milestoner
|
|
68
70
|
]
|
69
71
|
end
|
70
72
|
|
73
|
+
def placeholder_with_commits = enricher.call.fmap { |commits| placeholder_for commits }
|
74
|
+
|
75
|
+
def placeholder_for commits
|
76
|
+
return commits if commits.empty?
|
77
|
+
|
78
|
+
[
|
79
|
+
model[
|
80
|
+
author: commits.last.author,
|
81
|
+
commits:,
|
82
|
+
committed_at: Time.now,
|
83
|
+
version: settings.project_version
|
84
|
+
]
|
85
|
+
]
|
86
|
+
end
|
87
|
+
|
71
88
|
def author tag
|
72
89
|
author_enricher.call tag.with(author_name: tag.author_name || settings.project_author)
|
73
90
|
end
|
@@ -6,15 +6,24 @@ module Milestoner
|
|
6
6
|
module Renderers
|
7
7
|
# Renders ASCII Doc as HTML.
|
8
8
|
class Asciidoc
|
9
|
-
|
9
|
+
SETTINGS = {
|
10
|
+
safe: :safe,
|
11
|
+
attributes: {
|
12
|
+
"source-highlighter" => "rouge",
|
13
|
+
"rouge-linenums-mode" => "inline"
|
14
|
+
}
|
15
|
+
}.freeze
|
16
|
+
|
17
|
+
def initialize settings: SETTINGS, client: Asciidoctor
|
18
|
+
@settings = settings
|
10
19
|
@client = client
|
11
20
|
end
|
12
21
|
|
13
|
-
def call(content) = client.convert content
|
22
|
+
def call(content) = client.convert content, settings
|
14
23
|
|
15
24
|
private
|
16
25
|
|
17
|
-
attr_reader :client
|
26
|
+
attr_reader :settings, :client
|
18
27
|
end
|
19
28
|
end
|
20
29
|
end
|
@@ -1,12 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "redcarpet"
|
4
|
+
require "rouge"
|
5
|
+
require "rouge/plugins/redcarpet"
|
4
6
|
|
5
7
|
module Milestoner
|
6
8
|
module Renderers
|
7
9
|
# Renders Markdown as HTML.
|
8
10
|
class Markdown
|
9
|
-
|
11
|
+
CLIENT = Redcarpet::Markdown.new Class.new(Redcarpet::Render::HTML)
|
12
|
+
.include(Rouge::Plugins::Redcarpet)
|
13
|
+
.set_temporary_name("redcarpet_html_rouge")
|
14
|
+
.new,
|
15
|
+
disable_indented_code_blocks: true,
|
16
|
+
fenced_code_blocks: true,
|
17
|
+
footnotes: true,
|
18
|
+
highlight: true,
|
19
|
+
superscript: true,
|
20
|
+
tables: true
|
21
|
+
|
22
|
+
def initialize client: CLIENT
|
10
23
|
@client = client
|
11
24
|
end
|
12
25
|
|
data/lib/milestoner/sanitizer.rb
CHANGED
@@ -19,13 +19,22 @@ module Milestoner
|
|
19
19
|
|
20
20
|
attr_reader :defaults, :client
|
21
21
|
|
22
|
-
def configuration
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
def configuration = client::Config.merge(defaults, elements:, attributes:)
|
23
|
+
|
24
|
+
def elements
|
25
|
+
defaults[:elements].including "audio", "details", "img", "source", "span", "summary", "video"
|
26
|
+
end
|
27
|
+
|
28
|
+
def attributes
|
29
|
+
defaults[:attributes].merge(
|
30
|
+
all: %w[class id],
|
31
|
+
"a" => %w[href title],
|
32
|
+
"audio" => %w[autoplay controls controlslist crossorigin loop muted preload src],
|
33
|
+
"details" => %w[name open],
|
34
|
+
"img" => %w[alt height loading src width],
|
35
|
+
"source" => %w[type src srcset sizes media height width],
|
36
|
+
"video" => %w[controls height poster src width]
|
37
|
+
)
|
29
38
|
end
|
30
39
|
end
|
31
40
|
end
|
@@ -2,6 +2,308 @@
|
|
2
2
|
--font-family: Verdana;
|
3
3
|
}
|
4
4
|
|
5
|
+
/* Rouge (https://rouge.jneen.net) */
|
6
|
+
.rouge.highlight {
|
7
|
+
--color-berry: hsl(240, 18%, 40%);
|
8
|
+
--color-blue: hsl(223, 100%, 74%);
|
9
|
+
--color-cold: hsl(189, 100%, 93%);
|
10
|
+
--color-dark: hsl(191, 12%, 27%);
|
11
|
+
--color-eclipse: hsl(0, 3%, 21%);
|
12
|
+
--color-enoki: hsl(60, 30%, 95%);
|
13
|
+
--color-goblin: hsl(84, 82%, 49%);
|
14
|
+
--color-green: hsl(140, 67%, 66%);
|
15
|
+
--color-grey: hsl(0, 0%, 65%);
|
16
|
+
--color-ice: hsl(184, 74%, 83%);
|
17
|
+
--color-ink: hsl(210, 4%, 11%);
|
18
|
+
--color-khaki: hsl(35, 26%, 75%);
|
19
|
+
--color-lime: hsl(82, 100%, 58%);
|
20
|
+
--color-purple: hsl(259, 60%, 79.4%);
|
21
|
+
--color-red: hsl(0, 100%, 73%);
|
22
|
+
--color-sea: hsl(190, 100%, 60%);
|
23
|
+
--color-sky: hsl(203, 93%, 74%);
|
24
|
+
--color-teal: hsl(189, 23%, 53%);
|
25
|
+
--color-white: hsl(0, 0%, 100%);
|
26
|
+
--color-yellow: hsl(49, 100%, 59%);
|
27
|
+
|
28
|
+
table {
|
29
|
+
td {
|
30
|
+
padding: 5px;
|
31
|
+
}
|
32
|
+
|
33
|
+
pre {
|
34
|
+
margin: 0;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
.c, .ch, .cd, .cpf {
|
39
|
+
color: var(--color-grey);
|
40
|
+
font-style: italic;
|
41
|
+
}
|
42
|
+
|
43
|
+
.cm {
|
44
|
+
color: var(--color-berry);
|
45
|
+
font-style: italic;
|
46
|
+
}
|
47
|
+
|
48
|
+
.c1 {
|
49
|
+
color: var(--color-grey);
|
50
|
+
font-style: italic;
|
51
|
+
}
|
52
|
+
|
53
|
+
.cp {
|
54
|
+
color: var(--color-teal);
|
55
|
+
font-weight: bold;
|
56
|
+
}
|
57
|
+
|
58
|
+
.cs {
|
59
|
+
color: var(--color-dark);
|
60
|
+
font-weight: bold;
|
61
|
+
font-style: italic;
|
62
|
+
}
|
63
|
+
|
64
|
+
.err {
|
65
|
+
color: var(--color-enoki);
|
66
|
+
background-color: var(--color-eclipse);
|
67
|
+
}
|
68
|
+
|
69
|
+
.gi {
|
70
|
+
color: var(--color-lime);
|
71
|
+
}
|
72
|
+
|
73
|
+
.gd {
|
74
|
+
color: var(--color-blue);
|
75
|
+
}
|
76
|
+
|
77
|
+
.ge {
|
78
|
+
color: var(--color-ink);
|
79
|
+
font-style: italic;
|
80
|
+
}
|
81
|
+
|
82
|
+
.gr {
|
83
|
+
color: var(--color-blue);
|
84
|
+
}
|
85
|
+
|
86
|
+
.gt {
|
87
|
+
color: var(--color-blue);
|
88
|
+
}
|
89
|
+
|
90
|
+
.gh {
|
91
|
+
color: var(--color-eclipse);
|
92
|
+
}
|
93
|
+
|
94
|
+
.go {
|
95
|
+
color: var(--color-eclipse);
|
96
|
+
}
|
97
|
+
|
98
|
+
.gp {
|
99
|
+
color: var(--color-sea);
|
100
|
+
}
|
101
|
+
|
102
|
+
.gs {
|
103
|
+
font-weight: bold;
|
104
|
+
}
|
105
|
+
|
106
|
+
.gu {
|
107
|
+
color: var(--color-dark);
|
108
|
+
}
|
109
|
+
|
110
|
+
.k, .kv {
|
111
|
+
color: var(--color-sky);
|
112
|
+
font-weight: bold;
|
113
|
+
}
|
114
|
+
|
115
|
+
.kc {
|
116
|
+
color: var(--color-sea);
|
117
|
+
font-weight: bold;
|
118
|
+
}
|
119
|
+
|
120
|
+
.kd {
|
121
|
+
color: var(--color-sea);
|
122
|
+
font-weight: bold;
|
123
|
+
}
|
124
|
+
|
125
|
+
.kp {
|
126
|
+
color: var(--color-ice);
|
127
|
+
font-weight: bold;
|
128
|
+
}
|
129
|
+
|
130
|
+
.kr {
|
131
|
+
color: var(--color-sea);
|
132
|
+
font-weight: bold;
|
133
|
+
}
|
134
|
+
|
135
|
+
.kt {
|
136
|
+
color: var(--color-sea);
|
137
|
+
font-weight: bold;
|
138
|
+
}
|
139
|
+
|
140
|
+
.kn {
|
141
|
+
color: var(--color-blue);
|
142
|
+
font-weight: bold;
|
143
|
+
}
|
144
|
+
|
145
|
+
.ow {
|
146
|
+
color: var(--color-blue);
|
147
|
+
font-weight: bold;
|
148
|
+
}
|
149
|
+
|
150
|
+
.o {
|
151
|
+
color: var(--color-blue);
|
152
|
+
font-weight: bold;
|
153
|
+
}
|
154
|
+
|
155
|
+
.mf {
|
156
|
+
color: var(--color-ice);
|
157
|
+
}
|
158
|
+
|
159
|
+
.mh {
|
160
|
+
color: var(--color-purple);
|
161
|
+
}
|
162
|
+
|
163
|
+
.il {
|
164
|
+
color: var(--color-purple);
|
165
|
+
}
|
166
|
+
|
167
|
+
.mi {
|
168
|
+
color: var(--color-ice);
|
169
|
+
}
|
170
|
+
|
171
|
+
.mo {
|
172
|
+
color: var(--color-purple);
|
173
|
+
}
|
174
|
+
|
175
|
+
.m, .mb, .mx {
|
176
|
+
color: var(--color-purple);
|
177
|
+
}
|
178
|
+
|
179
|
+
.se {
|
180
|
+
color: var(--color-purple);
|
181
|
+
}
|
182
|
+
|
183
|
+
.sb {
|
184
|
+
color: var(--color-khaki);
|
185
|
+
}
|
186
|
+
|
187
|
+
.sc {
|
188
|
+
color: var(--color-khaki);
|
189
|
+
}
|
190
|
+
|
191
|
+
.sd {
|
192
|
+
color: var(--color-khaki);
|
193
|
+
}
|
194
|
+
|
195
|
+
.s2 {
|
196
|
+
color: var(--color-khaki);
|
197
|
+
}
|
198
|
+
|
199
|
+
.sh {
|
200
|
+
color: var(--color-khaki);
|
201
|
+
}
|
202
|
+
|
203
|
+
.si {
|
204
|
+
color: var(--color-purple);
|
205
|
+
}
|
206
|
+
|
207
|
+
.sx {
|
208
|
+
color: var(--color-green);
|
209
|
+
}
|
210
|
+
|
211
|
+
.sr {
|
212
|
+
color: var(--color-ice);
|
213
|
+
}
|
214
|
+
|
215
|
+
.s1 {
|
216
|
+
color: var(--color-khaki);
|
217
|
+
}
|
218
|
+
|
219
|
+
.ss {
|
220
|
+
color: var(--color-green);
|
221
|
+
}
|
222
|
+
|
223
|
+
.s, .sa, .dl {
|
224
|
+
color: var(--color-khaki);
|
225
|
+
}
|
226
|
+
|
227
|
+
.n {
|
228
|
+
color: var(--color-white);
|
229
|
+
}
|
230
|
+
|
231
|
+
.na {
|
232
|
+
color: var(--color-lime);
|
233
|
+
}
|
234
|
+
|
235
|
+
.nc {
|
236
|
+
color: var(--color-lime);
|
237
|
+
font-weight: bold;
|
238
|
+
}
|
239
|
+
|
240
|
+
.nd {
|
241
|
+
color: var(--color-lime);
|
242
|
+
font-weight: bold;
|
243
|
+
}
|
244
|
+
|
245
|
+
.ne {
|
246
|
+
color: var(--color-lime);
|
247
|
+
font-weight: bold;
|
248
|
+
}
|
249
|
+
|
250
|
+
.nf, .fm {
|
251
|
+
color: var(--color-goblin);
|
252
|
+
font-weight: bold;
|
253
|
+
}
|
254
|
+
|
255
|
+
.no {
|
256
|
+
color: var(--color-sea);
|
257
|
+
}
|
258
|
+
|
259
|
+
.bp {
|
260
|
+
color: var(--color-enoki);
|
261
|
+
}
|
262
|
+
|
263
|
+
.nb {
|
264
|
+
color: var(--color-cold);
|
265
|
+
}
|
266
|
+
|
267
|
+
.ni {
|
268
|
+
color: var(--color-enoki);
|
269
|
+
}
|
270
|
+
|
271
|
+
.nn {
|
272
|
+
color: var(--color-lime);
|
273
|
+
}
|
274
|
+
|
275
|
+
.vc {
|
276
|
+
color: var(--color-red);
|
277
|
+
}
|
278
|
+
|
279
|
+
.vg {
|
280
|
+
color: var(--color-enoki);
|
281
|
+
}
|
282
|
+
|
283
|
+
.vi {
|
284
|
+
color: var(--color-yellow);
|
285
|
+
}
|
286
|
+
|
287
|
+
.nv, .vm {
|
288
|
+
color: var(--color-enoki);
|
289
|
+
}
|
290
|
+
|
291
|
+
.w {
|
292
|
+
color: var(--color-enoki);
|
293
|
+
}
|
294
|
+
|
295
|
+
.nl {
|
296
|
+
color: var(--color-enoki);
|
297
|
+
font-weight: bold;
|
298
|
+
}
|
299
|
+
|
300
|
+
.nt {
|
301
|
+
color: var(--color-cold);
|
302
|
+
}
|
303
|
+
|
304
|
+
color: var(--color-enoki);
|
305
|
+
}
|
306
|
+
|
5
307
|
.milestone {
|
6
308
|
--border-width: 0.15rem;
|
7
309
|
--color-black: hsl(0, 0%, 0%);
|
@@ -15,10 +317,12 @@
|
|
15
317
|
--color-ice: hsl(216, 100%, 98%);
|
16
318
|
--color-major: hsl(7, 79%, 32%);
|
17
319
|
--color-minor: hsl(221, 79%, 32%);
|
320
|
+
--color-night: hsl(216, 9%, 21%);
|
18
321
|
--color-orange: hsl(24.8, 100%, 50.2%);
|
19
322
|
--color-patch: hsl(156, 79%, 32%);
|
20
323
|
--color-powder: hsl(0, 0%, 98%);
|
21
324
|
--color-red: hsl(0, 84.1%, 44.5%);
|
325
|
+
--color-silver: hsl(224, 33%, 94%);
|
22
326
|
--color-slate: hsl(211, 23%, 41%);
|
23
327
|
--color-smoke: hsl(229, 31%, 93%);
|
24
328
|
--color-white: hsl(0, 0%, 100%);
|
@@ -29,6 +333,62 @@
|
|
29
333
|
font-family: var(--font-family);
|
30
334
|
margin: 0 12vw;
|
31
335
|
|
336
|
+
blockquote {
|
337
|
+
background-color: var(--color-silver);
|
338
|
+
border-left: 0.5rem solid var(--color-slate);
|
339
|
+
border-radius: 0.5rem;
|
340
|
+
padding: 0.5rem 1rem;
|
341
|
+
|
342
|
+
p {
|
343
|
+
margin: 0;
|
344
|
+
quotes: "\201C""\201D";
|
345
|
+
|
346
|
+
&::before, &::after {
|
347
|
+
font-family: cursive;
|
348
|
+
font-size: 1.5rem;
|
349
|
+
}
|
350
|
+
|
351
|
+
&::before {
|
352
|
+
content: open-quote;
|
353
|
+
padding-right: 0.3rem;
|
354
|
+
}
|
355
|
+
|
356
|
+
&::after {
|
357
|
+
content: close-quote;
|
358
|
+
padding-left: 0.1rem;
|
359
|
+
}
|
360
|
+
}
|
361
|
+
}
|
362
|
+
|
363
|
+
:not(pre) > code {
|
364
|
+
background-color: var(--color-night);
|
365
|
+
border-radius: 0.3rem;
|
366
|
+
color: var(--color-white);
|
367
|
+
font-size: 0.95rem;
|
368
|
+
padding: 0.1rem 0.3rem;
|
369
|
+
}
|
370
|
+
|
371
|
+
pre:not([class^=language]) {
|
372
|
+
background-color: var(--color-night);
|
373
|
+
color: var(--color-ghost);
|
374
|
+
line-height: 1.5rem;
|
375
|
+
padding: 0.5rem 1rem;
|
376
|
+
font-size: 0.9rem;
|
377
|
+
white-space: pre-wrap;
|
378
|
+
}
|
379
|
+
|
380
|
+
pre {
|
381
|
+
border-radius: 0.5rem;
|
382
|
+
font-weight: 400;
|
383
|
+
padding: 0.5rem;
|
384
|
+
}
|
385
|
+
|
386
|
+
img, video {
|
387
|
+
max-width: 100%;
|
388
|
+
height: auto;
|
389
|
+
object-fit: cover;
|
390
|
+
}
|
391
|
+
|
32
392
|
.normal {
|
33
393
|
border-bottom-color: var(--color-ghost);
|
34
394
|
border-color: transparent;
|
@@ -46,6 +406,7 @@
|
|
46
406
|
|
47
407
|
.avatar {
|
48
408
|
border-radius: 50%;
|
409
|
+
height: fit-content;
|
49
410
|
}
|
50
411
|
|
51
412
|
.pill {
|
@@ -138,8 +499,9 @@
|
|
138
499
|
}
|
139
500
|
|
140
501
|
.overview {
|
141
|
-
display: flex;
|
142
502
|
align-items: center;
|
503
|
+
display: flex;
|
504
|
+
flex-wrap: wrap;
|
143
505
|
justify-content: space-between;
|
144
506
|
margin-bottom: 0.5rem;
|
145
507
|
}
|
data/milestoner.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = "milestoner"
|
5
|
-
spec.version = "18.
|
5
|
+
spec.version = "18.5.0"
|
6
6
|
spec.authors = ["Brooke Kuhlmann"]
|
7
7
|
spec.email = ["brooke@alchemists.io"]
|
8
8
|
spec.homepage = "https://alchemists.io/projects/milestoner"
|
@@ -37,6 +37,7 @@ Gem::Specification.new do |spec|
|
|
37
37
|
spec.add_dependency "lode", "~> 1.8"
|
38
38
|
spec.add_dependency "redcarpet", "~> 3.6"
|
39
39
|
spec.add_dependency "refinements", "~> 12.8"
|
40
|
+
spec.add_dependency "rouge", "~> 4.3"
|
40
41
|
spec.add_dependency "rss", "~> 0.3"
|
41
42
|
spec.add_dependency "runcom", "~> 11.5"
|
42
43
|
spec.add_dependency "sanitize", "~> 6.1"
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: milestoner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 18.
|
4
|
+
version: 18.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
3n5C8/6Zh9DYTkpcwPSuIfAga6wf4nXc9m6JAw8AuMLaiWN/r/2s4zJsUHYERJEu
|
36
36
|
gZGm4JqtuSg8pYjPeIJxS960owq+SfuC+jxqmRA54BisFCv/0VOJi7tiJVY=
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2024-09-
|
38
|
+
date: 2024-09-15 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: asciidoctor
|
@@ -233,6 +233,20 @@ dependencies:
|
|
233
233
|
- - "~>"
|
234
234
|
- !ruby/object:Gem::Version
|
235
235
|
version: '12.8'
|
236
|
+
- !ruby/object:Gem::Dependency
|
237
|
+
name: rouge
|
238
|
+
requirement: !ruby/object:Gem::Requirement
|
239
|
+
requirements:
|
240
|
+
- - "~>"
|
241
|
+
- !ruby/object:Gem::Version
|
242
|
+
version: '4.3'
|
243
|
+
type: :runtime
|
244
|
+
prerelease: false
|
245
|
+
version_requirements: !ruby/object:Gem::Requirement
|
246
|
+
requirements:
|
247
|
+
- - "~>"
|
248
|
+
- !ruby/object:Gem::Version
|
249
|
+
version: '4.3'
|
236
250
|
- !ruby/object:Gem::Dependency
|
237
251
|
name: rss
|
238
252
|
requirement: !ruby/object:Gem::Requirement
|
metadata.gz.sig
CHANGED
Binary file
|