milestoner 17.6.0 → 17.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.adoc +5 -5
  4. data/lib/milestoner/builders/ascii_doc.rb +2 -0
  5. data/lib/milestoner/builders/markdown.rb +2 -0
  6. data/lib/milestoner/builders/stream.rb +2 -0
  7. data/lib/milestoner/builders/web.rb +2 -0
  8. data/lib/milestoner/cli/actions/build/label.rb +0 -2
  9. data/lib/milestoner/cli/actions/build/root.rb +0 -1
  10. data/lib/milestoner/cli/actions/build/version.rb +0 -2
  11. data/lib/milestoner/cli/actions/cache/create.rb +1 -1
  12. data/lib/milestoner/cli/actions/cache/delete.rb +1 -1
  13. data/lib/milestoner/cli/actions/cache/find.rb +1 -1
  14. data/lib/milestoner/cli/actions/cache/list.rb +1 -1
  15. data/lib/milestoner/cli/actions/publish.rb +0 -2
  16. data/lib/milestoner/cli/commands/build.rb +0 -3
  17. data/lib/milestoner/cli/commands/cache.rb +0 -3
  18. data/lib/milestoner/commits/categorizer.rb +24 -23
  19. data/lib/milestoner/commits/collector.rb +15 -3
  20. data/lib/milestoner/commits/enricher.rb +3 -5
  21. data/lib/milestoner/commits/enrichers/author.rb +1 -1
  22. data/lib/milestoner/commits/enrichers/colleague.rb +1 -1
  23. data/lib/milestoner/commits/versioner.rb +2 -1
  24. data/lib/milestoner/configuration/contract.rb +1 -0
  25. data/lib/milestoner/configuration/model.rb +1 -0
  26. data/lib/milestoner/configuration/transformers/build/root.rb +3 -3
  27. data/lib/milestoner/configuration/transformers/build/template_paths.rb +1 -1
  28. data/lib/milestoner/configuration/transformers/citations/description.rb +4 -4
  29. data/lib/milestoner/configuration/transformers/citations/label.rb +4 -4
  30. data/lib/milestoner/configuration/transformers/gems/description.rb +3 -4
  31. data/lib/milestoner/configuration/transformers/gems/label.rb +4 -5
  32. data/lib/milestoner/configuration/transformers/gems/name.rb +3 -4
  33. data/lib/milestoner/configuration/transformers/gems/uri.rb +4 -5
  34. data/lib/milestoner/configuration/transformers/generator/label.rb +3 -3
  35. data/lib/milestoner/configuration/transformers/generator/uri.rb +3 -3
  36. data/lib/milestoner/configuration/transformers/generator/version.rb +3 -3
  37. data/lib/milestoner/configuration/transformers/project/author.rb +3 -3
  38. data/lib/milestoner/configuration/transformers/project/generator.rb +2 -2
  39. data/lib/milestoner/configuration/transformers/project/label.rb +3 -3
  40. data/lib/milestoner/configuration/transformers/project/name.rb +3 -3
  41. data/lib/milestoner/configuration/transformers/project/version.rb +3 -3
  42. data/lib/milestoner/configuration/transformers/uri/avatar.rb +5 -6
  43. data/lib/milestoner/configuration/transformers/uri/commit.rb +8 -9
  44. data/lib/milestoner/configuration/transformers/uri/profile.rb +5 -6
  45. data/lib/milestoner/configuration/transformers/uri/review.rb +8 -9
  46. data/lib/milestoner/configuration/transformers/uri/tracker.rb +8 -9
  47. data/lib/milestoner/container.rb +1 -0
  48. data/lib/milestoner/tags/creator.rb +5 -2
  49. data/lib/milestoner/views/context.rb +4 -1
  50. data/lib/milestoner/views/milestones/show.rb +0 -1
  51. data/lib/milestoner/views/parts/commit.rb +1 -2
  52. data/milestoner.gemspec +5 -4
  53. data.tar.gz.sig +0 -0
  54. metadata +22 -8
  55. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73e28707596b9a5a610632108ac373ae2984e1633a60d35cb9872feb8a74de3e
4
- data.tar.gz: 2d33c22077971f71e777940357c03c2b718c459d5afee825eda5e63bd8b487c6
3
+ metadata.gz: db830f8b4d06e54aba148ef3b9137dde5bdfbe53880269b02ac81ab67ffb6b31
4
+ data.tar.gz: 1e94ce0158f88ab0c58662d7f63d70c2f48460467ccb313071c7192f040e79ca
5
5
  SHA512:
6
- metadata.gz: a576d44498a17dfa4e970f08d7a5d3daa2d4e74d63947eadf7d2ba217e22a5b3b6128156d8358116741582c04689ea1039c379f28b794df43b11dd44fade2691
7
- data.tar.gz: 50e1485b233665729c633bec2be2a3301772b136abe9dba8098a6e3734354048938f4ea835d8db99ff4c82af5d733b78621a7e768191a08420bd35d7e69e79ef
6
+ metadata.gz: d5793c46062eaf6d98fa0c73b1462cb36eb31e84729fd2bdda90bad660057014952d072abe2196a384c42213e77e3a4f6fac45914749eb7fed5f2270024e3f92
7
+ data.tar.gz: eab9b9e88db0696031cb823e650b8f325731b0b62ce0e269dfe07dda538002693186466df13824d8af2c062c26ceb1617167cd614809761c99f41501be159605
checksums.yaml.gz.sig CHANGED
Binary file
data/README.adoc CHANGED
@@ -11,7 +11,7 @@
11
11
  :git_link: link:https://git-scm.com[Git]
12
12
  :git_lint_link: link:https://alchemists.io/projects/git-lint[Git Lint]
13
13
  :hanami_link: link:https://hanamirb.org[Hanami]
14
- :hanami_views_link: link:https://alchemists.io/articles/hanami_views[Hanami View]
14
+ :hanami_views_link: link:https://alchemists.io/articles/hanami_views[Hanami Views]
15
15
  :hanamismith_link: link:https://alchemists.io/projects/hanamismith[Hanamismith]
16
16
  :lode_link: link:https://alchemists.io/projects/lode[Lode]
17
17
  :markdown_link: link:https://daringfireball.net/projects/markdown[Markdown]
@@ -73,7 +73,7 @@ image:https://alchemists.io/images/projects/milestoner/screenshots/build-web-exp
73
73
  ** image:https://alchemists.io/images/projects/milestoner/icons/commits/refactored.png[Refactored] Refactored
74
74
  * Ensures {git_link} commit messages are alphabetically sorted for release note categorization and readability.
75
75
  * Provides automatic versioning based on last {git_link} tag and current commit trailers. See {git_commit_anatomy_link} for details.
76
- * Supports multiple release note build formats: {ascii_doc_link}, {markdown_link}, Stream (console), and Web (HTML). Each are fully customizable via your personal {xdg_link} configuration and {hanami_views_link} templates.
76
+ * Supports multiple release note build formats: {ascii_doc_link}, {markdown_link}, Stream (console), and Web (HTML). Each are fully customizable via your personal {xdg_link} configuration and {hanami_views_link}.
77
77
 
78
78
  == Requirements
79
79
 
@@ -174,7 +174,7 @@ The above can be customized as follows:
174
174
  ** `uri`: Required. The URI format for linking to avatars as formatted using {string_formats_link}. Default: GitHub. The `id` is dynamically calculated via the `external_id` of the user stored in the {lode_link} cache.
175
175
  * `build`: Manages release note builds.
176
176
  ** `format`: Required. The build output format. Multiple formats are supported. Default: web.
177
- ** `layout`: Required. The layout used by the {hanami_views_link} gem when building release notes. Default: page.
177
+ ** `layout`: Required. The layout used by {hanami_views_link} when building release notes. Default: page.
178
178
  ** `root`: Required. The output location. This can be a relative or absolute path. Defaults to the `tmp` directory of your current project. The path is automatically created if missing.
179
179
  * `commit`: Manages commit categories, emojis, and hyperlinks.
180
180
  ** `categories`: Required. By default, only five categories are supported which pairs well with the {git_lint_link} gem. Category order is important with the first taking precedence over the second and so forth. Special characters are allowed for prefixes but should be enclosed in quotes. To disable categories, use an empty array. Example: `categories: []`.
@@ -339,7 +339,7 @@ Given the above, the resulting version would be: 2.0.0. This is because the high
339
339
 
340
340
  ==== Templates
341
341
 
342
- Build template functionality is powered by the {hanami_views_link} gem which means you can customize the HTML structure, CSS style, and more. The quickest way to get started is to copy the `templates` folder structure -- included with this gem -- to your preferred {runcom_link} configuration. For example, this gem's template structure is:
342
+ Build template functionality is powered by {hanami_views_link} which means you can customize the HTML structure, CSS style, and more. The quickest way to get started is to copy the `templates` folder structure -- included with this gem -- to your preferred {runcom_link} configuration. For example, this gem's template structure is:
343
343
 
344
344
  ....
345
345
  lib/milestoner/templates
@@ -371,7 +371,7 @@ This means you could, for example, copy all of this gem's templates to your own
371
371
  cp -r <milestoner_gem_root>/lib/milestoner/templates $HOME/.config/milestoner/templates
372
372
  ----
373
373
 
374
- Milestoner searches your {runcom_link} configuration first and, if templates are detected, will be used instead. Otherwise, Milestoner will fall back to it's own templates. Once {runcom_link} has calculated all possible template locations, {hanami_views_link} handles the final loading and evaluation of your templates.
374
+ Milestoner searches your {runcom_link} configuration first and, if templates are detected, will be used instead. Otherwise, Milestoner falls back to it's own templates. Once {runcom_link} has calculated all possible template locations, {hanami_views_link} handle the final loading and evaluation of your templates.
375
375
 
