milestoner 18.4.0 → 18.6.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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.adoc +175 -54
  4. data/lib/milestoner/builders/feed.rb +0 -1
  5. data/lib/milestoner/builders/web.rb +4 -3
  6. data/lib/milestoner/cli/actions/cache/create.rb +12 -6
  7. data/lib/milestoner/cli/actions/cache/list.rb +9 -1
  8. data/lib/milestoner/commits/tagger.rb +20 -3
  9. data/lib/milestoner/renderers/asciidoc.rb +12 -3
  10. data/lib/milestoner/renderers/markdown.rb +14 -1
  11. data/lib/milestoner/sanitizer.rb +16 -7
  12. data/lib/milestoner/syndication/builder.rb +1 -1
  13. data/lib/milestoner/templates/milestones/_avatar.adoc.erb +1 -1
  14. data/lib/milestoner/templates/milestones/_avatar.html.erb +6 -5
  15. data/lib/milestoner/templates/milestones/_avatar.md.erb +1 -2
  16. data/lib/milestoner/templates/milestones/_avatar.xml.erb +1 -5
  17. data/lib/milestoner/templates/milestones/_commit.adoc.erb +6 -20
  18. data/lib/milestoner/templates/milestones/_commit.html.erb +32 -53
  19. data/lib/milestoner/templates/milestones/_commit.md.erb +1 -1
  20. data/lib/milestoner/templates/milestones/_commit.xml.erb +13 -41
  21. data/lib/milestoner/templates/milestones/_content.adoc.erb +1 -0
  22. data/lib/milestoner/templates/milestones/_content.html.erb +1 -0
  23. data/lib/milestoner/templates/milestones/_content.xml.erb +1 -0
  24. data/lib/milestoner/templates/milestones/_logo.adoc.erb +1 -0
  25. data/lib/milestoner/templates/milestones/_logo.html.erb +1 -0
  26. data/lib/milestoner/templates/milestones/_logo.md.erb +3 -0
  27. data/lib/milestoner/templates/milestones/_logo.xml.erb +3 -0
  28. data/lib/milestoner/templates/milestones/_none.adoc.erb +1 -0
  29. data/lib/milestoner/templates/milestones/_none.html.erb +1 -0
  30. data/lib/milestoner/templates/milestones/_none.xml.erb +1 -0
  31. data/lib/milestoner/templates/milestones/_profile.adoc.erb +1 -1
  32. data/lib/milestoner/templates/milestones/_profile.html.erb +1 -5
  33. data/lib/milestoner/templates/milestones/_profile.md.erb +1 -1
  34. data/lib/milestoner/templates/milestones/_profile.xml.erb +1 -5
  35. data/lib/milestoner/templates/milestones/_tag-insecure.html.erb +8 -0
  36. data/lib/milestoner/templates/milestones/_tag-secure.html.erb +13 -0
  37. data/lib/milestoner/templates/milestones/_tag.adoc.erb +3 -3
  38. data/lib/milestoner/templates/milestones/_tag.html.erb +3 -29
  39. data/lib/milestoner/templates/milestones/_tag.md.erb +2 -6
  40. data/lib/milestoner/templates/milestones/_tag.xml.erb +2 -7
  41. data/lib/milestoner/templates/milestones/_user.adoc.erb +1 -0
  42. data/lib/milestoner/templates/milestones/_user.html.erb +1 -0
  43. data/lib/milestoner/templates/milestones/_user.md.erb +1 -0
  44. data/lib/milestoner/templates/milestones/_user.xml.erb +1 -0
  45. data/lib/milestoner/templates/milestones/_users.adoc.erb +3 -0
  46. data/lib/milestoner/templates/milestones/_users.html.erb +7 -0
  47. data/lib/milestoner/templates/milestones/_users.md.erb +3 -0
  48. data/lib/milestoner/templates/milestones/_users.xml.erb +7 -0
  49. data/lib/milestoner/templates/public/page.css.erb +409 -19
  50. data/lib/milestoner/views/context.rb +1 -1
  51. data/lib/milestoner/views/milestones/show.rb +2 -0
  52. data/lib/milestoner/views/parts/commit.rb +27 -3
  53. data/lib/milestoner/views/parts/tag.rb +15 -4
  54. data/lib/milestoner/views/parts/user.rb +32 -0
  55. data/lib/milestoner/views/scope_builder.rb +40 -0
  56. data/lib/milestoner/views/scopes/content.rb +17 -0
  57. data/lib/milestoner/views/scopes/logo.rb +15 -0
  58. data/lib/milestoner/views/scopes/tag_signature.rb +27 -0
  59. data/lib/milestoner/views/scopes/users.rb +14 -0
  60. data/milestoner.gemspec +2 -1
  61. data.tar.gz.sig +0 -0
  62. metadata +43 -7
  63. metadata.gz.sig +0 -0
  64. data/lib/milestoner/templates/milestones/_icon.adoc.erb +0 -1
  65. data/lib/milestoner/templates/milestones/_icon.html.erb +0 -6
  66. data/lib/milestoner/templates/milestones/_icon.md.erb +0 -5
  67. data/lib/milestoner/templates/milestones/_icon.xml.erb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f42cba7a4f2b93a05d7fcf25fb973e2a241c8d1813a143baa779c2e1a310f1ed
