vump 1.0.2 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fcf27e70f95a805688552dc9d1647403860b6398
4
- data.tar.gz: 82e6414209deebbc5ed2863b2701c8c59b702e25
3
+ metadata.gz: 613a312760f307d42f96f1019b0a884e23b6e91c
4
+ data.tar.gz: ab8ed5aa2d16a536805a697b09d9c1b1c06e2afe
5
5
  SHA512:
6
- metadata.gz: 58da967536c9c45c6b93b92b6d36ec0cdb26af1b41317c4a08aabef486d66bf1f6045c16f0fec29bacfa30bf9ab7ac361cd1609b7566f4c0734907bddf699e16
7
- data.tar.gz: 03b909422251c88ccac0264960b6b7d1e92e6a96db3cd937eaf6fb2417373129023434cfc61ef3eb765174f9638eff8feeb0e918e4f8ba5f2d1e27b60a7c0cc5
6
+ metadata.gz: 8683c206999fab3d91440c675af837385b5b6e2a05c53af56811324d1f78155830a62fbb1fc8ad88708932ab119ebca6a79405a128aab1aee6e9c708e4eebc00
7
+ data.tar.gz: 7d5522467b1e8468f416075fb2795b3c62834b47b25823d698a3125398887614f0a22076ad6e1c061532bc2246919f9055bf11f2d0a112d52c91155bb1718564
@@ -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.2
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
- puts "vump #{Vump::VERSION}"
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
- puts 'Error: invalid version part to bump.' unless args.empty?
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
@@ -1,5 +1,7 @@
1
1
  require File.expand_path('vump/semver/semver', __dir__)
2
- Dir[File.expand_path('vump/semver/module/*.rb', __dir__)]
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
- modules_versions = Vump::VersionModule
31
- .constants
32
- .map { |m| Vump::VersionModule.const_get(m) }
33
- .select { |m| m.is_a? Class }
34
- .map { |m| m.new(base) }
35
- .map { |m| [m, m.read] }
36
- .select { |_m, v| v }
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
- modules_versions.empty? ? [[], []] : modules_versions.transpose
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
- git(v_modules, new_version)
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 VersionModule
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,15 @@
1
+ require 'json'
2
+ require_relative 'npm'
3
+
4
+ module Vump
5
+ module VersionModules
6
+ module FileModules
7
+ # Npm version module for package.json
8
+ class NpmLock < Npm
9
+ def path
10
+ @base + '/package-lock.json'
11
+ end
12
+ end
13
+ end
14
+ end
15
+ 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
@@ -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 = Dir['bin/*', 'lib/**/*', '*.gemspec', 'LICENSE*', 'README*', 'VERSION']
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.2
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,13 +0,0 @@
1
- require 'json'
2
- require_relative 'npm'
3
-
4
- module Vump
5
- module VersionModule
6
- # Npm version module for package.json
7
- class NpmLock < Npm
8
- def path
9
- @base + '/package-lock.json'
10
- end
11
- end
12
- end
13
- 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