376
376
  ==== Web Format
377
377
 
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "refinements/pathname"
4
+
3
5
  module Milestoner
4
6
  module Builders
5
7
  # Builds Markdown page output.
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "refinements/pathname"
4
+
3
5
  module Milestoner
4
6
  module Builders
5
7
  # Builds Markdown page output.
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "refinements/pathname"
4
+
3
5
  module Milestoner
4
6
  module Builders
5
7
  # Builds I/O stream output.
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "refinements/pathname"
4
+
3
5
  module Milestoner
4
6
  module Builders
5
7
  # Builds web page output (i.e. HTML and CSS).
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pathname"
4
3
  require "sod"
5
- require "spek"
6
4
 
7
5
  module Milestoner
8
6
  module CLI
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pathname"
4
3
  require "sod"
5
4
 
6
5
  module Milestoner
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pathname"
4
3
  require "sod"
5
- require "spek"
6
4
  require "versionaire"
7
5
 
8
6
  module Milestoner
@@ -24,7 +24,7 @@ module Milestoner
24
24
 
25
25
  def process values
26
26
  external_id, handle, name = values.split ","
27
- client.commit(:users) { upsert({external_id:, handle:, name:}) }
27
+ client.write(:users) { upsert({external_id:, handle:, name:}) }
28
28
  end
29
29
 
30
30
  def log_info(message) = logger.info { message }
@@ -15,7 +15,7 @@ module Milestoner
15
15
  on %w[-d --delete], argument: "NAME"
16
16
 
17
17
  def call name
18
- client.commit(:users) { delete name }
18
+ client.write(:users) { delete name }
19
19
  .either(method(:success), method(:failure))
20
20
  end
21
21
 
@@ -15,7 +15,7 @@ module Milestoner
15
15
  on %w[-f --find], argument: "NAME"
16
16
 
17
17
  def call name
18
- client.commit(:users) { find name }
18
+ client.read(:users) { find name }
19
19
  .either(method(:success), method(:failure))
20
20
  end
21
21
 
@@ -16,7 +16,7 @@ module Milestoner
16
16
 
17
17
  def call(*)
18
18
  logger.info { "Listing users..." }
19
- client.commit(:users, &:all).bind { |users| print users }
19
+ client.read(:users, &:all).bind { |users| print users }
20
20
  end
21
21
 
22
22
  private
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "refinements/struct"
4
3
  require "sod"
5
4
  require "versionaire"
6
5
 
@@ -11,7 +10,6 @@ module Milestoner
11
10
  class Publish < Sod::Action
12
11
  include Import[:configuration]
13
12
 
14
- using Refinements::Struct
15
13
  using Versionaire::Cast
16
14
 
17
15
  description "Publish milestone."
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "refinements/pathname"
4
3
  require "sod"
5
4
 
6
5
  module Milestoner
@@ -11,8 +10,6 @@ module Milestoner
11
10
  include Import[:input, :logger, :kernel]
12
11
  include Builders::Import[:ascii_doc, :markdown, :stream, :web]
13
12
 
14
- using Refinements::Pathname
15
-
16
13
  handle "build"
17
14
 
18
15
  description "Build milestone."
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "refinements/pathname"
4
3
  require "sod"
5
4
 
6
5
  module Milestoner
@@ -10,8 +9,6 @@ module Milestoner
10
9
  class Cache < Sod::Command
11
10
  include Import[:input, :logger]
12
11
 
13
- using Refinements::Pathname
14
-
15
12
  handle "cache"
16
13
 
17
14
  description "Manage cache."
@@ -1,47 +1,48 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "core"
3
4
  require "refinements/array"
4
- require "versionaire"
5
5
 
6
6
  module Milestoner
7
7
  module Commits
8
8
  # Retrieves and categorizes Git repository commit tagged or untagged history.
9
9
  class Categorizer
10
- include Import[:git]
10
+ include Import[:git, :input]
11
11
 
12
12
  using Refinements::Array
13
13
 
14
- def initialize(collector: Collector.new, expression: Regexp, **)
14
+ def initialize(collector: Collector.new, **)
15
15
  @collector = collector
16
- @expression = expression
17
16
  super(**)
18
- end
19
17
 
20
- def call configuration = Container[:configuration]
21
- categories = configuration.commit_categories.pluck :label
18
+ @labels = input.commit_categories.pluck :label
19
+ @pattern = labels.empty? ? // : Regexp.union(labels)
20
+ end
22
21
 
23
- categories.reduce({}) { |group, prefix| group.merge prefix => [] }
24
- .merge("Unknown" => [])
25
- .then { |groups| group_by_category categories, groups }
26
- .each_value { |commits| commits.sort_by!(&:subject) }
27
- .values
28
- .flatten
22
+ def call min: Collector::MIN, max: Collector::MAX
23
+ collect(min, max).each_value { |commits| commits.sort_by!(&:subject) }
24
+ .values
25
+ .flatten
29
26
  end
30
27
 
31
28
  private