4
- data.tar.gz: 73635a67814d59b11bae524f45cb4878196aba7e302fa595ecedaaf89e350a6a
3
+ metadata.gz: acc8c51f0fa0cacdf7e8bc0e871a697520ce09c2b7af09c1dba01c1632b06671
4
+ data.tar.gz: 164ef1e821b63b7b382cbcb4dda7a9450c7d0493dfb92436b2161fcc983599f3
5
5
  SHA512:
6
- metadata.gz: 9fcf5478cee6c0a63811cb133d27ae4bc292da15bacdbdb65f2edd29375057f87c23f15f4780ae68539439ed3c5c2011989477ea4c530b32effa5659f46735b1
7
- data.tar.gz: a9e17509fa39de1247896518da061daa4586afbff8e905b5934728e5269e448ef973c1ffa1ac1136efd6d01a275912fe872c1fe84876c65c25dbaf7e32fed75a
6
+ metadata.gz: a999795a124cc155086e5826bd64880f9838d415e941b455cab6141bd66a05713e47009afbc11749809ff7692aced45bb13878f4a6fc0620ec520536f5741d0d
7
+ data.tar.gz: f2e01fb0744c54b2d1b6c87f7bd7932c71bde127a5509a101e05b37c87cc340371af596fd3bcf5edf72dfbcd25a99505a54925e323ed88a489af4672c7ebe3e2
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-doc.org/3.3.0/format_specifications_rdoc.html[String Formats]
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,43 +54,43 @@ 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 Format
57
+ === ASCII Doc
54
58
 
55
- image:https://alchemists.io/images/projects/milestoner/screenshots/build-ascii_doc-collapsed.png[Release Notes,width=1149,height=830,role=focal_point]
59
+ image:https://alchemists.io/images/projects/milestoner/screenshots/build-ascii_doc-collapsed.png[Release Notes,width=1160,height=831,role=focal_point]
56
60
 
57
- image:https://alchemists.io/images/projects/milestoner/screenshots/build-ascii_doc-expanded.png[Release Notes,width=1149,height=1054,role=focal_point]
61
+ image:https://alchemists.io/images/projects/milestoner/screenshots/build-ascii_doc-expanded.png[Release Notes,width=1160,height=1335,role=focal_point]
58
62
 
59
63
  * *Command*: `milestoner build --format ascii_doc`
60
64
  * *Renderer*: {ascii_doc_link}
61
65
 
62
- === Feed Format
66
+ === Feed
63
67
 
64
- image:https://alchemists.io/images/projects/milestoner/screenshots/build-feed-collapsed.png[Release Notes,width=1109,height=1143,role=focal_point]
68
+ image:https://alchemists.io/images/projects/milestoner/screenshots/build-feed-collapsed.png[Release Notes,width=1275,height=954,role=focal_point]
65
69
 
66
- image:https://alchemists.io/images/projects/milestoner/screenshots/build-feed-expanded.png[Release Notes,width=1109,height=1143,role=focal_point]
70
+ image:https://alchemists.io/images/projects/milestoner/screenshots/build-feed-expanded.png[Release Notes,width=1275,height=1613,role=focal_point]
67
71
 
68
72
  * *Command*: `milestoner build --format feed`
69
73
  * *Renderer*: {net_news_wire_link}
70
74
 
71
75
  === Markdown Format
72
76
 
73
- image:https://alchemists.io/images/projects/milestoner/screenshots/build-markdown.png[Release Notes,width=789,height=718,role=focal_point]
77
+ image:https://alchemists.io/images/projects/milestoner/screenshots/build-markdown.png[Release Notes,width=796,height=703,role=focal_point]
74
78
 
