milestoner 13.3.1 → 14.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20ee3f48df68aee0ae1a12474c2f61e59aa6d6ecb574575ef70af34b0e87321f
4
- data.tar.gz: 9e22ab67fbbe038a0b0ad9c8bb6977ebada13870eb10112cfc5e9e9b88a951e7
3
+ metadata.gz: 414e626152e7e409b899f4ef27e1834eb14a016ea522da04bb9bcc14cc624944
4
+ data.tar.gz: 79e74c38a4693e8cf98dbee86bf4758184de28c2251e47c086a17135c12159dd
5
5
  SHA512:
6
- metadata.gz: f2f3548fbc6e988e583342c3d2508b4b1ff562a60e4d5f45e675701bb5d89b295917208ee048016cb7d3eccde84cfdbf34c924f1471b1d43b78392e17130514c
7
- data.tar.gz: bf2cbd679ddddfcbc8fbaac6acbb2634c4d132ff0872f52eb1710ac15aa83fa56b92f386b7f0b48a93c8cc39b5fa8515016da9ba3c9edbe36eecf5d332c4b590
6
+ metadata.gz: '0854ded23bde4df9d170e8456e4850800722f6306169061ec29ab1b053ee6026ef5f17625981ea34e4ec6eeee20b79ebcda785c6cee9ac20e3b43f32d9e8a5b6'
7
+ data.tar.gz: 76faa8376ec91c6cf70be5d286f38e5eb8a32081992294a93d0e9e0be13e363a9ab75f747e8fb93c71d174eb51907f43ed4ecb91d4994fea384d09f57a9d4936
checksums.yaml.gz.sig CHANGED
Binary file
data/README.adoc CHANGED
@@ -4,13 +4,18 @@
4
4
 
5
5
  = Milestoner
6
6
 
7
- Milestoner is a command line interface for crafting Git repository tags (milestones) using semantic
8
- versions. Each milestone is a summary of all commits made since the last milestone. You can use
9
- Milestoner to inspect what is currently unreleased or create a new release via a single command. By
10
- having a tool, like Milestoner, you can quickly manage/automate releases in a consistent and
11
- reliable fashion. Milestoner also pairs well with
12
- link:https://www.alchemists.io/projects/git-lint[Git Lint] for further ensuring you have commit
13
- messages of high quality for your release notes.
7
+ Milestoner is a command line interface for crafting Git repository tags (milestones) using
8
+ link:https://semver.org[semantic versions]. Each milestone is a summary of all commits made since
9
+ the last milestone. You can use Milestoner to inspect what is currently pending or create a new
10
+ release via a single command. By having a tool, like Milestoner, you can automate releases in a
11
+ consistent and reliable fashion. Milestoner pairs well with the following gems:
12
+
13
+ - link:https://www.alchemists.io/projects/git-lint[Git Lint] - Ensures your commit messages are of
14
+ high quality which feed into the release notes built by Milestoner.
15
+ - link:https://www.alchemists.io/projects/rubysmith[Rubysmith] - Use Milestoner to automate the
16
+ publishing of new or existing Ruby project versions.
17
+ - link:https://www.alchemists.io/projects/gemsmith[Gemsmith] - Is built on top of Milestoner and is
18
+ used to publish new Ruby gem versions.
14
19
 
15
20
  toc::[]
16
21
 
@@ -31,13 +36,12 @@ toc::[]
31
36
  ** Refactored
32
37
  * Ensures Git commit messages are alphabetically sorted.
33
38
  * Ensures duplicate Git commit messages are removed (if any).
34
- * Provides optional security for signing Git tags with https://www.gnupg.org[GnuPG] signing key.
35
39
 
36
40
  == Requirements
37
41
 
38
42
  . A UNIX-based system.
39
43
  . https://www.ruby-lang.org[Ruby].
40
- . https://www.gnupg.org[GnuPG].
44
+ . https://www.gnupg.org[GnuPG] (optional).
41
45
 
42
46
  == Setup
43
47
 
@@ -61,9 +65,6 @@ USAGE:
61
65
  -P, --publish VERSION Tag and push milestone to remote repository.
62
66
  -s, --status Show project status.