32
29
 
33
- attr_reader :collector, :expression
34
-
35
- def group_by_category categories, groups
36
- collector.call.value_or([]).each.with_object groups do |commit, collection|
37
- category = commit.subject[subject_pattern(categories)]
38
- key = collection.key?(category) ? category : "Unknown"
39
- collection[key] << commit
40
- end
30
+ attr_reader :collector, :labels, :pattern
31
+
32
+ def collect min, max
33
+ collector.call(min:, max:)
34
+ .value_or(Core::EMPTY_ARRAY)
35
+ .each
36
+ .with_object categories do |commit, collection|
37
+ category = commit.subject[pattern]
38
+ key = collection.key?(category) ? category : "Unknown"
39
+ collection[key] << commit
40
+ end
41
41
  end
42
42
 
43
- def subject_pattern categories
44
- categories.empty? ? expression.new(//) : expression.union(categories)
43
+ def categories
44
+ labels.reduce({}) { |group, prefix| group.merge prefix => [] }
45
+ .merge! "Unknown" => []
45
46
  end
46
47
  end
47
48
  end
@@ -1,16 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "dry/monads"
4
+
3
5
  module Milestoner
4
6
  module Commits
5
- # Collects commits since last tag or all commits if untagged.
7
+ # Collects commits since last tag, a specific range, or all commits if untagged.
6
8
  class Collector
9
+ include Dry::Monads[:result]
7
10
  include Import[:git]
8
11
 
9
- def call = git.tagged? ? latest : all
12
+ MIN = :last
13
+ MAX = :HEAD
14
+
15
+ def call(min: MIN, max: MAX) = git.tagged? ? slice(min, max) : all
10
16
 
11
17
  private
12
18
 
13
- def latest = git.tag_last.bind { |tag| git.commits "#{tag}..HEAD" }
19
+ def slice min, max
20
+ case [min, max]
21
+ in MIN, MAX then git.tag_last.bind { |tag| git.commits "#{tag}..#{max}" }
22
+ in String, String then git.commits "#{min}..#{max}"
23
+ else Failure "Invalid minimum and/or maximum range: #{min}..#{max}."
24
+ end
25
+ end
14
26
 
15
27
  def all = git.commits
16
28
  end
@@ -29,9 +29,9 @@ module Milestoner
29
29
  super(**)
30
30
  end
31
31
 
32
- def call
33
- categorizer.call
34
- .map { |commit| record_for commit }
32
+ def call min: Collector::MIN, max: Collector::MAX
33
+ categorizer.call(min:, max:)
34
+ .map { |commit| model.for(commit, **build_attributes(commit)) }
35
35
  .then { |commits| Success commits }
36
36
  end
37
37
 
@@ -39,8 +39,6 @@ module Milestoner
39
39
 
40
40
  attr_reader :categorizer, :model
41
41
 
42
- def record_for(commit) = model.for(commit, **build_attributes(commit))
43
-
44
42
  def build_attributes commit
45
43
  infused_keys.each.with_object({}) do |command, attributes|
46
44
  attributes[command] = __send__(command).call commit
@@ -13,7 +13,7 @@ module Milestoner
13
13
  end
14
14
 
15
15
  def call commit
16
- cache.commit(:users) { |table| table.find commit.author_name }
16
+ cache.read(:users) { |table| table.find commit.author_name }
17
17
  .value_or(model.new)
18
18
  end
19
19
 
@@ -24,7 +24,7 @@ module Milestoner
24
24
  def users_for(trailers) = trailers.map { |trailer| user_for parser.call(trailer.value) }
25
25
 
26
26
  def user_for person
27
- cache.commit(:users) { find person.name }
27
+ cache.read(:users) { find person.name }
28
28
  .value_or(nil)
29
29
  end
30
30
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "core"
3
4
  require "dry/monads"
4
5
  require "versionaire"
5
6
 
@@ -30,7 +31,7 @@ module Milestoner
30
31
  attr_reader :defaults, :collector
31
32
 
32
33
  def trailer_milestones
33
- collector.call.value_or([]).each.with_object [] do |commit, values|
34
+ collector.call.value_or(Core::EMPTY_ARRAY).each.with_object [] do |commit, values|
34
35
  commit.trailer_value_for(trailer_key).bind { |milestone| values.append milestone.to_sym }
35
36
  end
36
37
  end
@@ -26,6 +26,7 @@ module Milestoner
26
26
  required(:generator_label).filled :string
27
27
  required(:generator_uri).filled :string
28
28
  required(:generator_version).filled Etcher::Types::Version
29
+ required(:loaded_at).filled :time
29
30
  required(:profile_domain).filled :string
30
31
  required(:profile_uri).filled :string
31
32
  required(:project_author).filled :string
@@ -16,6 +16,7 @@ module Milestoner
16
16
  :generator_label,
17
17
  :generator_uri,
18
18
  :generator_version,
19
+ :loaded_at,
19
20
  :profile_domain,
20
21
  :profile_uri,
21
22
  :project_author,
@@ -11,9 +11,9 @@ module Milestoner
11
11
  module Build
12
12
  using Refinements::Hash
13
13
 
14
- Root = lambda do |content, key = :build_root|
15
- content.transform_with! key => -> value { Pathname(value).expand_path }
16
- Dry::Monads::Success content
14
+ Root = lambda do |attributes, key = :build_root|
15
+ attributes.transform_with! key => -> value { Pathname(value).expand_path }
16
+ Dry::Monads::Success attributes
17
17
  end
18
18
  end
19
19
  end
@@ -20,7 +20,7 @@ module Milestoner
20
20
  @xdg_config = xdg_config
21
21
  end
22
22
 
23
- def call(content) = Success content.merge!(key => xdg_config.all.append(default))
23
+ def call(attributes) = Success attributes.merge!(key => xdg_config.all.append(default))
24
24
 
25
25
  private
26
26
 
@@ -23,10 +23,10 @@ module Milestoner
23
23
  @citation = citation
24
24
  end
25
25
 
26
- def call content
27
- content.fetch_value(key) { citation.open(path).abstract }
28
- .then { |value| value unless String(value).empty? }
29
- .then { |value| Success content.merge!(key => value) }
26
+ def call attributes
27
+ attributes.fetch_value(key) { citation.open(path).abstract }
28
+ .then { |value| value unless String(value).empty? }
29
+ .then { |value| Success attributes.merge!(key => value) }
30
30
  end
31
31
 
32
32
  private
@@ -23,10 +23,10 @@ module Milestoner
23
23
  @citation = citation
24
24
  end
25
25
 
26
- def call content
27
- content.fetch_value(key) { citation.open(path).title }
28
- .then { |value| value unless String(value).empty? }
29
- .then { |value| Success content.merge!(key => value) }
26
+ def call attributes
27
+ attributes.fetch_value(key) { citation.open(path).title }
28
+ .then { |value| value unless String(value).empty? }
29
+ .then { |value| Success attributes.merge!(key => value) }
30
30
  end
31
31
 
32
32
  private
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "dry/monads"
4
4
  require "pathname"
5
- require "spek"
6
5
 
7
6
  module Milestoner
8
7
  module Configuration
@@ -19,9 +18,9 @@ module Milestoner
19
18
  super(**)
20
19
  end
21
20
 
22
- def call content
23
- content.fetch(key) { spec_loader.call(path).summary }
24
- .then { |value| Success content.merge!(key => value) }
21
+ def call attributes
22
+ attributes.fetch(key) { spec_loader.call(path).summary }
23
+ .then { |value| Success attributes.merge!(key => value) }
25
24
  end
26
25
 
27
26
  private
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "dry/monads"
4
4
  require "pathname"
5
- require "spek"
6
5
 
7
6
  module Milestoner
8
7
  module Configuration
@@ -19,10 +18,10 @@ module Milestoner
19
18
  super(**)
20
19
  end
21
20
 
22
- def call content
23
- content.fetch(key) { spec_loader.call(path).label }
24
- .then { |value| value unless value == "Undefined" }
25
- .then { |value| Success content.merge!(key => value) }
21
+ def call attributes
22
+ attributes.fetch(key) { spec_loader.call(path).label }
23
+ .then { |value| value unless value == "Undefined" }
24
+ .then { |value| Success attributes.merge!(key => value) }
26
25
  end
27
26
 
28
27
  private
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "dry/monads"
4
4
  require "pathname"
5
- require "spek"
6
5
 
7
6
  module Milestoner
8
7
  module Configuration
@@ -19,9 +18,9 @@ module Milestoner
19
18
  super(**)
20
19
  end
21
20
 
22
- def call content
23
- content.fetch(key) { spec_loader.call(path).name }
24
- .then { |value| Success content.merge!(key => value) }
21
+ def call attributes
22
+ attributes.fetch(key) { spec_loader.call(path).name }
23
+ .then { |value| Success attributes.merge!(key => value) }
25
24
  end
26
25
 
27
26
  private
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "dry/monads"
4
4
  require "pathname"
5
- require "spek"
6
5
 
7
6
  module Milestoner
8
7
  module Configuration
@@ -19,10 +18,10 @@ module Milestoner
19
18
  super(**)
20
19
  end
21
20
 
22
- def call content
23
- content.fetch(key) { spec_loader.call(path).homepage_url }
24
- .then { |value| value unless String(value).empty? }
25
- .then { |value| Success content.merge!(key => value) }
21
+ def call attributes
22
+ attributes.fetch(key) { spec_loader.call(path).homepage_url }
23
+ .then { |value| value unless String(value).empty? }
24
+ .then { |value| Success attributes.merge!(key => value) }
26
25
  end
27
26
 
28
27
  private
@@ -16,9 +16,9 @@ module Milestoner
16
16
  super(**)
17
17
  end
18
18
 
19
- def call content
20
- content.fetch(key) { specification.label }
21
- .then { |value| Success content.merge!(key => value) }
19
+ def call attributes
20
+ attributes.fetch(key) { specification.label }
21
+ .then { |value| Success attributes.merge!(key => value) }
22
22
  end
23
23
 
24
24
  private
@@ -16,9 +16,9 @@ module Milestoner
16
16
  super(**)
17
17
  end
18
18
 
19
- def call content
20
- content.fetch(key) { specification.homepage_url }
21
- .then { |value| Success content.merge!(key => value) }
19
+ def call attributes
20
+ attributes.fetch(key) { specification.homepage_url }
21
+ .then { |value| Success attributes.merge!(key => value) }
22
22
  end
23
23
 
24
24
  private
@@ -16,9 +16,9 @@ module Milestoner
16
16
  super(**)
17
17
  end
18
18
 
19
- def call content
20
- content.fetch(key) { specification.version }
21
- .then { |value| Success content.merge!(key => value) }
19
+ def call attributes
20
+ attributes.fetch(key) { specification.version }
21
+ .then { |value| Success attributes.merge!(key => value) }
22
22
  end
23
23
 
24
24
  private
@@ -19,9 +19,9 @@ module Milestoner
19
19
  super(**)
20
20
  end
21
21
 
22
- def call content
23
- content.fetch_value(key) { git.get("user.name", nil).value_or(nil) }
24
- .then { |value| Success content.merge!(key => value) }
22
+ def call attributes
23
+ attributes.fetch_value(key) { git.get("user.name", nil).value_or(nil) }
24
+ .then { |value| Success attributes.merge!(key => value) }
25
25
  end
26
26
 
27
27
  private
@@ -16,13 +16,13 @@ module Milestoner
16
16
  super(**)
17
17
  end
18
18
 
19
- def call content
19
+ def call attributes
20
20
  warn "`#{self.class}##{__method__}` is deprecated, use " \
21
21
  "`Milestoner::Configuration::Transformers::Generator::Label` or " \
22
22
  "`Milestoner::Configuration::Transformers::Generator::URI` instead.",
23
23
  category: :deprecated
24
24
 
25
- Success({key => specification.labeled_version}.merge!(content))
25
+ Success({key => specification.labeled_version}.merge!(attributes))
26
26
  end
27
27
 
28
28
  private
@@ -13,9 +13,9 @@ module Milestoner
13
13
  using Refinements::String
14
14
  using Refinements::Hash
15
15
 
16
- Label = lambda do |content, key = :project_label, default: Pathname.pwd.basename.to_s|
17
- content.fetch_value(key) { default.titleize }
18
- .then { |value| Dry::Monads::Success content.merge!(key => value) }
16
+ Label = lambda do |attributes, key = :project_label, default: Pathname.pwd.basename.to_s|
17
+ attributes.fetch_value(key) { default.titleize }
18
+ .then { |value| Dry::Monads::Success attributes.merge!(key => value) }
19
19
  end
20
20
  end
21
21
  end
@@ -11,9 +11,9 @@ module Milestoner
11
11
  module Project
12
12
  using Refinements::Hash
13
13
 
14
- Name = lambda do |content, key = :project_name, default: Pathname.pwd.basename.to_s|
15
- content.fetch_value(key) { default }
16
- .then { |value| Dry::Monads::Success content.merge!(key => value) }
14
+ Name = lambda do |attributes, key = :project_name, default: Pathname.pwd.basename.to_s|
15
+ attributes.fetch_value(key) { default }
16
+ .then { |value| Dry::Monads::Success attributes.merge!(key => value) }
17
17
  end
18
18
  end
19
19
  end
@@ -18,9 +18,9 @@ module Milestoner
18
18
  @versioner = versioner
19
19
  end
20
20
 
21
- def call content
22
- content.fetch_value(key) { versioner.call }
23
- .then { |value| Success content.merge!(key => value) }
21
+ def call attributes
22
+ attributes.fetch_value(key) { versioner.call }
23
+ .then { |value| Success attributes.merge!(key => value) }
24
24
  end
25
25
 
26
26
  private
@@ -1,19 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/monads"
4
- require "pathname"
5
4
 
6
5
  module Milestoner
7
6
  module Configuration
8
7
  module Transformers
9
8
  module URI
10
- Avatar = lambda do |content, key = :avatar_uri|
11
- domain, uri = content.values_at :avatar_domain, key
9
+ Avatar = lambda do |attributes, key = :avatar_uri|
10
+ uri, domain = attributes.values_at key, :avatar_domain
12
11
 
13
- return Dry::Monads::Success content unless uri
12
+ return Dry::Monads::Success attributes unless uri
14
13
 
15
- content[key] = format uri, domain:, id: "%<id>s"
16
- Dry::Monads::Success content
14
+ attributes[key] = format uri, domain:, id: "%<id>s"
15
+ Dry::Monads::Success attributes
17
16
  end
18
17
  end
19
18
  end
@@ -1,22 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/monads"
4
- require "pathname"
5
4
 
6
5
  module Milestoner
7
6
  module Configuration
8
7
  module Transformers
9
8
  module URI
10
- Commit = lambda do |content, key = :commit_uri|
11
- owner, name, domain, uri = content.values_at :project_owner,
12
- :project_name,
13
- :commit_domain,
14
- key
9
+ Commit = lambda do |attributes, key = :commit_uri|
10
+ uri, owner, name, domain = attributes.values_at key,
11
+ :project_owner,
12
+ :project_name,
13
+ :commit_domain
15
14
 
16
- return Dry::Monads::Success content unless uri
15
+ return Dry::Monads::Success attributes unless uri
17
16
 
18
- content[key] = format uri, domain:, owner:, name:, id: "%<id>s"
19
- Dry::Monads::Success content
17
+ attributes[key] = format uri, domain:, owner:, name:, id: "%<id>s"
18
+ Dry::Monads::Success attributes
20
19
  end
21
20
  end
22
21
  end
@@ -1,19 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/monads"
4
- require "pathname"
5
4
 
6
5
  module Milestoner
7
6
  module Configuration
8
7
  module Transformers
9
8
  module URI
10
- Profile = lambda do |content, key = :profile_uri|
11
- domain, uri = content.values_at :profile_domain, key
9
+ Profile = lambda do |attributes, key = :profile_uri|
10
+ uri, domain = attributes.values_at key, :profile_domain
12
11
 
13
- return Dry::Monads::Success content unless uri
12
+ return Dry::Monads::Success attributes unless uri
14
13
 
15
- content[key] = format uri, domain:, id: "%<id>s"
16
- Dry::Monads::Success content
14
+ attributes[key] = format uri, domain:, id: "%<id>s"
15
+ Dry::Monads::Success attributes
17
16
  end
18
17
  end
19
18
  end
@@ -1,22 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/monads"
4
- require "pathname"
5
4
 
6
5
  module Milestoner
7
6
  module Configuration
8
7
  module Transformers
9
8
  module URI
10
- Review = lambda do |content, key = :review_uri|
11
- owner, name, domain, uri = content.values_at :project_owner,
12
- :project_name,
13
- :review_domain,
14
- key
9
+ Review = lambda do |attributes, key = :review_uri|
10
+ uri, owner, name, domain = attributes.values_at key,
11
+ :project_owner,
12
+ :project_name,
13
+ :review_domain
15
14
 
16
- return Dry::Monads::Success content unless uri
15
+ return Dry::Monads::Success attributes unless uri
17
16
 
18
- content[key] = format uri, domain:, owner:, name:, id: "%<id>s"
19
- Dry::Monads::Success content
17
+ attributes[key] = format uri, domain:, owner:, name:, id: "%<id>s"
18
+ Dry::Monads::Success attributes
20
19
  end
21
20
  end
22
21
  end
@@ -1,22 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/monads"
4
- require "pathname"
5
4
 
6
5
  module Milestoner
7
6
  module Configuration
8
7
  module Transformers
9
8
  module URI
10
- Tracker = lambda do |content, key = :tracker_uri|
11
- owner, name, domain, uri = content.values_at :project_owner,
12
- :project_name,
13
- :tracker_domain,
14
- key
9
+ Tracker = lambda do |attributes, key = :tracker_uri|
10
+ uri, owner, name, domain = attributes.values_at key,
11
+ :project_owner,
12
+ :project_name,
13
+ :tracker_domain
15
14
 
16
- return Dry::Monads::Success content unless uri
15
+ return Dry::Monads::Success attributes unless uri
17
16
 
18
- content[key] = format uri, domain:, owner:, name:, id: "%<id>s"
19
- Dry::Monads::Success content
17
+ attributes[key] = format uri, domain:, owner:, name:, id: "%<id>s"
18
+ Dry::Monads::Success attributes
20
19
  end
21
20
  end
22
21
  end
@@ -56,6 +56,7 @@ module Milestoner
56
56
  .add_transformer(Configuration::Transformers::URI::Profile)
57
57
  .add_transformer(Configuration::Transformers::URI::Review)
58
58
  .add_transformer(Configuration::Transformers::URI::Tracker)
59
+ .add_transformer(Etcher::Transformers::Time.new)
59
60
  end
60
61
 
61
62
  register(:specification) { self[:spec_loader].call "#{__dir__}/../../milestoner.gemspec" }
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "gitt"
3
+ require "core"
4
4
  require "refinements/string_io"
5
5
  require "versionaire"
6
6
 
@@ -27,7 +27,10 @@ module Milestoner
27
27
  version = compute_version override
28
28
 
29
29
  return false if local? version
30
- fail Error, "Unable to tag without commits." if collector.call.value_or([]).empty?
30
+
31
+ collection = collector.call.value_or Core::EMPTY_ARRAY
32
+
33
+ fail Error, "Unable to tag without commits." if collection.empty?
31
34
 
32
35
  create version
33
36
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "core"
3
4
  require "forwardable"
4
5
  require "hanami/view"
5
6
 
@@ -24,7 +25,9 @@ module Milestoner
24
25
  project_version
25
26
  ] => :input