75
79
  * *Command*: `milestoner build --format markdown`
76
80
  * *Renderer*: {marked_link}
77
81
 
78
- === Stream Format
82
+ === Stream
79
83
 
80
- image:https://alchemists.io/images/projects/milestoner/screenshots/build-stream.png[Release Notes,width=586,height=341,role=focal_point]
84
+ image:https://alchemists.io/images/projects/milestoner/screenshots/build-stream.png[Release Notes,width=566,height=320,role=focal_point]
81
85
 
82
86
  * *Command*: `milestoner build --format stream`
83
87
  * *Renderer*: {iterm_link}
84
88
 
85
- === Web Format
89
+ === Web
86
90
 
87
- image:https://alchemists.io/images/projects/milestoner/screenshots/build-web-collapsed.png[Release Notes,width=1195,height=878,role=focal_point]
91
+ image:https://alchemists.io/images/projects/milestoner/screenshots/build-web-collapsed.png[Release Notes,width=1296,height=647,role=focal_point]
88
92
 
89
- image:https://alchemists.io/images/projects/milestoner/screenshots/build-web-expanded.png[Release Notes,width=1195,height=878,role=focal_point]
93
+ image:https://alchemists.io/images/projects/milestoner/screenshots/build-web-expanded.png[Release Notes,width=1296,height=1032,role=focal_point]
90
94
 
91
95
  * *Command*: `milestoner build --format web`
92
96
  * *Renderer*: {firefox_link}
@@ -107,12 +111,12 @@ image:https://alchemists.io/images/projects/milestoner/screenshots/build-web-exp
107
111
  * Provides automatic versioning based on last {git_link} tag and {git_trailers_link}. See {git_commit_anatomy_link} for details.
108
112
  * Supports multiple build formats:
109
113
  ** {ascii_doc_link}
110
- ** {syndication_link}
114
+ ** {syndication_link} (feed)
111
115
  ** {markdown_link}
112
116
  ** Stream (console)
113
- ** link:https://html.spec.whatwg.org/multipage[Web]
117
+ ** link:https://html.spec.whatwg.org/multipage[Web] (HTML)
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
 
@@ -273,7 +277,7 @@ The above can be customized as follows:
273
277
  *** `mime`: Required. The mime type. Defaults to HTML and XML.
274
278
  *** `relation`: Required. Identifies the relation of the link which can either be `self` (i.e. XML) or `alternate` (i.e. HTML).
275
279
  *** `uri`: Required. The link URI to follow for more information. Defaults to dynamic string formatting based on existing configuration values.
276
- * `tracker`: Required. Managed issue tracker details.
280
+ * `tracker`: Required. Manages issue tracker details.
277
281
  ** `uri`: Required. The URI format for linking to issues as formatted using {string_formats_link}. Default: GitHub. The `id` is dynamically calculated via the commit `Issue` trailer as linted by {git_lint_link}. When no ID can be found, this will default to _All_ issues.
278
282
 
279
283
  As hinted at above, all URIs (including syndication), support {string_formats_link}. This means you can use the `%<key>s` format -- replacing `key` with the key of your choice -- to customize your configuration further.
@@ -292,39 +296,43 @@ image:https://alchemists.io/images/projects/milestoner/screenshots/usage-cache.p
292
296
 
293
297
  Milestoner's cache allows you to enrich user information (i.e. authors, collaborators, etc) by storing information in a `PStore` database as managed by the {lode_link} gem. Cache location, as with the Config, is managed by the {runcom_link} gem.
294
298
 