63
67
  -v, --version Show gem version.
64
-
65
- SECURITY OPTIONS:
66
- --[no-]sign Sign with GPG key. Default: false.
67
68
  ....
68
69
 
69
70
  Examples:
@@ -72,13 +73,8 @@ Examples:
72
73
  ----
73
74
  milestoner --config edit
74
75
  milestoner --config view
75
-
76
76
  milestoner --help
77
-
78
77
  milestoner --publish 0.1.0
79
- milestoner --publish 0.1.0 --sign
80
- milestoner --publish 0.1.0 --no-sign
81
-
82
78
  milestoner --status
83
79
  milestoner --version
84
80
  ----
@@ -98,14 +94,13 @@ The default configuration is as follows:
98
94
  [source,yaml]
99
95
  ----
100
96
  :documentation:
101
- :format: "md"
97
+ :format: "adoc"
102
98
  :prefixes:
103
99
  - Fixed
104
100
  - Added
105
101
  - Updated
106
102
  - Removed
107
103
  - Refactored
108
- :sign: false
109
104
  ----
110
105
 
111
106
  Feel free to take this default configuration, modify, and save as your own custom
@@ -113,18 +108,16 @@ Feel free to take this default configuration, modify, and save as your own custo
113
108
 
114
109
  The `+configuration.yml+` file can be configured as follows:
115
110
 
116
- * *Documenation Format*: Determines what format the status information should be rendered. Defaults
117
- to link:https://daringfireball.net/projects/markdown[Markdown] (i.e. `md`) but
118
- link:https://asciidoctor.org/docs/what-is-asciidoc[ASCII Doc] (i.e. `adoc`) is supported too.
119
- * *Git Commit Prefixes*: Should the default prefixes not be desired, you can define Git commit
120
- prefixes that match your style. _NOTE: Prefix order is important with the first prefix defined
121
- taking precedence over the second and so forth._ Special characters are allowed for prefixes but
122
- should be enclosed in quotes. To disable prefix usage completely, use an empty array. Example:
123
- `:prefixes: []`.
124
- * *Git Tag Sign*: Defaults to `false` but can be enabled by setting to `true`. When enabled, a
125
- Git tag will require GPG signing for enhanced security and include a signed signature as part of
126
- the Git tag. This is useful for public milestones where the author of a milestone can be verified
127
- to ensure milestone integrity/security.
111
+ * *Documentation Format* (i.e. `documentation`): Determines what format the release notes should be
112
+ rendered as. This effects both status information from the command line and the release notes
113
+ embedded within the body of a Git tag. Defaults to
114
+ link:https://asciidoctor.org/docs/what-is-asciidoc[ASCII Doc] (i.e. `adoc`) but
115
+ link:https://daringfireball.net/projects/markdown[Markdown] (i.e. `md`) is supported too.
116
+ * *Git Commit Prefixes* (i.e. `prefixes`): Should the default prefixes not be desired, you can
117
+ define Git commit prefixes that match your style. _NOTE: Prefix order is important with the first
118
+ prefix defined taking precedence over the second and so forth._ Special characters are allowed for
119
+ prefixes but should be enclosed in quotes. To disable prefix usage completely, use an empty array.
120
+ Example: `:prefixes: []`.
128
121
 
129
122
  == Security
130
123
 
@@ -151,16 +144,21 @@ To obtain your key, run the following and take the part after the forward slash:
151
144
  gpg --list-keys | grep pub
152
145
  ....
153
146
 
154
- Add your key to your global Git configuration in the `+[user]+` section. Example:
147
+ Add your key to your global (or local) Git configuration and ensure GPG signing for your tag is
148
+ enabled. Example:
155
149
 
156
150
  ....
151
+ [tag]
152
+ gpgSign = true
157
153
  [user]
158
154
  signingkey = <your GPG key>
159
155
  ....
160
156
 
