vump 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.adoc +46 -0
- data/VERSION +1 -1
- data/lib/cli.rb +5 -4
- data/lib/vump.rb +19 -18
- data/lib/vump/semver/version_modules/file_modules/keepachangelog.rb +50 -0
- data/lib/vump/semver/version_modules/file_modules/npm.rb +29 -0
- data/lib/vump/semver/version_modules/file_modules/npm_lock.rb +15 -0
- data/lib/vump/semver/version_modules/file_modules/version_file.rb +26 -0
- data/lib/vump/semver/version_modules/read_write_version_module.rb +45 -0
- data/lib/vump/semver/version_modules/vcs_modules/git.rb +19 -0
- data/vump.gemspec +6 -1
- metadata +7 -6
- data/lib/vump/semver/module/keepachangelog.rb +0 -48
- data/lib/vump/semver/module/npm.rb +0 -27
- data/lib/vump/semver/module/npm_lock.rb +0 -13
- data/lib/vump/semver/module/version_file.rb +0 -24
- data/lib/vump/semver/read_write_version_module.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 613a312760f307d42f96f1019b0a884e23b6e91c
|
4
|
+
data.tar.gz: ab8ed5aa2d16a536805a697b09d9c1b1c06e2afe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8683c206999fab3d91440c675af837385b5b6e2a05c53af56811324d1f78155830a62fbb1fc8ad88708932ab119ebca6a79405a128aab1aee6e9c708e4eebc00
|
7
|
+
data.tar.gz: 7d5522467b1e8468f416075fb2795b3c62834b47b25823d698a3125398887614f0a22076ad6e1c061532bc2246919f9055bf11f2d0a112d52c91155bb1718564
|
data/README.adoc
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
Jaroslav Šmolík <grissius@gmail.com>
|
3
3
|
:semver: https://semver.org/[semver]
|
4
4
|
:git: https://git-scm.com/[git]
|
5
|
+
:rubychangelog: https://rubygems.org/gems/keepachangelog[keepachangelog]
|
6
|
+
|
7
|
+
image:https://travis-ci.org/grissius/vump.svg["Build Status", link="https://travis-ci.org/grissius/vump"]
|
8
|
+
image:https://img.shields.io/gem/v/vump.svg?style=flat[Gem Version, link="https://rubygems.org/gems/vump"]
|
9
|
+
image:https://img.shields.io/badge/yard-docs-blue.svg[Yard Docs, link="http://www.rubydoc.info/github/grissius/vump"]
|
5
10
|
|
6
11
|
CLI tool to easily manage projects using {semver} and automate menial version raising.
|
7
12
|
|
@@ -18,6 +23,15 @@ When working on a project with version management, increasing a version is a mun
|
|
18
23
|
|
19
24
|
Which is exhausting. If following any standards at all, like {semver}, keepachagnelog etc, it does not require any human input, but to decide which version to increase.
|
20
25
|
|
26
|
+
== Install
|
27
|
+
```
|
28
|
+
gem install vump
|
29
|
+
```
|
30
|
+
=== Requirements
|
31
|
+
|
32
|
+
* ruby >= 2.2
|
33
|
+
|
34
|
+
|
21
35
|
== Usage
|
22
36
|
In root of project directory, choose which version (from {semver}) to bump, and supply it as a sole argument.
|
23
37
|
```
|
@@ -39,3 +53,35 @@ WARNING: As the interface implies, your project must follow the {semver} specifi
|
|
39
53
|
`vump --version`:: Print program version
|
40
54
|
`vump --verbose patch`, `vump -v patch`:: Print debug logs
|
41
55
|
`vump --silent patch`, `vump -s patch`:: Print only warning and error logs
|
56
|
+
|
57
|
+
== Current modules
|
58
|
+
|
59
|
+
[WARNING]
|
60
|
+
====
|
61
|
+
Non-trivial modules do not operate on text, but parsed objects, which might result in ugly diffs after first usage.
|
62
|
+
|
63
|
+
If you encounter any fishy :fish: behaviour due to this let me know!
|
64
|
+
====
|
65
|
+
|
66
|
+
VERSION::
|
67
|
+
Find and bump version in `./VERSION` file.
|
68
|
+
+
|
69
|
+
* Expect just verison with whitepsaces around
|
70
|
+
* Write version followed by a newline.
|
71
|
+
|
72
|
+
Npm::
|
73
|
+
Find and bump version in `./package.json` file.
|
74
|
+
+
|
75
|
+
* Parse JSON, modify as object.
|
76
|
+
* Serialize back to JSON, append newline.
|
77
|
+
NpmLock::
|
78
|
+
Find and bump version in `./package-lock.json` file
|
79
|
+
+
|
80
|
+
* Same as Npm.
|
81
|
+
Keepachangelog::
|
82
|
+
Find and bump version in `./CHANGELOG.md` file.
|
83
|
+
+
|
84
|
+
* Parse changelog by {rubychangelog}.
|
85
|
+
* Add changes from `Unreleased` version to new release with current date.
|
86
|
+
* Add empty `Unreleased` version.
|
87
|
+
* Serialize back into markdown.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
data/lib/cli.rb
CHANGED
@@ -20,6 +20,7 @@ module Vump
|
|
20
20
|
opt.on('-v', '--verbose') { options[:verbose] = true }
|
21
21
|
opt.on('-s', '--silent') { options[:silent] = true }
|
22
22
|
end.parse!
|
23
|
+
setup(options)
|
23
24
|
[options, args]
|
24
25
|
end
|
25
26
|
|
@@ -52,13 +53,13 @@ module Vump
|
|
52
53
|
def self.start(argv)
|
53
54
|
options, args = parse_argv(argv)
|
54
55
|
if options[:version]
|
55
|
-
|
56
|
+
Vump.logger.info "vump #{Vump::VERSION}"
|
57
|
+
elsif options[:help]
|
58
|
+
Vump.logger.info Vump::SUMMARY
|
56
59
|
elsif valid_args(args)
|
57
60
|
Vump.orchestrate(args)
|
58
61
|
else
|
59
|
-
|
60
|
-
puts Vump::SUMMARY if options[:help]
|
61
|
-
puts 'vump <major|minor|patch>'
|
62
|
+
Vump.logger.info 'vump <major|minor|patch>'
|
62
63
|
end
|
63
64
|
end
|
64
65
|
end
|
data/lib/vump.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require File.expand_path('vump/semver/semver', __dir__)
|
2
|
-
Dir[File.expand_path('vump/semver/
|
2
|
+
Dir[File.expand_path('vump/semver/version_modules/file_modules/*.rb', __dir__)]
|
3
|
+
.each { |file| require file }
|
4
|
+
Dir[File.expand_path('vump/semver/version_modules/vcs_modules/*.rb', __dir__)]
|
3
5
|
.each { |file| require file }
|
4
6
|
require 'logger'
|
5
7
|
|
@@ -27,15 +29,15 @@ module Vump
|
|
27
29
|
end
|
28
30
|
|
29
31
|
def self.modules(base = Dir.pwd)
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
mods_vers = Vump::VersionModules::FileModules
|
33
|
+
.constants
|
34
|
+
.map { |m| Vump::VersionModules::FileModules.const_get(m) }
|
35
|
+
.select { |m| m.is_a? Class }
|
36
|
+
.map { |m| m.new(base) }
|
37
|
+
.map { |m| [m, m.read] }
|
38
|
+
.select { |_m, v| v }
|
37
39
|
# "unzip"
|
38
|
-
|
40
|
+
mods_vers.empty? ? [[], []] : mods_vers.transpose
|
39
41
|
end
|
40
42
|
|
41
43
|
# Format CLI output
|
@@ -49,18 +51,17 @@ module Vump
|
|
49
51
|
else
|
50
52
|
new_version = bump(args.first, Vump::Semver.new(current_versions.first))
|
51
53
|
v_modules.each { |m| m.write(new_version.to_s) }
|
52
|
-
|
54
|
+
Vump::VersionModules::VcsModules::Git.revise(v_modules, new_version)
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|
56
|
-
def self.git(modules, release_version)
|
57
|
-
return unless File.exist?(Dir.pwd + '/.git')
|
58
|
-
modules.each { |m| `git add #{m.path}` }
|
59
|
-
`git commit -m "Release #{release_version}"` unless modules.empty?
|
60
|
-
`git tag "v#{release_version}"`
|
61
|
-
end
|
62
|
-
|
63
58
|
# Module containing all worker modules to be executed on bump
|
64
|
-
module
|
59
|
+
module VersionModules
|
60
|
+
# All file read/write modules to be exectued
|
61
|
+
module FileModules
|
62
|
+
end
|
63
|
+
# All VCS modules to be exectued
|
64
|
+
module VcsModules
|
65
|
+
end
|
65
66
|
end
|
66
67
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'date'
|
3
|
+
require 'keepachangelog'
|
4
|
+
require_relative '../read_write_version_module'
|
5
|
+
require_relative '../../monkey/keepachangelog'
|
6
|
+
|
7
|
+
module Vump
|
8
|
+
module VersionModules
|
9
|
+
module FileModules
|
10
|
+
# [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
11
|
+
class KeepAChangeLog < Vump::VersionModules::ReadWriteVersionModule
|
12
|
+
def self.name
|
13
|
+
'CHANGELOG.md'
|
14
|
+
end
|
15
|
+
|
16
|
+
def path
|
17
|
+
@base + '/CHANGELOG.md'
|
18
|
+
end
|
19
|
+
|
20
|
+
def scrape(str)
|
21
|
+
Keepachangelog::MarkdownParser
|
22
|
+
.parse(str)['versions']
|
23
|
+
.keys
|
24
|
+
.reject { |v| v == 'Unreleased' }
|
25
|
+
.first
|
26
|
+
end
|
27
|
+
|
28
|
+
def compose(new_version)
|
29
|
+
content = Keepachangelog::MarkdownParser.parse(@read_contents)
|
30
|
+
content = release_changelog(content, new_version)
|
31
|
+
parser = Keepachangelog::Parser.new
|
32
|
+
parser.parsed_content = content
|
33
|
+
parser.to_md + "\n"
|
34
|
+
end
|
35
|
+
|
36
|
+
def release_changelog(changelog, new_version)
|
37
|
+
versions = changelog['versions']
|
38
|
+
# inherit all from unreleased
|
39
|
+
versions[new_version] = versions['Unreleased']
|
40
|
+
.clone
|
41
|
+
# update date
|
42
|
+
versions[new_version]['date'] = Date.today.to_s
|
43
|
+
# reset unreleased
|
44
|
+
versions['Unreleased']['changes'] = {}
|
45
|
+
changelog
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative '../read_write_version_module'
|
3
|
+
|
4
|
+
module Vump
|
5
|
+
module VersionModules
|
6
|
+
module FileModules
|
7
|
+
# Npm version module for package.json
|
8
|
+
class Npm < Vump::VersionModules::ReadWriteVersionModule
|
9
|
+
def self.name
|
10
|
+
'package.json'
|
11
|
+
end
|
12
|
+
|
13
|
+
def path
|
14
|
+
@base + '/package.json'
|
15
|
+
end
|
16
|
+
|
17
|
+
def scrape(str)
|
18
|
+
JSON.parse(str)['version']
|
19
|
+
end
|
20
|
+
|
21
|
+
def compose(new_version)
|
22
|
+
json = JSON.parse(@read_contents)
|
23
|
+
json['version'] = new_version
|
24
|
+
JSON.pretty_generate(json) + "\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../read_write_version_module'
|
2
|
+
|
3
|
+
module Vump
|
4
|
+
module VersionModules
|
5
|
+
module FileModules
|
6
|
+
# Module for VERSION file
|
7
|
+
class VersionFile < Vump::VersionModules::ReadWriteVersionModule
|
8
|
+
def self.name
|
9
|
+
'VERSION'
|
10
|
+
end
|
11
|
+
|
12
|
+
def path
|
13
|
+
@base + '/VERSION'
|
14
|
+
end
|
15
|
+
|
16
|
+
def scrape(str)
|
17
|
+
str.strip
|
18
|
+
end
|
19
|
+
|
20
|
+
def compose(new_version)
|
21
|
+
new_version + "\n"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Vump
|
2
|
+
module VersionModules
|
3
|
+
# Read write version module archetype
|
4
|
+
class ReadWriteVersionModule
|
5
|
+
def initialize(base)
|
6
|
+
@base = base
|
7
|
+
end
|
8
|
+
|
9
|
+
def read
|
10
|
+
name = self.class.name
|
11
|
+
if File.file?(path)
|
12
|
+
@read_contents = File.read(path)
|
13
|
+
ver = scrape(@read_contents)
|
14
|
+
Vump.logger.debug("#{name} read `#{ver}` from `#{path}`")
|
15
|
+
else
|
16
|
+
Vump.logger.debug("#{name} could not find `#{path}`")
|
17
|
+
end
|
18
|
+
ver
|
19
|
+
end
|
20
|
+
|
21
|
+
def write(new_version)
|
22
|
+
name = self.class.name
|
23
|
+
File.write(path, compose(new_version))
|
24
|
+
Vump.logger.debug("#{name} bumped to `#{new_version}` in `#{path}`")
|
25
|
+
Vump.logger.info("#{name} successfully bumped!")
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.name
|
29
|
+
raise NotImplementedError
|
30
|
+
end
|
31
|
+
|
32
|
+
def path
|
33
|
+
raise NotImplementedError
|
34
|
+
end
|
35
|
+
|
36
|
+
def scrape(_str)
|
37
|
+
raise NotImplementedError
|
38
|
+
end
|
39
|
+
|
40
|
+
def compose(_new_version)
|
41
|
+
raise NotImplementedError
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Vump
|
2
|
+
module VersionModules
|
3
|
+
module VcsModules
|
4
|
+
# Git VCS module
|
5
|
+
class Git
|
6
|
+
def self.revise(modules, release_version)
|
7
|
+
return unless File.exist?(Dir.pwd + '/.git')
|
8
|
+
modules.each { |m| `git add #{m.path}` }
|
9
|
+
msg = "Release #{release_version}"
|
10
|
+
tag = "v#{release_version}"
|
11
|
+
`git commit -m "#{msg}"` unless modules.empty?
|
12
|
+
Vump.logger.info "Git commit \"#{msg}\" created"
|
13
|
+
`git tag "#{tag}"`
|
14
|
+
Vump.logger.info "Git tag \"#{tag}\" created"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/vump.gemspec
CHANGED
@@ -14,7 +14,12 @@ Gem::Specification.new do |s|
|
|
14
14
|
Semantic version bumper. CLI tool to easily manage projects using semver and automate menial version raising.
|
15
15
|
DESCRIPTION
|
16
16
|
|
17
|
-
s.files
|
17
|
+
s.files = Dir['bin/*',
|
18
|
+
'lib/**/*',
|
19
|
+
'*.gemspec',
|
20
|
+
'LICENSE*',
|
21
|
+
'README*',
|
22
|
+
'VERSION']
|
18
23
|
s.executables = Dir['bin/*'].map { |f| File.basename(f) }
|
19
24
|
s.has_rdoc = 'yard'
|
20
25
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vump
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jaroslav Šmolík
|
@@ -80,13 +80,14 @@ files:
|
|
80
80
|
- lib/cli.rb
|
81
81
|
- lib/vump.rb
|
82
82
|
- lib/vump/meta.rb
|
83
|
-
- lib/vump/semver/module/keepachangelog.rb
|
84
|
-
- lib/vump/semver/module/npm.rb
|
85
|
-
- lib/vump/semver/module/npm_lock.rb
|
86
|
-
- lib/vump/semver/module/version_file.rb
|
87
83
|
- lib/vump/semver/monkey/keepachangelog.rb
|
88
|
-
- lib/vump/semver/read_write_version_module.rb
|
89
84
|
- lib/vump/semver/semver.rb
|
85
|
+
- lib/vump/semver/version_modules/file_modules/keepachangelog.rb
|
86
|
+
- lib/vump/semver/version_modules/file_modules/npm.rb
|
87
|
+
- lib/vump/semver/version_modules/file_modules/npm_lock.rb
|
88
|
+
- lib/vump/semver/version_modules/file_modules/version_file.rb
|
89
|
+
- lib/vump/semver/version_modules/read_write_version_module.rb
|
90
|
+
- lib/vump/semver/version_modules/vcs_modules/git.rb
|
90
91
|
- lib/vump/version.rb
|
91
92
|
- vump.gemspec
|
92
93
|
homepage: https://github.com/grissius/vump
|
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'date'
|
3
|
-
require 'keepachangelog'
|
4
|
-
require_relative '../read_write_version_module'
|
5
|
-
require_relative '../monkey/keepachangelog'
|
6
|
-
|
7
|
-
module Vump
|
8
|
-
module VersionModule
|
9
|
-
# [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
10
|
-
class KeepAChangeLog < ReadWriteVersionModule
|
11
|
-
def self.name
|
12
|
-
'CHANGELOG.md'
|
13
|
-
end
|
14
|
-
|
15
|
-
def path
|
16
|
-
@base + '/CHANGELOG.md'
|
17
|
-
end
|
18
|
-
|
19
|
-
def scrape(str)
|
20
|
-
Keepachangelog::MarkdownParser
|
21
|
-
.parse(str)['versions']
|
22
|
-
.keys
|
23
|
-
.reject { |v| v == 'Unreleased' }
|
24
|
-
.first
|
25
|
-
end
|
26
|
-
|
27
|
-
def compose(new_version)
|
28
|
-
content = Keepachangelog::MarkdownParser.parse(@read_contents)
|
29
|
-
content = release_changelog(content, new_version)
|
30
|
-
parser = Keepachangelog::Parser.new
|
31
|
-
parser.parsed_content = content
|
32
|
-
parser.to_md + "\n"
|
33
|
-
end
|
34
|
-
|
35
|
-
def release_changelog(changelog, new_version)
|
36
|
-
versions = changelog['versions']
|
37
|
-
# inherit all from unreleased
|
38
|
-
versions[new_version] = versions['Unreleased']
|
39
|
-
.clone
|
40
|
-
# update date
|
41
|
-
versions[new_version]['date'] = Date.today.to_s
|
42
|
-
# reset unreleased
|
43
|
-
versions['Unreleased']['changes'] = {}
|
44
|
-
changelog
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require_relative '../read_write_version_module'
|
3
|
-
|
4
|
-
module Vump
|
5
|
-
module VersionModule
|
6
|
-
# Npm version module for package.json
|
7
|
-
class Npm < ReadWriteVersionModule
|
8
|
-
def self.name
|
9
|
-
'package.json'
|
10
|
-
end
|
11
|
-
|
12
|
-
def path
|
13
|
-
@base + '/package.json'
|
14
|
-
end
|
15
|
-
|
16
|
-
def scrape(str)
|
17
|
-
JSON.parse(str)['version']
|
18
|
-
end
|
19
|
-
|
20
|
-
def compose(new_version)
|
21
|
-
json = JSON.parse(@read_contents)
|
22
|
-
json['version'] = new_version
|
23
|
-
JSON.pretty_generate(json) + "\n"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require_relative '../read_write_version_module'
|
2
|
-
|
3
|
-
module Vump
|
4
|
-
module VersionModule
|
5
|
-
# Module for VERSION file
|
6
|
-
class VersionFile < ReadWriteVersionModule
|
7
|
-
def self.name
|
8
|
-
'VERSION'
|
9
|
-
end
|
10
|
-
|
11
|
-
def path
|
12
|
-
@base + '/VERSION'
|
13
|
-
end
|
14
|
-
|
15
|
-
def scrape(str)
|
16
|
-
str.strip
|
17
|
-
end
|
18
|
-
|
19
|
-
def compose(new_version)
|
20
|
-
new_version + "\n"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module Vump
|
2
|
-
# Read write version module archetype
|
3
|
-
class ReadWriteVersionModule
|
4
|
-
def initialize(base)
|
5
|
-
@base = base
|
6
|
-
end
|
7
|
-
|
8
|
-
def read
|
9
|
-
name = self.class.name
|
10
|
-
if File.file?(path)
|
11
|
-
@read_contents = File.read(path)
|
12
|
-
ver = scrape(@read_contents)
|
13
|
-
Vump.logger.debug("#{name} read `#{ver}` from `#{path}`")
|
14
|
-
else
|
15
|
-
Vump.logger.debug("#{name} could not find `#{path}`")
|
16
|
-
end
|
17
|
-
ver
|
18
|
-
end
|
19
|
-
|
20
|
-
def write(new_version)
|
21
|
-
name = self.class.name
|
22
|
-
File.write(path, compose(new_version))
|
23
|
-
Vump.logger.debug("#{name} bumped to `#{new_version}` in `#{path}`")
|
24
|
-
Vump.logger.info("#{name} successfully bumped!")
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.name
|
28
|
-
raise NotImplementedError
|
29
|
-
end
|
30
|
-
|
31
|
-
def path
|
32
|
-
raise NotImplementedError
|
33
|
-
end
|
34
|
-
|
35
|
-
def scrape(_str)
|
36
|
-
raise NotImplementedError
|
37
|
-
end
|
38
|
-
|
39
|
-
def compose(_new_version)
|
40
|
-
raise NotImplementedError
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|