295
- User information should be sourced from whatever service you use for managing your source code. For example, when using GitHub, your workflow might look like this:
299
+ User information should be sourced from whatever service used for managing your source code. For example, when using GitHub, your workflow might look like this:
296
300
 
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
- # 111, jsmith, Jane Smith
315
- # 222, jdoe, John Doe
316
- # 333, jgrey, Jill Grey
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
- # 111, jsmith, Jane Smith
324
- # 222, jdoe, John Doe
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/demo/.cache/milestoner/database.store.
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=851,height=571,role=focal_point]
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 milestone...
348
- # 🟢 Milestone built: /Users/bkuhlmann/Engineering/OSS/milestoner/tmp/milestone
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,115 @@ 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 && open "tmp/milestones/index.html"
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
- ruby -run -e httpd "tmp/milestones" --port 3030 &
368
- open "http://localhost:3030"
369
- fg
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} too.
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_link} styles via the `page.css` template as documented in the xref:_templates[Templates] section below.
399
+
400
+ ℹ️ The {rouge_link} CSS classes are slightly cryptic in terms of readability but you can see how they are applied when inspecting the HTML DOM.
401
+
402
+ Here's a couple examples of commit messages using {ascii_doc_link} and {markdown_link} syntax:
403
+
404
+ *ASCII Doc*
405
+
406
+ image:https://alchemists.io/images/projects/milestoner/screenshots/syntax-ascii_doc.png[ASCII Doc,width=950,height=763,role=focal_point]
407
+
408
+ *Markdown*
409
+
410
+ image:https://alchemists.io/images/projects/milestoner/screenshots/syntax-markdown.png[Markdown,width=933,height=921,role=focal_point]
411
+
412
+ 💡 To see an example of what this renders to HTML as, see the xref:_formats[Formats] section below.
413
+
414
+ ==== Sanitization
415
+
416
+ 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:
417
+
418
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/b[b]
419
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em[em]
420
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/i[i]
421
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong[strong]
422
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/u[u]
423
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a[a]
424
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/abbr[abbr]
425
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote[blockquote]
426
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/br[br]
427
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite[cite]
428
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/code[code]
429
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dd[dd]
430
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dfn[dfn]
431
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl[dl]
432
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dt[dt]
433
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/kbd[kbd]
434
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li[li]
435
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/mark[mark]
436
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol[ol]
437
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p[p]
438
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre[pre]
439
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/q[q]
440
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/s[s]
441
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/samp[samp]
442
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/small[small]
443
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strike[strike]
444
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sub[sub]
445
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sup[sup]
446
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time[time]
447
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul[ul]
448
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/var[var]
449
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio[audio]
450
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details[details]
451
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img[img]
452
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source[source]
453
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span[span]
454
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary[summary]
455
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video[video]
456
+
457
+ The following global attributes are allowed for all elements:
458
+
459
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id[id]
460
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class[class]
461
+
462
+ The following attributes are limited to only a few elements like `a`, `abbr`, and `dfn` for the most part.
463
+
464
+ * link:https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/title[title]
465
+
466
+ An additional set of attributes are allowed but are specific to each element and fairly limited. Ultimately, if you don't see an attribute being rendered then it's not allowed.
467
+
468
+ ==== Trailers
469
+
470
+ 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.
471
+
472
+ 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:
473
+
474
+ * *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.
475
+ * *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].
476
+ * *Milestone* (optional): This is detailed in the xref:_automatic_versioning[Automatic Versioning] section below.
477
+
376
478
  ==== Automatic Versioning
377
479
 
378
480
  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:
@@ -436,7 +538,7 @@ Given the above, the resulting version would be: 2.0.0. This is because the high
436
538
 
437
539
  ==== Templates
438
540
 
439
- Build template functionality is powered by {hanami_views_link} which means you can completely customize _all_ build formats, templates, partials, stylesheets, images, and so much more.
541
+ Template functionality is powered by {hanami_views_link} which means you can completely customize _all_ build formats, templates, partials, stylesheets, images, and much more.
440
542
  The quickest way to start customization is to copy the `templates` folder structure -- included with this gem -- to your preferred {runcom_link} configuration (i.e. global or local). For example, this gem's template structure is:
441
543
 
442
544
  ....
@@ -457,19 +559,34 @@ lib/milestoner/templates
457
559
  │ ├── _commit.md.erb
458
560
  │ ├── _commit.stream.erb
459
561
  │ ├── _commit.xml.erb
460
- │ ├── _icon.adoc.erb
461
- │ ├── _icon.html.erb
462
- │ ├── _icon.md.erb
463
- │ ├── _icon.xml.erb
562
+ │ ├── _content.adoc.erb
563
+ │ ├── _content.html.erb
564
+ │ ├── _content.xml.erb
565
+ │ ├── _logo.adoc.erb
566
+ │ ├── _logo.html.erb
567
+ │ ├── _logo.md.erb
568
+ │ ├── _logo.xml.erb
569
+ │ ├── _none.adoc.erb
570
+ │ ├── _none.html.erb
571
+ │ ├── _none.xml.erb
464
572
  │ ├── _profile.adoc.erb
465
573
  │ ├── _profile.html.erb
466
574
  │ ├── _profile.md.erb
467
575
  │ ├── _profile.xml.erb
576
+ │ ├── _tag-insecure.html.erb
577
+ │ ├── _tag-secure.html.erb
468
578
  │ ├── _tag.adoc.erb
469
579
  │ ├── _tag.html.erb