161
- Now, when publishing a new milestone (i.e. `+milestoner --publish <version> --sign+`), signing of
162
- your Git tag will happen automatically. You will be prompted for the GPG Passphrase each time but
163
- that is to be expected.
157
+ Now, when publishing a new milestone (i.e. `milestoner --publish <version>`), the signing of your
158
+ Git tag will happen automatically. You will be prompted for the GPG Passphrase each time unless you
159
+ are running the
160
+ link:https://gnupg.org/documentation/manuals/gnupg/Invoking-GPG_002dAGENT.html#Invoking-GPG_002dAGENT[GPG
161
+ Agent] in the background (highly recommend).
164
162
 
165
163
  == Development
166
164
 
@@ -5,9 +5,11 @@ module Milestoner
5
5
  module Actions
6
6
  # Handles the gem configuration action.
7
7
  class Config
8
- def initialize configuration: Configuration::Loader::CLIENT, container: Container
8
+ include Milestoner::Import[:kernel, :logger]
9
+
10
+ def initialize configuration: Configuration::Loader::CLIENT, **dependencies
11
+ super(**dependencies)
9
12
  @configuration = configuration
10
- @container = container
11
13
  end
12
14
 
13
15
  def call action
@@ -20,15 +22,11 @@ module Milestoner
20
22
 
21
23
  private
22
24
 
23
- attr_reader :configuration, :container
25
+ attr_reader :configuration
24
26
 
25
27
  def edit = kernel.system("$EDITOR #{configuration.current}")
26
28
 
27
29
  def view = kernel.system("cat #{configuration.current}")
28
-
29
- def kernel = container[__method__]
30
-
31
- def logger = container[__method__]
32
30
  end
33
31
  end
34
32
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/container"
4
+
5
+ module Milestoner
6
+ module CLI
7
+ module Actions
8
+ # Provides a single container with application and action specific dependencies.
9
+ module Container
10
+ extend Dry::Container::Mixin
11
+
12
+ config.registry = ->(container, key, value, _options) { container[key.to_s] = value }
13
+
14
+ merge Milestoner::Container
15
+
16
+ register(:config) { Config.new }
17
+ register(:publish) { Publish.new }
18
+ register(:status) { Status.new }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "auto_injector"
4
+
5
+ module Milestoner
6
+ module CLI
7
+ module Actions
8
+ Import = AutoInjector[Container]
9
+ end
10
+ end
11
+ end
@@ -5,12 +5,14 @@ module Milestoner
5
5
  module Actions
6
6
  # Handles listing project status of untagged commit history.
7
7
  class Status
8
+ include Milestoner::Import[:logger]
9
+
8
10
  def initialize presenter: Presenters::Commit,
9
11
  categorizer: Commits::Categorizer.new,
10
- container: Container
12
+ **dependencies
13
+ super(**dependencies)
11
14
  @presenter = presenter
12
15
  @categorizer = categorizer
13
- @container = container
14
16
  end
15
17
 
16
18
  def call
@@ -22,11 +24,9 @@ module Milestoner
22
24
 
23
25
  private
24
26
 
25
- attr_reader :presenter, :categorizer, :container
27
+ attr_reader :presenter, :categorizer
26
28
 
27
29
  def info(message) = logger.info { message }
28
-
29
- def logger = container[__method__]
30
30
  end
31
31
  end
32
32
  end
@@ -6,26 +6,30 @@ module Milestoner
6
6
  module CLI
7
7
  # Assembles and parses all Command Line Interface (CLI) options.
8
8
  class Parser
9
+ include Import[:configuration]
10
+
9
11
  CLIENT = OptionParser.new nil, 40, " "
10
- SECTIONS = [Parsers::Core, Parsers::Security].freeze # Order is important.
12
+ SECTIONS = [Parsers::Core].freeze
13
+
14
+ def initialize sections: SECTIONS, client: CLIENT, **dependencies
15
+ super(**dependencies)
11
16
 
12
- def initialize sections: SECTIONS, client: CLIENT, container: Container
13
17
  @sections = sections
14
18
  @client = client
15
- @configuration = container[:configuration].dup
19
+ @configuration_duplicate = configuration.dup
16
20
  end
17
21
 
18
22
  def call arguments = []
19
- sections.each { |section| section.call configuration, client: }
23
+ sections.each { |section| section.call configuration_duplicate, client: }
20
24
  client.parse arguments
21
- configuration.freeze
25
+ configuration_duplicate.freeze
22
26
  end
