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 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