version_manager 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4567a65cab744ad2b8e0cba5546a907616df5f56
4
+ data.tar.gz: 90579a75079d72e8e2dbe1bc1dfb24e5a36bbfe1
5
+ SHA512:
6
+ metadata.gz: ba96ca3be67e8289b7b717b538bc997ea9409967bc5ac927c62ac852a586dc3de2492e8f53d02233c8693a3a52ffd8841a13e0eb0dad447e62027ca5f616bea5
7
+ data.tar.gz: d29871302090e70b2cf670ae3070727f204fc2839010b108fa373636620503ca4af52dfd75b39e793b7be6218f0b80c0494941f8125c0f7d611324eb4822e5ef
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # Version Manager
2
+
3
+ Automatically manage version updates and tagging. The new version will be written to your version file,
4
+ history file and as a tagged git commit.
5
+
6
+ ## Dependencies
7
+
8
+ * Ruby >= 2.2
9
+ * Rake
10
+
11
+ ## Installation
12
+
13
+ ```ruby
14
+
15
+ # In Gemfile
16
+
17
+ group :development do
18
+ gem "version_manager"
19
+ end
20
+
21
+ # In a Rake configuration file
22
+
23
+ require "version_manager/rake_task"
24
+
25
+ VersionManager::RakeTask.new(:release) do |config| # Argument is the namespace for tasks
26
+ config.version_file = "lib/version.rb" # Path to your version file
27
+ config.version_constant = "VERSION" # Version constant including namespaces
28
+ config.history_file = "history.rdoc" # History file to be updated
29
+ config.tag_format = "v%s" # %s will be replaced with the new version as tag names
30
+ config.logger = Logger.new # Replace the logger to turn off / modify stdout logging
31
+ end
32
+
33
+ ```
34
+
35
+ ## Usage
36
+
37
+ ```
38
+
39
+ bundle exec rake release:patch # Patch release eg 1.2.3 => 1.2.4
40
+ bundle exec rake release:minor # Minor release eg 1.2.3 => 1.3.0
41
+ bundle exec rake release:major # Major release eg 1.2.3 => 2.0.0
42
+
43
+ ```
44
+
45
+ ## Configuration
46
+
47
+ ### `config.version_file`
48
+
49
+ The file which will be passed to `load` in order to load your current version number. It should be an absoltue
50
+ file path or relative to your project's root
51
+
52
+ ### `config.version_constant`
53
+
54
+ The constant which will be loaded as the current version. For example, if your version number is in a module
55
+ called `MyModule` as the constant `MY_VERSION`, the `version_constant` would be `"MyModule::MY_VERSION"` (as a string)
56
+
57
+ ### `config.history_file`
58
+
59
+ Path to your history file. Currently only supports rdoc format.
60
+
61
+ ### `config.tag_format`
62
+
63
+ The format git tags will be given after version has been updated. `%s` will be replaced with the version number
64
+
65
+ ### `config.logger`
66
+
67
+ The logger to use when printing info messages. By default this just logs the messages with no formatting to STDOUT.
68
+ If you want to suppress logging you can just use `Logger.new "/dev/null"`
@@ -0,0 +1,29 @@
1
+ require "logger"
2
+
3
+ module VersionManager
4
+ class Configuration
5
+ attr_accessor :history_file, :version_file, :version_constant, :tag_format, :logger
6
+
7
+ def initialize
8
+ @logger = unformatter_logger
9
+ @history_file = "history.rdoc"
10
+ @tag_format = "v%s"
11
+ @version_file = "lib/version.rb"
12
+ @version_constant = "VERSION"
13
+ end
14
+
15
+ private
16
+
17
+ def unformatter_logger
18
+ logger = Logger.new STDOUT
19
+ logger.formatter = log_formatter
20
+ logger
21
+ end
22
+
23
+ def log_formatter
24
+ proc {|_severity, _datetime, _progname, msg|
25
+ msg + "\n"
26
+ }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ module VersionManager
2
+ module Git
3
+ module CLI
4
+ def add *files
5
+ `git add #{files.join(" ")}`
6
+ end
7
+
8
+ def commit message
9
+ `git commit -m '#{message}'`
10
+ end
11
+
12
+ def tag message
13
+ `git tag -am '#{message}' #{message}`
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ module VersionManager
2
+ module Git
3
+ module Stub
4
+ def add *files
5
+ @files = files
6
+ end
7
+
8
+ def commit message
9
+ @commit_message = message
10
+ end
11
+
12
+ def tag message
13
+ @tag_message = message
14
+ end
15
+
16
+ def files
17
+ @files
18
+ end
19
+
20
+ def commit_message
21
+ @commit_message
22
+ end
23
+
24
+ def tag_message
25
+ @tag_message
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ require "version_manager/git/cli"
2
+ require "version_manager/git/stub"
3
+
4
+ module VersionManager
5
+ module Git
6
+ extend CLI
7
+
8
+ def self.stub_api
9
+ singleton_class.prepend VersionManager::Git::Stub
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,27 @@
1
+ require "rake/tasklib"
2
+ require "version_manager"
3
+ require "version_manager/version_updater"
4
+
5
+ module VersionManager
6
+ class RakeTask < Rake::TaskLib
7
+ EXAMPLES = {
8
+ major: "1.2.3 => 2.0.0",
9
+ minor: "1.2.3 => 1.3.0",
10
+ patch: "1.2.3 => 1.2.4",
11
+ }.freeze
12
+
13
+ # rubocop: disable Metrics/MethodLength
14
+ def initialize task_namespace = :release
15
+ yield(VersionManager.configuration) if block_given?
16
+ namespace task_namespace do
17
+ [:major, :minor, :patch].each do |v|
18
+ desc "Increment your #{v} version number eg #{EXAMPLES[v]}"
19
+ task v do
20
+ VersionUpdater.new.call(v)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ # rubocop: enable all
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module VersionManager
2
+ VERSION = "1.0.0".freeze
3
+ end
@@ -0,0 +1,10 @@
1
+ require "version_manager/version_number"
2
+
3
+ module VersionManager
4
+ class VersionFinder
5
+ def call
6
+ load VersionManager.configuration.version_file
7
+ VersionNumber.new Object.const_get(VersionManager.configuration.version_constant)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,33 @@
1
+ module VersionManager
2
+ class VersionNumber
3
+ attr_reader :major, :minor, :patch, :starting_version
4
+
5
+ def initialize version_string
6
+ @starting_version = version_string
7
+ @major, @minor, @patch = version_string.split(".").map(&:to_i)
8
+ end
9
+
10
+ def inc_major
11
+ @major += 1
12
+ @minor = 0
13
+ @patch = 0
14
+ end
15
+
16
+ def inc_minor
17
+ @minor += 1
18
+ @patch = 0
19
+ end
20
+
21
+ def inc_patch
22
+ @patch += 1
23
+ end
24
+
25
+ def to_s
26
+ "#{@major}.#{@minor}.#{@patch}"
27
+ end
28
+
29
+ def to_tag
30
+ VersionManager.configuration.tag_format % to_s
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ require "version_manager/git"
2
+
3
+ module VersionManager
4
+ class VersionTagger
5
+ def call version
6
+ logger.info "Committing and tagging..."
7
+ tag version
8
+ logger.info "Done"
9
+ logger.info "Run `git push origin master --tags` to deploy your new tag (#{version.to_tag})"
10
+ end
11
+
12
+ private
13
+
14
+ def tag version
15
+ Git.add history_file, version_file
16
+ Git.commit "Update version to #{version.to_tag}"
17
+ Git.tag version.to_tag
18
+ end
19
+
20
+ def history_file
21
+ VersionManager.configuration.history_file
22
+ end
23
+
24
+ def version_file
25
+ VersionManager.configuration.version_file
26
+ end
27
+
28
+ def logger
29
+ VersionManager.configuration.logger
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,12 @@
1
+ require "version_manager/version_finder"
2
+ require "version_manager/version_writer"
3
+
4
+ module VersionManager
5
+ class VersionUpdater
6
+ def call update_type
7
+ v = VersionFinder.new.call
8
+ v.send(:"inc_#{update_type}")
9
+ VersionWriter.new.call v
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,31 @@
1
+ require "version_manager/version_tagger"
2
+
3
+ module VersionManager
4
+ class VersionWriter
5
+ def call version
6
+ File.write version_file, updated_version_file(version)
7
+ File.write history_file, updated_history_file(version) if File.exist?(history_file)
8
+ VersionTagger.new.call version
9
+ end
10
+
11
+ def updated_version_file new_version
12
+ File.read(version_file).gsub(new_version.starting_version, new_version.to_s)
13
+ end
14
+
15
+ def updated_history_file new_version
16
+ current_history = File.read history_file
17
+ date = Date.today.strftime("%d %B %Y")
18
+ "== #{new_version.to_tag} (#{date})\n\n#{current_history}"
19
+ end
20
+
21
+ private
22
+
23
+ def history_file
24
+ VersionManager.configuration.history_file
25
+ end
26
+
27
+ def version_file
28
+ VersionManager.configuration.version_file
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,7 @@
1
+ require "version_manager/configuration"
2
+
3
+ module VersionManager
4
+ def self.configuration
5
+ @configuration ||= Configuration.new
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: version_manager
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Tom Bowden
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '12.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '12.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.12'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.12'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.47'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.47'
69
+ - !ruby/object:Gem::Dependency
70
+ name: cucumber
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.4'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.4'
83
+ description: Increment your project's version and history file automatically
84
+ email: tom.b1992@gmail.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - README.md
90
+ - lib/version_manager.rb
91
+ - lib/version_manager/configuration.rb
92
+ - lib/version_manager/git.rb
93
+ - lib/version_manager/git/cli.rb
94
+ - lib/version_manager/git/stub.rb
95
+ - lib/version_manager/rake_task.rb
96
+ - lib/version_manager/version.rb
97
+ - lib/version_manager/version_finder.rb
98
+ - lib/version_manager/version_number.rb
99
+ - lib/version_manager/version_tagger.rb
100
+ - lib/version_manager/version_updater.rb
101
+ - lib/version_manager/version_writer.rb
102
+ homepage: http://github.com/tpbowden/version_manager.git
103
+ licenses:
104
+ - MIT
105
+ metadata: {}
106
+ post_install_message:
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: 2.2.0
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 2.4.5.2
123
+ signing_key:
124
+ specification_version: 4
125
+ summary: Convenience tasks for version management
126
+ test_files: []