23
27
 
24
28
  def to_s = client.to_s
25
29
 
26
30
  private
27
31
 
28
- attr_reader :sections, :client, :configuration
32
+ attr_reader :sections, :client, :configuration_duplicate
29
33
  end
30
34
  end
31
35
  end
@@ -11,14 +11,16 @@ module Milestoner
11
11
 
12
12
  # Handles parsing of Command Line Interface (CLI) core options.
13
13
  class Core
14
+ include Import[:specification]
15
+
14
16
  def self.call(...) = new(...).call
15
17
 
16
- def initialize configuration = Configuration::Loader.call,
18
+ def initialize configuration = Container[:configuration],
17
19
  client: Parser::CLIENT,
18
- container: Container
20
+ **dependencies
21
+ super(**dependencies)
19
22
  @configuration = configuration
20
23
  @client = client
21
- @container = container
22
24
  end
23
25
 
24
26
  def call arguments = []
@@ -31,7 +33,7 @@ module Milestoner
31
33
 
32
34
  private
33
35
 
34
- attr_reader :configuration, :client, :container
36
+ attr_reader :configuration, :client
35
37
 
36
38
  def collate = private_methods.sort.grep(/add_/).each { |method| __send__ method }
37
39
 
@@ -74,8 +76,6 @@ module Milestoner
74
76
  configuration.merge! action_help: true
75
77
  end
76
78
  end
77
-
78
- def specification = container[__method__]
79
79
  end
80
80
  end
81
81
  end
@@ -4,16 +4,11 @@ module Milestoner
4
4
  module CLI
5
5
  # The main Command Line Interface (CLI) object.
6
6
  class Shell
7
- ACTIONS = {
8
- config: Actions::Config.new,
9
- publish: Actions::Publish.new,
10
- status: Actions::Status.new
11
- }.freeze
7
+ include Actions::Import[:config, :publish, :status, :specification, :logger]
12
8
 
13
- def initialize parser: Parser.new, actions: ACTIONS, container: Container
9
+ def initialize parser: Parser.new, **dependencies
10
+ super(**dependencies)
14
11
  @parser = parser
15
- @actions = actions
16
- @container = container
17
12
  end
18
13
 
19
14
  def call arguments = []
@@ -24,29 +19,17 @@ module Milestoner
24
19
 
25
20
  private
26
21
 
27
- attr_reader :parser, :actions, :container
22
+ attr_reader :parser
28
23
 
29
24
  def perform configuration
30
25
  case configuration
31
- in action_config: Symbol => action then config action
32
- in action_publish: true then publish configuration
33
- in action_status: true then status
26
+ in action_config: Symbol => action then config.call action
27
+ in action_publish: true then publish.call configuration
28
+ in action_status: true then status.call
34
29
  in action_version: true then logger.info { specification.labeled_version }
35
- else usage
30
+ else logger.any { parser.to_s }
36
31
  end
37
32
  end
38
-
39
- def config(action) = actions.fetch(__method__).call(action)
40
-
41
- def publish(configuration) = actions.fetch(__method__).call(configuration)
42
-
43
- def status = actions.fetch(__method__).call
44
-
45
- def usage = logger.unknown { parser.to_s }
46
-
47
- def specification = container[__method__]
48
-
49
- def logger = container[__method__]
50
33
  end
51
34
  end
52
35
  end
@@ -6,12 +6,14 @@ module Milestoner
6
6
  module Commits
7
7
  # Retrieves and categorizes Git repository commit tagged or untagged history.
8
8
  class Categorizer
9
- def initialize expression: Regexp, container: Container
9
+ include Import[:repository]
10
+
11
+ def initialize expression: Regexp, **dependencies
12
+ super(**dependencies)
10
13
  @expression = expression
11
- @container = container
12
14
  end
13
15
 
14
- def call configuration = Configuration::Loader.call
16
+ def call configuration = Container[:configuration]
15
17
  prefixes = configuration.prefixes
16
18
 
17
19
  prefixes.reduce({}) { |group, prefix| group.merge prefix => [] }
@@ -25,7 +27,7 @@ module Milestoner
25
27
 
