milestoner 19.0.0 → 19.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.adoc +97 -4
- data/lib/milestoner/builders/container.rb +1 -0
- data/lib/milestoner/builders/manifest.rb +41 -0
- data/lib/milestoner/builders/path_resolver.rb +1 -1
- data/lib/milestoner/builders/site/indexer.rb +1 -0
- data/lib/milestoner/builders/syndication/builder.rb +1 -1
- data/lib/milestoner/cli/actions/build/manifest.rb +24 -0
- data/lib/milestoner/cli/commands/build.rb +4 -3
- data/lib/milestoner/configuration/contract.rb +1 -0
- data/lib/milestoner/configuration/defaults.yml +1 -0
- data/lib/milestoner/configuration/model.rb +1 -0
- data/lib/milestoner/container.rb +1 -1
- data/lib/milestoner/durationer.rb +15 -8
- data/lib/milestoner/tags/manifest.rb +52 -0
- data/lib/milestoner/templates/layouts/page.html.erb +3 -3
- data/lib/milestoner/templates/milestones/index.adoc.erb +1 -1
- data/lib/milestoner/templates/milestones/index.html.erb +2 -2
- data/lib/milestoner/templates/milestones/index.md.erb +1 -1
- data/lib/milestoner/templates/milestones/show.adoc.erb +1 -1
- data/lib/milestoner/templates/milestones/show.html.erb +4 -4
- data/lib/milestoner/templates/milestones/show.md.erb +1 -1
- data/lib/milestoner/templates/public/page.css.erb +3 -0
- data/lib/milestoner/views/context.rb +9 -0
- data/milestoner.gemspec +3 -3
- data.tar.gz.sig +0 -0
- metadata +10 -7
- 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: 7d957f55958fe682de293955b8ae7d1762722654ab97323da41473e21a76c3b1
|
4
|
+
data.tar.gz: ed92635b6e20f6dbfb0ef8c43f11368bff7114aac753c8057753414e95e2e055
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f78eb0132c2c5ea28e8d456bbd438cc0536785d085234cbc55fb431f712df51387bfa72102b127929cee70aba359b6bc507a97241498382f02be1a930334cd9
|
7
|
+
data.tar.gz: da79e4b9aa49da378d9e037799a85c63c66d5b9c743e1e0854157d9e525416eee21b4f24f65310b493984157ec2c61464c71e00d95c55c18575604ec8354c337
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/README.adoc
CHANGED
@@ -37,7 +37,7 @@
|
|
37
37
|
|
38
38
|
= Milestoner
|
39
39
|
|
40
|
-
Milestoner is a pure {git_link} based Command Line Interface (CLI) for software deployment automation that is agnostic of the programming language or source control service you use (i.e. GitHub, GitLab, Bitbucket, etc). Each milestone (i.e. {git_link} tag) includes
|
40
|
+
Milestoner is a pure {git_link} based Command Line Interface (CLI) for software deployment automation that is agnostic of the programming language or source control service you use (i.e. GitHub, GitLab, Bitbucket, etc). Each milestone (i.e. {git_link} tag) includes automatic generation of feature rich release notes sourced from the {git_link} commits that make up the tag. Finally, each milestone adheres to {strict_semantic_versioning_link} so your milestones remain consistent.
|
41
41
|
|
42
42
|
You can use Milestoner to inspect the current state of the next milestone, celebrate the team members that contribute to each milestone, and share information with stakeholders with minimal effort. By having a tool, like Milestoner, you can automate software releases in a consistent and reliable fashion. 🎉
|
43
43
|
|
@@ -52,7 +52,7 @@ toc::[]
|
|
52
52
|
|
53
53
|
== Screenshots
|
54
54
|
|
55
|
-
The following are screenshots of using this gem to render release notes
|
55
|
+
The following are screenshots of using this gem to render it's own release notes. Keep in mind that Milestoner can be used for _any project and/or programming language_.
|
56
56
|
|
57
57
|
=== ASCII Doc
|
58
58
|
|
@@ -101,7 +101,7 @@ image:https://alchemists.io/images/projects/milestoner/screenshots/build-web-exp
|
|
101
101
|
** Format: `+<major>.<minor>.<patch>+`.
|
102
102
|
** Example: `0.0.0`.
|
103
103
|
* Defaults to including {git_link} commits since last tag (or initialization of repository) when building release notes. This can be customized further if desired.
|
104
|
-
* Ensures {git_link} commit messages are grouped by prefix, in order defined, for categorization. For
|
104
|
+
* Ensures {git_link} commit messages are grouped by prefix, in order defined, for categorization. For details, see link:https://alchemists.io/projects/git-lint/#_commit_subject_prefix[Git Lint Commit Subject Prefix]. These are the defaults (can be customized):
|
105
105
|
** image:https://alchemists.io/images/projects/milestoner/icons/added.png[Added] Added
|
106
106
|
** image:https://alchemists.io/images/projects/milestoner/icons/updated.png[Updated] Updated
|
107
107
|
** image:https://alchemists.io/images/projects/milestoner/icons/fixed.png[Fixed] Fixed
|
@@ -171,6 +171,7 @@ build:
|
|
171
171
|
format: "stream"
|
172
172
|
index: true
|
173
173
|
layout: "page"
|
174
|
+
manifest: false
|
174
175
|
max: 1
|
175
176
|
output: "tmp/milestones"
|
176
177
|
stylesheet: true
|
@@ -236,7 +237,8 @@ The above can be customized as follows:
|
|
236
237
|
** `basename`: Required. The build file basename. Default: `index`. Used to customize the built file name.
|
237
238
|
** `format`: Required. The build output format. Default: `stream`. Used to determine what format to build the release notes as. Multiple formats are supported.
|
238
239
|
** `index`: Required. Enables (or disables) building the versions index page for web format only. Default: true.
|
239
|
-
** `layout`: Required. The {hanami_views_link} layout used when building release notes. Default: page
|
240
|
+
** `layout`: Required. The {hanami_views_link} layout used when building release notes. Default: `page`. This can be disabled when using `false` or customized further -- via your own {xdg_link} configuration -- when providing your own templates and/or partials.
|
241
|
+
** `manifest`: Required. The JSON manifest of milestones built. Handy for when you've built/cached previous milestones and want a quick way to check for differences (if any). Default: `false`.
|
240
242
|
** `max`: Required. The maximum number of {git_link} tags to build. Default: 1. By default, you are limited to building release notes for changes (commits) since the last tag but you can increase the maximum to build release notes for as many tags as you like.
|
241
243
|
** `output`: Required. The the directory for all generated output. Default: `tmp/milestones`. This can be a relative or absolute path and defaults to the current working directory. The path is automatically created if missing.
|
242
244
|
** `stylesheet`: Required. Enables (or disables) building the stylesheet for web format only. Default: true.
|
@@ -548,6 +550,97 @@ Milestone: patch
|
|
548
550
|
|
549
551
|
Given the above, the resulting version would be: 2.0.0. This is because the highest milestone was a _major_ milestone.
|
550
552
|
|
553
|
+
==== Manifest
|
554
|
+
|
555
|
+
When the manifest is enabled via the global/local {xdg_link} configuration or via the CLI, then a `manifest.json` file will be created for you in the root of your build output folder with contents similar to the following:
|
556
|
+
|
557
|
+
[source,json]
|
558
|
+
----
|
559
|
+
{
|
560
|
+
"generator": {
|
561
|
+
"label": "Milestoner",
|
562
|
+
"version": "19.0.0"
|
563
|
+
},
|
564
|
+
"latest": "1.0.0",
|
565
|
+
"versions": [
|
566
|
+
"0.0.1",
|
567
|
+
"0.1.0",
|
568
|
+
"1.0.0"
|
569
|
+
]
|
570
|
+
}
|
571
|
+
----
|
572
|
+
|
573
|
+
The above breaks down as follows:
|
574
|
+
|
575
|
+
* `generator`: Captures generator details at time of manifest creation.
|
576
|
+
* `latest`: The most recent version built.
|
577
|
+
* `versions`: The array of versions built based on max build settings.
|
578
|
+
|
579
|
+
The manifest allows you to capture build details which can be useful when needing to compare differences between a previous and current build. For convience, you can use the `Milestoner::Tags::Manifest` class to manage manifests. Example:
|
580
|
+
|
581
|
+
[source,ruby]
|
582
|
+
----
|
583
|
+
manifest = Milestoner::Tags::Manifest.new
|
584
|
+
latest_path = Pathname "$HOME/Engineering/OSS/demo/tmp/milestones/latest.json"
|
585
|
+
|
586
|
+
manifest.write generator: {label: "Milestoner", version: "19.0.0"},
|
587
|
+
latest: "0.0.1",
|
588
|
+
versions: %w[0.0.0 0.0.1]
|
589
|
+
# $HOME/Engineering/OSS/demo/tmp/milestones/manifest.json
|
590
|
+
|
591
|
+
manifest.write latest_path,
|
592
|
+
generator: {label: "Milestoner", version: "19.0.0"},
|
593
|
+
latest: "0.0.2",
|
594
|
+
versions: %w[0.0.0 0.0.1 0.0.2]
|
595
|
+
# $HOME/Engineering/OSS/demo/tmp/milestones/latest.json
|
596
|
+
|
597
|
+
manifest.read
|
598
|
+
# {
|
599
|
+
# :generator => {
|
600
|
+
# :label => "Milestoner",
|
601
|
+
# :version => "19.0.0"
|
602
|
+
# },
|
603
|
+
# :latest => "0.0.1",
|
604
|
+
# :versions => [
|
605
|
+
# "0.0.0",
|
606
|
+
# "0.0.1"
|
607
|
+
# ]
|
608
|
+
# }
|
609
|
+
|
610
|
+
manifest.read latest_path
|
611
|
+
# {
|
612
|
+
# :generator => {
|
613
|
+
# :label => "Milestoner",
|
614
|
+
# :version => "19.0.0"
|
615
|
+
# },
|
616
|
+
# :latest => "0.0.2",
|
617
|
+
# :versions => [
|
618
|
+
# "0.0.0",
|
619
|
+
# "0.0.1",
|
620
|
+
# "0.0.2"
|
621
|
+
# ]
|
622
|
+
# }
|
623
|
+
|
624
|
+
manifest.diff latest_path
|
625
|
+
# {
|
626
|
+
# :latest => [
|
627
|
+
# "0.0.2",
|
628
|
+
# "0.0.1"
|
629
|
+
# ],
|
630
|
+
# :versions => [
|
631
|
+
# [
|
632
|
+
# "0.0.0",
|
633
|
+
# "0.0.1",
|
634
|
+
# "0.0.2"
|
635
|
+
# ],
|
636
|
+
# [
|
637
|
+
# "0.0.0",
|
638
|
+
# "0.0.1"
|
639
|
+
# ]
|
640
|
+
# ]
|
641
|
+
# }
|
642
|
+
----
|
643
|
+
|
551
644
|
==== Templates
|
552
645
|
|
553
646
|
Template functionality is powered by {hanami_views_link} which means you can completely customize _all_ build formats, templates, partials, stylesheets, images, and much more.
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/monads"
|
4
|
+
|
5
|
+
module Milestoner
|
6
|
+
module Builders
|
7
|
+
# Builds JSON manifest.
|
8
|
+
class Manifest
|
9
|
+
include Dry::Monads[:result]
|
10
|
+
include Milestoner::Dependencies[:settings, :git, :logger]
|
11
|
+
|
12
|
+
def initialize(writer: Tags::Manifest.new, path_resolver: PathResolver, **)
|
13
|
+
super(**)
|
14
|
+
@writer = writer
|
15
|
+
@path_resolver = path_resolver
|
16
|
+
end
|
17
|
+
|
18
|
+
def call
|
19
|
+
return Success writer.build_path unless settings.build_manifest
|
20
|
+
|
21
|
+
git.tags.either -> tags { write tags }, -> message { failure message }
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :writer, :path_resolver
|
27
|
+
|
28
|
+
def write tags
|
29
|
+
path_resolver.call writer.build_path, logger: do
|
30
|
+
versions = tags.map(&:version)
|
31
|
+
writer.write latest: versions.last, versions:
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def failure message
|
36
|
+
logger.error { message }
|
37
|
+
Failure message
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -103,7 +103,7 @@ module Milestoner
|
|
103
103
|
|
104
104
|
node.merge id: format(settings.syndication_id, id: version),
|
105
105
|
title: format(settings.syndication_entry_label, id: version),
|
106
|
-
link: format(settings.syndication_entry_uri, id: version),
|
106
|
+
link: format(settings.syndication_entry_uri, id: "#{version}/"),
|
107
107
|
rights: committed_at.strftime("%Y"),
|
108
108
|
published: committed_at,
|
109
109
|
updated: committed_at
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "sod"
|
4
|
+
|
5
|
+
module Milestoner
|
6
|
+
module CLI
|
7
|
+
module Actions
|
8
|
+
module Build
|
9
|
+
# Handles build manifest.
|
10
|
+
class Manifest < Sod::Action
|
11
|
+
include Dependencies[:settings]
|
12
|
+
|
13
|
+
description "Enable/disable manifest."
|
14
|
+
|
15
|
+
on "--[no-]manifest"
|
16
|
+
|
17
|
+
default { Container[:settings].build_manifest }
|
18
|
+
|
19
|
+
def call(boolean) = settings.build_manifest = boolean
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -8,7 +8,7 @@ module Milestoner
|
|
8
8
|
# Handles the building of different milestone formats.
|
9
9
|
class Build < Sod::Command
|
10
10
|
include Dependencies[:settings, :logger, :io]
|
11
|
-
include Builders::Dependencies[:ascii_doc, :feed, :markdown, :stream, :web]
|
11
|
+
include Builders::Dependencies[:ascii_doc, :feed, :manifest, :markdown, :stream, :web]
|
12
12
|
|
13
13
|
handle "build"
|
14
14
|
|
@@ -19,6 +19,7 @@ module Milestoner
|
|
19
19
|
on Actions::Build::Index
|
20
20
|
on Actions::Build::Label
|
21
21
|
on Actions::Build::Layout
|
22
|
+
on Actions::Build::Manifest
|
22
23
|
on Actions::Build::Max
|
23
24
|
on Actions::Build::Output
|
24
25
|
on Actions::Build::Stylesheet
|
@@ -35,12 +36,12 @@ module Milestoner
|
|
35
36
|
else
|
36
37
|
logger.abort "Invalid build format: #{format}."
|
37
38
|
end
|
39
|
+
|
40
|
+
manifest.call
|
38
41
|
end
|
39
42
|
|
40
43
|
private
|
41
44
|
|
42
|
-
attr_reader :view, :enricher
|
43
|
-
|
44
45
|
def log_info(message) = logger.info { message }
|
45
46
|
end
|
46
47
|
end
|
@@ -14,6 +14,7 @@ module Milestoner
|
|
14
14
|
required(:build_index).filled :bool
|
15
15
|
required(:build_layout) { str? | bool? }
|
16
16
|
required(:build_max).filled :integer
|
17
|
+
required(:build_manifest).filled :bool
|
17
18
|
required(:build_output).filled Etcher::Types::Pathname
|
18
19
|
required(:build_stylesheet).filled :bool
|
19
20
|
required(:build_tail).filled :string
|
data/lib/milestoner/container.rb
CHANGED
@@ -28,7 +28,7 @@ module Milestoner
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
register :registry do
|
31
|
+
register :registry, as: :fresh do
|
32
32
|
Etcher::Registry.new(contract: Configuration::Contract, model: Configuration::Model)
|
33
33
|
.add_loader(:yaml, self[:defaults_path])
|
34
34
|
.add_loader(:yaml, self["xdg.config"].active)
|
@@ -3,23 +3,30 @@
|
|
3
3
|
require "refinements/array"
|
4
4
|
require "refinements/string"
|
5
5
|
|
6
|
-
# Computes duration (in seconds) into human readable days, hours, minutes, and seconds.
|
6
|
+
# Computes duration (in seconds) into human readable years, days, hours, minutes, and seconds.
|
7
7
|
module Milestoner
|
8
8
|
using Refinements::Array
|
9
9
|
using Refinements::String
|
10
10
|
|
11
|
-
DURATION_UNITS = {
|
11
|
+
DURATION_UNITS = {
|
12
|
+
"year" => 31_536_000, # 60 * 60 * 25 * 365
|
13
|
+
"day" => 86_400, # 60 * 60 * 25
|
14
|
+
"hour" => 3_600, # 60 * 60
|
15
|
+
"minute" => 60,
|
16
|
+
"second" => 1
|
17
|
+
}.freeze
|
12
18
|
|
13
19
|
Durationer = lambda do |seconds, units: DURATION_UNITS|
|
14
|
-
|
15
|
-
next unless seconds.positive?
|
20
|
+
return "0 seconds" if seconds.negative? || seconds.zero?
|
16
21
|
|
17
|
-
|
18
|
-
|
22
|
+
result = units.map do |unit, divisor|
|
23
|
+
count, seconds = seconds.divmod divisor
|
19
24
|
|
20
|
-
|
25
|
+
next if count.zero?
|
26
|
+
|
27
|
+
%(#{count} #{unit.pluralize "s", count})
|
21
28
|
end
|
22
29
|
|
23
|
-
result.compact.
|
30
|
+
result.compact.to_sentence
|
24
31
|
end
|
25
32
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "core"
|
4
|
+
require "json"
|
5
|
+
require "refinements/hash"
|
6
|
+
require "refinements/pathname"
|
7
|
+
|
8
|
+
module Milestoner
|
9
|
+
module Tags
|
10
|
+
# Manages build manifest.
|
11
|
+
class Manifest
|
12
|
+
include Dependencies[:settings, :git]
|
13
|
+
|
14
|
+
using Refinements::Hash
|
15
|
+
using Refinements::Pathname
|
16
|
+
|
17
|
+
def initialize(name: "manifest.json", **)
|
18
|
+
super(**)
|
19
|
+
@name = name
|
20
|
+
end
|
21
|
+
|
22
|
+
def build_path = settings.build_output.join name
|
23
|
+
|
24
|
+
def diff path = build_path
|
25
|
+
git.tags.value_or(Core::EMPTY_ARRAY).then do |tags|
|
26
|
+
return Core::EMPTY_HASH if tags.empty?
|
27
|
+
|
28
|
+
content_for(tags).diff read(path)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def read(path = build_path) = JSON(path.read, {symbolize_names: true})
|
33
|
+
|
34
|
+
def write(path = build_path, **)
|
35
|
+
path.make_ancestors.write JSON.pretty_generate(generator.deep_merge(**))
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
attr_reader :name
|
41
|
+
|
42
|
+
# :reek:FeatureEnvy
|
43
|
+
def content_for tags
|
44
|
+
generator.merge latest: tags.last.version, versions: tags.map(&:version)
|
45
|
+
end
|
46
|
+
|
47
|
+
def generator
|
48
|
+
{generator: {label: settings.generator_label, version: settings.generator_version.to_s}}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
<html lang="en">
|
4
4
|
<head>
|
5
|
-
<title><%=
|
5
|
+
<title><%= page_title %></title>
|
6
6
|
|
7
7
|
<meta charset="utf-8">
|
8
8
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
@@ -30,8 +30,8 @@
|
|
30
30
|
href="<%= stylesheet_uri %>.css"
|
31
31
|
type="text/css">
|
32
32
|
|
33
|
-
<script src="https://unpkg.com/alpinejs@3.14.
|
34
|
-
integrity="sha384-
|
33
|
+
<script src="https://unpkg.com/alpinejs@3.14.8"
|
34
|
+
integrity="sha384-X9kJyAubVxnP0hcA+AMMs21U445qsnqhnUF8EBlEpP3a42Kh/JwWjlv2ZcvGfphb"
|
35
35
|
crossorigin="anonymous"
|
36
36
|
defer>
|
37
37
|
</script>
|
@@ -9,5 +9,5 @@ All versions adhere to the link:https://alchemists.io/articles/strict_semantic_v
|
|
9
9
|
=== History
|
10
10
|
|
11
11
|
<% tags.each do |tag| %>
|
12
|
-
* link
|
12
|
+
* link:/<%= tag.version %>/[<%= tag.version %>] (<%= tag.committed_date %>)
|
13
13
|
<% end %>
|
@@ -14,9 +14,9 @@
|
|
14
14
|
<ul class="list">
|
15
15
|
<% tags.each do |tag| %>
|
16
16
|
<li class="item">
|
17
|
-
<a href="
|
17
|
+
<a href="/<%= tag.version %>/"
|
18
18
|
class="version"
|
19
|
-
hx-get="
|
19
|
+
hx-get="/<%= tag.version %>/"
|
20
20
|
hx-select=".milestone"
|
21
21
|
hx-target=".milestones"
|
22
22
|
hx-swap="outerHTML"
|
@@ -9,5 +9,5 @@ All versions adhere to the [Strict Semantic Versioning](https://alchemists.io/ar
|
|
9
9
|
## History
|
10
10
|
|
11
11
|
<% tags.each do |tag| %>
|
12
|
-
- [<%= tag.version %>](
|
12
|
+
- [<%= tag.version %>](/<%= tag.version %>/) (<%= tag.committed_date %>)
|
13
13
|
<% end %>
|
@@ -13,5 +13,5 @@
|
|
13
13
|
*<%= tag.total_commits %>. <%= tag.total_files %>. <%= tag.total_deletions %>. <%= tag.total_insertions %>.* +
|
14
14
|
*<%= tag.total_duration %>.*
|
15
15
|
|
16
|
-
link:<%= past.version
|
16
|
+
link:<%= past.version %>/[Previous (<%= past.version %>)] | link:<%= future.version %>/[Next (<%= future.version %>)]
|
17
17
|
<% end %>
|
@@ -72,10 +72,10 @@
|
|
72
72
|
|
73
73
|
<ul class="actions">
|
74
74
|
<li>
|
75
|
-
<a href="/<%= past.version
|
75
|
+
<a href="/<%= past.version %>/"
|
76
76
|
class="action"
|
77
77
|
data-direction="previous"
|
78
|
-
hx-get="/<%= past.version
|
78
|
+
hx-get="/<%= past.version %>/"
|
79
79
|
hx-select=".milestone"
|
80
80
|
hx-trigger="click, keyup[key=='ArrowLeft'] from:body"
|
81
81
|
hx-target=".milestone"
|
@@ -101,10 +101,10 @@
|
|
101
101
|
</li>
|
102
102
|
|
103
103
|
<li>
|
104
|
-
<a href="/<%= future.version
|
104
|
+
<a href="/<%= future.version %>/"
|
105
105
|
class="action"
|
106
106
|
data-direction="next"
|
107
|
-
hx-get="/<%= future.version
|
107
|
+
hx-get="/<%= future.version %>/"
|
108
108
|
hx-select=".milestone"
|
109
109
|
hx-trigger="click, keyup[key=='ArrowRight'] from:body"
|
110
110
|
hx-target=".milestone"
|
@@ -12,5 +12,5 @@
|
|
12
12
|
**<%= tag.total_commits %>. <%= tag.total_files %>. <%= tag.total_deletions %>. <%= tag.total_insertions %>.**
|
13
13
|
**<%= tag.total_duration %>.**
|
14
14
|
|
15
|
-
[Previous (<%= past.version %>)](<%= past.version
|
15
|
+
[Previous (<%= past.version %>)](<%= past.version %>/) | [Next (<%= future.version %>)](<%= future.version %>/)
|
16
16
|
<% end %>
|
@@ -621,6 +621,7 @@
|
|
621
621
|
}
|
622
622
|
|
623
623
|
.owner {
|
624
|
+
align-items: center;
|
624
625
|
display: flex;
|
625
626
|
gap: 0.5rem;
|
626
627
|
justify-content: center;
|
@@ -646,6 +647,7 @@
|
|
646
647
|
|
647
648
|
.summary {
|
648
649
|
align-items: center;
|
650
|
+
border-radius: 0.5rem;
|
649
651
|
display: grid;
|
650
652
|
gap: 0 1rem;
|
651
653
|
grid-template: 1fr / auto 5fr 1fr 1fr 1fr 1fr 1fr;
|
@@ -832,6 +834,7 @@
|
|
832
834
|
}
|
833
835
|
|
834
836
|
.line {
|
837
|
+
align-items: center;
|
835
838
|
align-self: start;
|
836
839
|
display: flex;
|
837
840
|
gap: 0.5rem;
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require "core"
|
4
4
|
require "forwardable"
|
5
5
|
require "hanami/view"
|
6
|
+
require "refinements/array"
|
6
7
|
|
7
8
|
module Milestoner
|
8
9
|
module Views
|
@@ -12,11 +13,15 @@ module Milestoner
|
|
12
13
|
|
13
14
|
include Dependencies[:settings]
|
14
15
|
|
16
|
+
using Refinements::Array
|
17
|
+
|
15
18
|
delegate %i[
|
16
19
|
build_stylesheet
|
17
20
|
generator_label
|
18
21
|
generator_uri
|
19
22
|
generator_version
|
23
|
+
organization_label
|
24
|
+
organization_uri
|
20
25
|
project_author
|
21
26
|
project_description
|
22
27
|
project_label
|
@@ -29,6 +34,10 @@ module Milestoner
|
|
29
34
|
stylesheet_uri
|
30
35
|
] => :settings
|
31
36
|
|
37
|
+
def page_title delimiter: " | "
|
38
|
+
[project_title, organization_label].compress.join delimiter
|
39
|
+
end
|
40
|
+
|
32
41
|
def project_slug
|
33
42
|
[project_name, project_version].compact.join("_").tr ".", Core::EMPTY_STRING
|
34
43
|
end
|
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 = "19.
|
5
|
+
spec.version = "19.2.0"
|
6
6
|
spec.authors = ["Brooke Kuhlmann"]
|
7
7
|
spec.email = ["brooke@alchemists.io"]
|
8
8
|
spec.homepage = "https://alchemists.io/projects/milestoner"
|
@@ -26,12 +26,12 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_dependency "asciidoctor", "~> 2.0"
|
27
27
|
spec.add_dependency "cff", "~> 1.3"
|
28
28
|
spec.add_dependency "cogger", "~> 1.0"
|
29
|
-
spec.add_dependency "containable", "~> 1.
|
29
|
+
spec.add_dependency "containable", "~> 1.1"
|
30
30
|
spec.add_dependency "core", "~> 2.0"
|
31
31
|
spec.add_dependency "dry-monads", "~> 1.6"
|
32
32
|
spec.add_dependency "dry-schema", "~> 1.13"
|
33
33
|
spec.add_dependency "etcher", "~> 3.0"
|
34
|
-
spec.add_dependency "gitt", "~> 4.
|
34
|
+
spec.add_dependency "gitt", "~> 4.1"
|
35
35
|
spec.add_dependency "hanami-view", "~> 2.2"
|
36
36
|
spec.add_dependency "infusible", "~> 4.0"
|
37
37
|
spec.add_dependency "lode", "~> 2.0"
|
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: 19.
|
4
|
+
version: 19.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
34
34
|
3n5C8/6Zh9DYTkpcwPSuIfAga6wf4nXc9m6JAw8AuMLaiWN/r/2s4zJsUHYERJEu
|
35
35
|
gZGm4JqtuSg8pYjPeIJxS960owq+SfuC+jxqmRA54BisFCv/0VOJi7tiJVY=
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date:
|
37
|
+
date: 2025-02-06 00:00:00.000000000 Z
|
38
38
|
dependencies:
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: asciidoctor
|
@@ -84,14 +84,14 @@ dependencies:
|
|
84
84
|
requirements:
|
85
85
|
- - "~>"
|
86
86
|
- !ruby/object:Gem::Version
|
87
|
-
version: '1.
|
87
|
+
version: '1.1'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
92
|
- - "~>"
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version: '1.
|
94
|
+
version: '1.1'
|
95
95
|
- !ruby/object:Gem::Dependency
|
96
96
|
name: core
|
97
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,14 +154,14 @@ dependencies:
|
|
154
154
|
requirements:
|
155
155
|
- - "~>"
|
156
156
|
- !ruby/object:Gem::Version
|
157
|
-
version: '4.
|
157
|
+
version: '4.1'
|
158
158
|
type: :runtime
|
159
159
|
prerelease: false
|
160
160
|
version_requirements: !ruby/object:Gem::Requirement
|
161
161
|
requirements:
|
162
162
|
- - "~>"
|
163
163
|
- !ruby/object:Gem::Version
|
164
|
-
version: '4.
|
164
|
+
version: '4.1'
|
165
165
|
- !ruby/object:Gem::Dependency
|
166
166
|
name: hanami-view
|
167
167
|
requirement: !ruby/object:Gem::Requirement
|
@@ -379,6 +379,7 @@ files:
|
|
379
379
|
- lib/milestoner/builders/container.rb
|
380
380
|
- lib/milestoner/builders/dependencies.rb
|
381
381
|
- lib/milestoner/builders/feed.rb
|
382
|
+
- lib/milestoner/builders/manifest.rb
|
382
383
|
- lib/milestoner/builders/markdown.rb
|
383
384
|
- lib/milestoner/builders/md/container.rb
|
384
385
|
- lib/milestoner/builders/md/dependencies.rb
|
@@ -401,6 +402,7 @@ files:
|
|
401
402
|
- lib/milestoner/cli/actions/build/index.rb
|
402
403
|
- lib/milestoner/cli/actions/build/label.rb
|
403
404
|
- lib/milestoner/cli/actions/build/layout.rb
|
405
|
+
- lib/milestoner/cli/actions/build/manifest.rb
|
404
406
|
- lib/milestoner/cli/actions/build/max.rb
|
405
407
|
- lib/milestoner/cli/actions/build/output.rb
|
406
408
|
- lib/milestoner/cli/actions/build/stylesheet.rb
|
@@ -464,6 +466,7 @@ files:
|
|
464
466
|
- lib/milestoner/tags/builder.rb
|
465
467
|
- lib/milestoner/tags/creator.rb
|
466
468
|
- lib/milestoner/tags/enricher.rb
|
469
|
+
- lib/milestoner/tags/manifest.rb
|
467
470
|
- lib/milestoner/tags/publisher.rb
|
468
471
|
- lib/milestoner/tags/pusher.rb
|
469
472
|
- lib/milestoner/templates/layouts/page.adoc.erb
|
@@ -552,7 +555,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
552
555
|
- !ruby/object:Gem::Version
|
553
556
|
version: '0'
|
554
557
|
requirements: []
|
555
|
-
rubygems_version: 3.6.
|
558
|
+
rubygems_version: 3.6.3
|
556
559
|
specification_version: 4
|
557
560
|
summary: A command line interface for automated Git repository milestones.
|
558
561
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|