470
580
  │ ├── _tag.md.erb
471
581
  │ ├── _tag.stream.erb
472
582
  │ ├── _tag.xml.erb
583
+ │ ├── _user.adoc.erb
584
+ │ ├── _user.html.erb
585
+ │ ├── _user.md.erb
586
+ │ ├── _user.xml.erb
587
+ │ ├── _users.adoc.erb
588
+ │ ├── _users.html.erb
589
+ │ ├── _users.xml.erb
473
590
  │ ├── show.adoc.erb
474
591
  │ ├── show.html.erb
475
592
  │ ├── show.md.erb
@@ -492,25 +609,29 @@ Milestoner searches your {runcom_link} configuration first and, if templates are
492
609
 
493
610
  Of all build formats supported, the web format is the most powerful and feature rich. The following showcases _some_ of the information rendered in this format based on commit activity.
494
611
 
495
- *With Basic Git Commit*
612
+ *Overview*
496
613
 
497
- image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-overview.png[Overview,width=1119,height=910,role=focal_point]
614
+ image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-overview.png[ASCII Doc,width=1157,height=843,role=focal_point]
498
615
 
499
- *With Collaborators and Signers*
616
+ *With Valid Commit Signature*
500
617
 
501
- image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-collaborators_and_signers.png[Collaborators and Signers,width=1118,height=1003,role=focal_point]
618
+ image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-commit_valid.png[ASCII Doc,width=1235,height=950,role=focal_point]
502
619
 
503
- *With Invalid Tag*
620
+ *With Invalid Commit Signature*
504
621
 
505
- image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-tag_invalid.png[Invalid Tag,width=1119,height=910,role=focal_point]
622
+ image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-commit_invalid.png[ASCII Doc,width=1235,height=950,role=focal_point]
506
623
 
507
624
  *With Valid Tag*
508
625
 
509
- image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-tag_valid.png[Valid Tag,width=1119,height=910,role=focal_point]
626
+ image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-tag_valid.png[ASCII Doc,width=1089,height=1084,role=focal_point]
627
+
628
+ *With Invalid Tag*
629
+
630
+ image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-tag_invalid.png[ASCII Doc,width=978,height=571,role=focal_point]
510
631
 
511
- *With Notes*
632
+ *With ASCII Doc/Markdown*
512
633
 
513
- image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-notes.png[Notes,width=1119,height=910,role=focal_point]
634
+ image:https://alchemists.io/images/projects/milestoner/screenshots/web_format-ascii_doc.png[ASCII Doc,width=908,height=1938,role=focal_point]
514
635
 
515
636
  💡 See {git_notes_link} to learn more.
516
637
 
@@ -8,7 +8,6 @@ module Milestoner
8
8
  # Builds syndicated feed output.
9
9
  class Feed
10
10
  include Milestoner::Import[:settings, :logger]
11
- include Dry::Monads[:result]
12
11
 
13
12
  using Refinements::Pathname
14
13
 
@@ -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
- process(values).bind { |user| log_info "Created: #{user.name.inspect}" }
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
- users.each { |user| io.puts user.to_h.values.join ", " }
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
- git.tags("--sort=taggerdate")
28
- .fmap { |tags| tail tags.last(settings.build_max).map(&:version) }
29
- .fmap { |references| slice(references).reverse }
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
- def initialize client: Asciidoctor
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
- def initialize client: Redcarpet::Markdown.new(Redcarpet::Render::HTML.new)
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
 
@@ -19,13 +19,22 @@ module Milestoner
19
19
 
20
20
  attr_reader :defaults, :client
21
21
 
22
- def configuration
23
- client::Config.merge defaults,
24
- elements: defaults[:elements].including("img", "video"),
25
- attributes: defaults[:attributes].merge(
26
- "img" => %w[alt class height id loading src width],
27
- "video" => %w[class controls height id poster src width]
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
@@ -21,7 +21,7 @@ module Milestoner
21
21
  end
22
22
 
23
23
  def call tags
24
- return Failure "No content." if tags.empty?
24
+ return Failure "No tags or commits." if tags.empty?
25
25
 
26
26
  Success build_feed(tags).to_s
27
27
  rescue NoMethodError, RSS::Error => error
@@ -1 +1 @@
1
- <% if name %>image:<%= url %>[<%= name %>,24,24]<% else %><%= render :icon, name: "missing", alt: "Unknown" %><% end %>
1
+ image:<%= user.avatar_url %>[<%= user.image_alt %>,24,24]