26
28
  private
27
29
 
28
- attr_reader :expression, :container
30
+ attr_reader :expression
29
31
 
30
32
  def group_by_prefix prefixes, groups
31
33
  computed_commits.each.with_object groups do |commit, collection|
@@ -44,8 +46,6 @@ module Milestoner
44
46
  def tagged_commits = repository.commits("#{repository.tag_last}..HEAD")
45
47
 
46
48
  def saved_commits = repository.commits
47
-
48
- def repository = container[__method__]
49
49
  end
50
50
  end
51
51
  end
@@ -13,7 +13,6 @@ module Milestoner
13
13
  :action_help,
14
14
  :documentation_format,
15
15
  :prefixes,
16
- :sign,
17
16
  :version,
18
17
  keyword_init: true
19
18
  ) do
@@ -1,9 +1,8 @@
1
1
  :documentation:
2
- :format: "md"
2
+ :format: "adoc"
3
3
  :prefixes:
4
4
  - Fixed
5
5
  - Added
6
6
  - Updated
7
7
  - Removed
8
8
  - Refactored
9
- :sign: false
@@ -1,9 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "cogger"
3
4
  require "dry-container"
4
5
  require "git_plus"
5
- require "logger"
6
- require "pastel"
7
6
  require "spek"
8
7
 
9
8
  module Milestoner
@@ -13,30 +12,8 @@ module Milestoner
13
12
 
14
13
  register(:configuration) { Configuration::Loader.call }
15
14
  register(:specification) { Spek::Loader.call "#{__dir__}/../../milestoner.gemspec" }
16
- register(:colorizer) { Pastel.new enabled: $stdout.tty? }
17
- register(:kernel) { Kernel }
18
-
19
- register :log_colors do
20
- {
21
- "DEBUG" => self[:colorizer].white.detach,
22
- "INFO" => self[:colorizer].green.detach,
23
- "WARN" => self[:colorizer].yellow.detach,
24
- "ERROR" => self[:colorizer].red.detach,
25
- "FATAL" => self[:colorizer].white.bold.on_red.detach,
26
- "ANY" => self[:colorizer].white.bold.detach
27
- }
28
- end
29
-
30
- register :logger do
31
- Logger.new $stdout,
32
- level: Logger.const_get(ENV.fetch("LOG_LEVEL", "INFO")),
33
- formatter: (
34
- lambda do |severity, _at, _name, message|
35
- self[:log_colors][severity].call "#{message}\n"
36
- end
37
- )
38
- end
39
-
40
15
  register(:repository) { GitPlus::Repository.new }
16
+ register(:kernel) { Kernel }
17
+ register(:logger) { Cogger::Client.new }
41
18
  end
42
19
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "auto_injector"
4
+
5
+ module Milestoner
6
+ Import = AutoInjector[Container]
7
+ end
@@ -7,23 +7,25 @@ module Milestoner
7
7
  module Presenters
8
8
  # Wraps the Git Kit Commit for presentation purposes.
9
9
  class Commit
10
+ include Import[:configuration]
11
+
10
12
  extend Forwardable
11
13
 
12
14
  delegate [*GitPlus::Commit.members, :fixup?, :squash?] => :record
13
15
 
14
- def initialize record, container: Container
16
+ def initialize record, **dependencies
17
+ super(**dependencies)
15
18
  @record = record
16
- @container = container
17
19
  end
18
20
 
19
21
  def line_item(delimiter: " - ") = "#{bullet}#{subject}#{delimiter}#{author_name}"
20
22
 
21
23
  private
22
24
 
23
- attr_reader :record, :container
25
+ attr_reader :record
24
26
 
25
27
  def bullet
26
- case container[:configuration].documentation_format
28
+ case configuration.documentation_format
27
29
  when "md" then "- "
28
30
  when "adoc" then "* "
29
31
  else ""
@@ -7,52 +7,46 @@ module Milestoner
7
7
  module Tags
8
8
  # Handles the creation of project repository tags.
9
9
  class Creator
10
+ include Import[:repository, :logger]
11
+
10
12
  using Versionaire::Cast
11
13
 
12
14
  def initialize categorizer: Commits::Categorizer.new,