26
27
 
27
- def project_slug = [project_name, project_version].compact.join("_").tr ".", ""
28
+ def project_slug
29
+ [project_name, project_version].compact.join("_").tr ".", Core::EMPTY_STRING
30
+ end
28
31
 
29
32
  def project_title = [project_label, project_version].compact.join " "
30
33
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "hanami/view"
4
- require "pathname"
5
4
  require "refinements/string"
6
5
 
7
6
  module Milestoner
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "asciidoctor"
4
3
  require "hanami/view"
5
4
  require "refinements/array"
6
5
 
@@ -15,7 +14,7 @@ module Milestoner
15
14
  using Refinements::Array
16
15
 
17
16
  def initialize(**)
18
- super(**)
17
+ super
19
18
  @prefixes = configuration.commit_categories.pluck :label
20
19
  @authored_at = Time.at(value.authored_at.to_i).utc
21
20
  end
data/milestoner.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "milestoner"
5
- spec.version = "17.6.0"
5
+ spec.version = "17.8.0"
6
6
  spec.authors = ["Brooke Kuhlmann"]
7
7
  spec.email = ["brooke@alchemists.io"]
8
8
  spec.homepage = "https://alchemists.io/projects/milestoner"
9
- spec.summary = "A command line interface for managing Git repository milestones."
9
+ spec.summary = "A command line interface for automated Git repository milestones."
10
10
  spec.license = "Hippocratic-2.1"