13
15
  presenter: Presenters::Commit,
14
- container: Container
15
-
16
+ **dependencies
17
+ super(**dependencies)
16
18
  @categorizer = categorizer
17
19
  @presenter = presenter
18
- @container = container
19
20
  end
20
21
 
21
- def call configuration = CLI::Configuration::Loader.call
22
+ def call configuration = Container[:configuration]
22
23
  return false if local? configuration
23
24
  fail Error, "Unable to tag without commits." if categorizer.call.empty?
24
25
 
25
- sign configuration
26
+ create configuration
26
27
  rescue Versionaire::Error, GitPlus::Error => error
27
28
  raise Error, error.message
28
29
  end
29
30
 
30
31
  private
31
32
 
32
- attr_reader :categorizer, :presenter, :container
33
+ attr_reader :categorizer, :presenter
33
34
 
34
35
  def local? configuration
35
36
  version = Version configuration.version
36
37
 
37
38
  if repository.tag_local? version
38
- logger.warn "Local tag exists: #{version}. Skipped."
39
+ logger.warn { "Local tag exists: #{version}. Skipped." }
39
40
  true
40
41
  else
41
42
  false
42
43
  end
43
44
  end
44
45
 
45
- def sign configuration
46
+ def create configuration
46
47
  version = configuration.version
47
- content = message configuration
48
-
49
- if configuration.sign
50
- repository.tag_sign version, content
51
- else
52
- repository.tag_unsign version, content
53
- end
54
-
55
- logger.debug "Local tag created: #{version}."
48
+ repository.tag_unsign version, message(configuration)
49
+ logger.debug { "Local tag created: #{version}." }
56
50
  end
57
51
 
58
52
  def message configuration
@@ -62,10 +56,6 @@ module Milestoner
62
56
  %(Version #{configuration.version}\n\n#{line_items.join "\n"}\n\n)
63
57
  end
64
58
  end
65
-
66
- def repository = container[__method__]
67
-
68
- def logger = container[__method__]
69
59
  end
70
60
  end
71
61
  end
@@ -4,13 +4,15 @@ module Milestoner
4
4
  module Tags
5
5
  # Handles the tagging and pushing of a tag to a remote repository.
6
6
  class Publisher
7
- def initialize tagger: Tags::Creator.new, pusher: Tags::Pusher.new, container: Container
7
+ include Import[:logger]
8
+
9
+ def initialize tagger: Tags::Creator.new, pusher: Tags::Pusher.new, **dependencies
10
+ super(**dependencies)
8
11
  @tagger = tagger
9
12
  @pusher = pusher
10
- @container = container
11
13
  end
12
14
 
13
- def call configuration = CLI::Configuration::Loader.call
15
+ def call configuration = Container[:configuration]
14
16
  tagger.call configuration
15
17
  pusher.call configuration
16
18
  logger.info { "Published: #{configuration.version}!" }
@@ -18,9 +20,7 @@ module Milestoner
18
20
 
19
21
  private
20
22
 
21
- attr_reader :tagger, :pusher, :container
22
-
23
- def logger = container[__method__]
23
+ attr_reader :tagger, :pusher
24
24
  end
25
25
  end
26
26
  end
@@ -6,13 +6,11 @@ module Milestoner
6
6
  module Tags
7
7
  # Handles publishing of tags to a remote repository.
8
8
  class Pusher
9
- using Versionaire::Cast
9
+ include Import[:repository, :logger]
10
10
 
11
- def initialize container: Container
12
- @container = container
13
- end
11
+ using Versionaire::Cast
14
12
 
15
- def call configuration = CLI::Configuration::Loader.call
13
+ def call configuration = Container[:configuration]
16
14
  version = Version configuration.version
17
15
 
18
16
  fail Error, "Remote repository not configured." unless repository.config_origin?
@@ -24,17 +22,11 @@ module Milestoner
24
22
 
25
23
  private
26
24
 
27
- attr_reader :container
28
-
29
25
  def push
30
26
  repository.tag_push.then do |_stdout, stderr, status|
31
27
  status.success? && stderr.match?(/[new tag]/)
32
28
  end
33
29
  end
34
-
35
- def repository = container[__method__]
36
-
37
- def logger = container[__method__]
38
30
  end
39
31
  end
40
32
  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 = "13.3.1"
5
+ spec.version = "14.0.0"
6
6
  spec.authors = ["Brooke Kuhlmann"]
7
7
  spec.email = ["brooke@alchemists.io"]
8
8
  spec.homepage = "https://www.alchemists.io/projects/milestoner"
@@ -22,9 +22,10 @@ Gem::Specification.new do |spec|
22
22
  spec.cert_chain = [Gem.default_cert_path]
23
23
 
24
24
  spec.required_ruby_version = "~> 3.1"
25
+ spec.add_dependency "auto_injector", "~> 0.4"
26
+ spec.add_dependency "cogger", "~> 0.0"
25
27
  spec.add_dependency "dry-container", "~> 0.8"
26
28
  spec.add_dependency "git_plus", "~> 1.1"
27
- spec.add_dependency "pastel", "~> 0.8"
28
29
  spec.add_dependency "refinements", "~> 9.2"
29
30
  spec.add_dependency "runcom", "~> 8.2"
30
31
  spec.add_dependency "spek", "~> 0.2"
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: 13.3.1
4
+ version: 14.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
@@ -10,9 +10,9 @@ bindir: exe
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIC/jCCAeagAwIBAgIBBDANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
- a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMTAzMTkxMjQ4MDZaFw0yMjAzMTkx
15
- MjQ4MDZaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
13
+ MIIC/jCCAeagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
+ a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMjAzMTkxNzI0MzJaFw0yMzAzMTkx
15
+ NzI0MzJaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
16
16
  IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6l1qpXTiomH1RfMRloyw7MiE
17
17
  xyVx/x8Yc3EupdH7uhNaTXQGyORN6aOY//1QXXMHIZ9tW74nZLhesWMSUMYy0XhB
18
18
  brs+KkurHnc9FnEJAbG7ebGvl/ncqZt72nQvaxpDxvuCBHgJAz+8i5wl6FhLw+oT
@@ -20,46 +20,46 @@ cert_chain:
20
20
  D5vkU0YlAm1r98BymuJlcQ1qdkVEI1d48ph4kcS0S0nv1RiuyVb6TCAR3Nu3VaVq
21
21
  3fPzZKJLZBx67UvXdbdicWPiUR75elI4PXpLIic3xytaF52ZJYyKZCNZJhNwfQID
22
22
  AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU0nzow9vc
23
- 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAEjpaOXHHp8s/7GL2qCb
24
- YAs7urOLv9VHSPfQWAwaTMVnSsIf3Sw4xzISOP/mmfEPBPXtz61K5esrE/uTFtgb
25
- FyjxQk2H0sEWgrRXGGNHBWQRhhEs7LP/TByoC15A0br++xLxRz4r7HBLGAWQQDpg
26
- 66BJ2TBVjxS6K64tKbq7+ACyrOZGgTfNHACh4M076y0x0oRf/rwBrU39/KRfuhbb
27
- cm+nNCEtO35gTmZ2bVDHLGvWazi3gJt6+huQjfXTCUUG2YYBxwhu+GPdAGQPxpf9
28
- lkHilIrX69jq8wMPpBhlaw2mRmeSL50Wv5u6xVBvOHhXFSP1crXM95vfLhLyRYod
29
- W2A=
23
+ 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAJbbNyWzFjqUNVPPCUCo
24
+ IMrhDa9xf1xkORXNYYbmXgoxRy/KyNbUr+jgEEoWJAm9GXlcqxxWAUI6pK/i4/Qi
25
+ X6rPFEFmeObDOHNvuqy8Hd6AYsu+kP94U/KJhe9wnWGMmGoNKJNU3EkW3jM/osSl
26
+ +JRxiH5t4WtnDiVyoYl5nYC02rYdjJkG6VMxDymXTqn7u6HhYgZkGujq1UPar8x2
27
+ hNIWJblDKKSu7hA2d6+kUthuYo13o1sg1Da/AEDg0hoZSUvhqDEF5Hy232qb3pDt
28
+ CxDe2+VuChj4I1nvIHdu+E6XoEVlanUPKmSg6nddhkKn2gC45Kyzh6FZqnzH/CRp
29
+ RFE=
30
30
  -----END CERTIFICATE-----
31
- date: 2022-03-04 00:00:00.000000000 Z
31
+ date: 2022-04-10 00:00:00.000000000 Z
32
32
  dependencies:
33
33
  - !ruby/object:Gem::Dependency
34
- name: dry-container
34
+ name: auto_injector
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '0.8'
39
+ version: '0.4'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '0.8'
46
+ version: '0.4'
47
47
  - !ruby/object:Gem::Dependency
48
- name: git_plus
48
+ name: cogger
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '1.1'
53
+ version: '0.0'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.1'
60
+ version: '0.0'
61
61
  - !ruby/object:Gem::Dependency
62
- name: pastel
62
+ name: dry-container
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0.8'
75
+ - !ruby/object:Gem::Dependency
76
+ name: git_plus
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.1'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.1'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: refinements
77
91
  requirement: !ruby/object:Gem::Requirement
@@ -157,11 +171,12 @@ files:
157
171
  - exe/milestoner
158
172
  - lib/milestoner.rb
159
173
  - lib/milestoner/cli/actions/config.rb
174
+ - lib/milestoner/cli/actions/container.rb
175
+ - lib/milestoner/cli/actions/import.rb
160
176
  - lib/milestoner/cli/actions/publish.rb
161
177
  - lib/milestoner/cli/actions/status.rb
162
178
  - lib/milestoner/cli/parser.rb
163
179
  - lib/milestoner/cli/parsers/core.rb
164
- - lib/milestoner/cli/parsers/security.rb
165
180
  - lib/milestoner/cli/shell.rb
166
181
  - lib/milestoner/commits/categorizer.rb
167
182
  - lib/milestoner/configuration/content.rb
@@ -169,6 +184,7 @@ files:
169
184
  - lib/milestoner/configuration/loader.rb
170
185
  - lib/milestoner/container.rb
171
186
  - lib/milestoner/error.rb
187
+ - lib/milestoner/import.rb
172
188
  - lib/milestoner/presenters/commit.rb
173
189
  - lib/milestoner/tags/creator.rb
174
190
  - lib/milestoner/tags/publisher.rb
@@ -199,7 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
199
215
  - !ruby/object:Gem::Version
200
216
  version: '0'
201
217
  requirements: []
202
- rubygems_version: 3.3.8
218
+ rubygems_version: 3.3.11
203
219
  signing_key:
204
220
  specification_version: 4
205
221
  summary: A command line interface for crafting Git semantically versioned repository
metadata.gz.sig CHANGED
Binary file
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "refinements/structs"
4
-
5
- module Milestoner
6
- module CLI
7
- module Parsers
8
- # Handles parsing of Command Line Interface (CLI) security options.
9
- class Security
10
- using Refinements::Structs
11
-
12
- def self.call(...) = new(...).call
13
-
14
- def initialize configuration = Container[:configuration],
15
- client: Parser::CLIENT,
16
- container: Container
17
- @configuration = configuration
18
- @client = client
19
- @container = container
20
- end
21
-
22
- def call arguments = []
23
- client.separator "\nSECURITY OPTIONS:\n"
24
- add_sign
25
- client.parse arguments
26
- configuration
27
- end
28
-
29
- private
30
-
31
- attr_reader :configuration, :client, :container
32
-
33
- def add_sign
34
- client.on(
35
- "--[no-]sign",
36
- %(Sign with GPG key. Default: #{configuration.sign}.)
37
- ) do |value|
38
- compute_sign value
39
- end
40
- end
41
-
42
- def compute_sign value
43
- truth_table = [true, false].repeated_permutation(2).to_a
44
-
45
- case truth_table.index [value, configuration.sign]
46
- when 0..1 then configuration.merge! sign: true
47
- when 2..3 then configuration.merge! sign: false
48
- else logger.error { "--sign must be a boolean. Check gem configuration." }
49
- end
50
- end
51
-
52
- def logger = container[__method__]
53
- end
54
- end
55
- end
56
- end