11
11
 
12
12
  spec.metadata = {
@@ -27,13 +27,14 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency "cff", "~> 1.1"
28
28
  spec.add_dependency "cogger", "~> 0.16"
29
29
  spec.add_dependency "containable", "~> 0.0"
30
+ spec.add_dependency "core", "~> 1.3"
30
31
  spec.add_dependency "dry-monads", "~> 1.6"
31
32
  spec.add_dependency "dry-schema", "~> 1.13"
32
- spec.add_dependency "etcher", "~> 1.3"
33
+ spec.add_dependency "etcher", "~> 1.5"
33
34
  spec.add_dependency "gitt", "~> 3.2"
34
35
  spec.add_dependency "hanami-view", "~> 2.1"
35
36
  spec.add_dependency "infusible", "~> 3.5"
36
- spec.add_dependency "lode", "~> 1.0"
37
+ spec.add_dependency "lode", "~> 1.4"
37
38
  spec.add_dependency "redcarpet", "~> 3.6"
38
39
  spec.add_dependency "refinements", "~> 12.1"
39
40
  spec.add_dependency "runcom", "~> 11.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: 17.6.0
4
+ version: 17.8.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-04-17 00:00:00.000000000 Z
38
+ date: 2024-05-25 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: asciidoctor
@@ -93,6 +93,20 @@ dependencies:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
95
  version: '0.0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: core
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.3'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.3'
96
110
  - !ruby/object:Gem::Dependency
97
111
  name: dry-monads
98
112
  requirement: !ruby/object:Gem::Requirement
@@ -127,14 +141,14 @@ dependencies:
127
141
  requirements:
128
142
  - - "~>"
129
143
  - !ruby/object:Gem::Version
130
- version: '1.3'
144
+ version: '1.5'
131
145
  type: :runtime
132
146
  prerelease: false
133
147
  version_requirements: !ruby/object:Gem::Requirement
134
148
  requirements:
135
149
  - - "~>"
136
150
  - !ruby/object:Gem::Version
137
- version: '1.3'
151
+ version: '1.5'
138
152
  - !ruby/object:Gem::Dependency
139
153
  name: gitt
140
154
  requirement: !ruby/object:Gem::Requirement
@@ -183,14 +197,14 @@ dependencies:
183
197
  requirements:
184
198
  - - "~>"
185
199
  - !ruby/object:Gem::Version
186
- version: '1.0'
200
+ version: '1.4'
187
201
  type: :runtime
188
202
  prerelease: false
189
203
  version_requirements: !ruby/object:Gem::Requirement
190
204
  requirements:
191
205
  - - "~>"
192
206
  - !ruby/object:Gem::Version
193
- version: '1.0'
207
+ version: '1.4'
194
208
  - !ruby/object:Gem::Dependency
195
209
  name: redcarpet
196
210
  requirement: !ruby/object:Gem::Requirement
@@ -434,8 +448,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
434
448
  - !ruby/object:Gem::Version
435
449
  version: '0'
436
450
  requirements: []
437
- rubygems_version: 3.5.9
451
+ rubygems_version: 3.5.10
438
452
  signing_key:
439
453
  specification_version: 4
440
- summary: A command line interface for managing Git repository milestones.
454
+ summary: A command line interface for automated Git repository milestones.
441
455
  test_files: []
metadata.gz.sig CHANGED
Binary file