version-manager 0.0.4 → 0.0.5

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: 72195cbb7ffb69504dab8393c3b7713cf4f173b9
4
- data.tar.gz: 3e9b007594d46581a634e4b14b5ef782b1fbe4e7
3
+ metadata.gz: eb8ca0a693505ca6d8683707210fb91d1ee4de14
4
+ data.tar.gz: 65aba765dfb701b27f0ca76295dcc85139647019
5
5
  SHA512:
6
- metadata.gz: 803379762fe18a68559d8ef860d104023112fc982652b7045d52e47cdc1f2f191be27a6fded89c494ca1b3ab6597c9fd17389f31f54c480d80250b225471a285
7
- data.tar.gz: 1c3a3864efc1cc6d1e7ce2c8d2d959cd9b0463e2275ce67cf5b62259eb44bdb96eceed36da31f573249b6b6aecd3f2839a02a871b48210c21ff93da6c5e41928
6
+ metadata.gz: ff3cbeb177bcc900da57fb05ea24c8c848691542f672f054d0ebf91364a884c567db021531e42940072b82dd1fe7e6314edce6129289d0b2ec4b6fa244427bda
7
+ data.tar.gz: 678bd6b32fcddec75f4ce89ead9fc5530dad52d9e43a9916fa82566310c59cd92f5a42d8a98af72f3f9cb45101b79c20b13c6435854030f3ab45935c5ffd5c8b
data/README.md CHANGED
@@ -1,2 +1,22 @@
1
1
  # version-manager
2
2
  versioning lib (with Git support) written in Ruby
3
+
4
+ ## Information:
5
+ The gem purpose is to automate process of releasing a new version. It can be used with [semver](http://semver.org/).
6
+ There are three version components: major, minor and patch (MAJOR.MINOR.PATCH).
7
+ Major and minor versions should be updated from the master branch. Patch version should be updated from the release branch.
8
+ By default, release version has a format like: release-MAJOR.MINOR.
9
+ Also, a tag is being created alongside with a branch. It has a format like: MAJOR.MINOR.PATCH.
10
+
11
+ ## Installation:
12
+ gem install version-manager
13
+
14
+ ## Usage:
15
+
16
+ ### Bump a new version:
17
+ manver make major
18
+ manver make minor
19
+ manver make patch
20
+
21
+ ### Switch to the latest version:
22
+ manver latest
@@ -2,6 +2,7 @@ require 'docopt'
2
2
  require 'git'
3
3
  require 'pathname'
4
4
  require 'logger'
5
+ require 'inquirer'
5
6
 
6
7
  ROOT_DIR = Dir.pwd
7
8
 
@@ -12,8 +13,7 @@ module VersionManager
12
13
  default_commit_message: -> (version) { "Bumped to version #{version}" },
13
14
  options: {
14
15
  remote: 'origin',
15
- master_branch: 'master',
16
- log: Logger.new(STDOUT)
16
+ master_branch: 'master'
17
17
  }
18
18
  },
19
19
  authorized_branches: {
@@ -44,14 +44,20 @@ module VersionManager
44
44
  storage = build_storage
45
45
  version = storage.latest_version
46
46
  return puts 'There are no any versions.' unless version
47
- VCS.build.checkout(version.branch)
47
+ VCS.build.switch_branch(version.branch)
48
48
  end
49
49
 
50
50
  def make_release(release_type)
51
51
  storage = build_storage
52
52
  version = storage.latest_version
53
+
54
+ new_version = version.public_send("bump_#{release_type}")
55
+ return if version && !Ask.confirm("You are going to upgrade version to #{new_version}. Do it? [Y/n]", default: false)
53
56
  version = retrieve_initial_version unless version
57
+
54
58
  Make.new(version, VCS.build, storage).public_send("#{release_type}!")
59
+ rescue VersionManager::VersionStorage::WrongLatestVersionError => e
60
+ puts "There is inappropriate version #{e.version} in your local/remote repository. Please remove it"
55
61
  end
56
62
 
57
63
  def build_storage
@@ -21,19 +21,19 @@ module VersionManager
21
21
  def major!
22
22
  raise BranchIsNotUpToDateError unless vcs.master_state_actual?
23
23
  raise ForbiddenBranchError unless appropriate_branch_for?('major')
24
- default_strategy { |version| version.bump_major }
24
+ default_strategy { version.bump_major }
25
25
  end
26
26
 
27
27
  def minor!
28
28
  raise BranchIsNotUpToDateError unless vcs.master_state_actual?
29
29
  raise ForbiddenBranchError unless appropriate_branch_for?('minor')
30
- default_strategy { |version| version.bump_minor }
30
+ default_strategy { version.bump_minor }
31
31
  end
32
32
 
33
33
  def patch!
34
34
  raise BranchIsNotUpToDateError unless vcs.state_actual?
35
35
  raise ForbiddenBranchError unless appropriate_branch_for?('patch')
36
- version.bump_patch
36
+ version = version.bump_patch
37
37
  vcs.commit(version_storage.store(version), default_commit_message)
38
38
  vcs.add_tag(version.to_s, default_commit_message)
39
39
  vcs.push_tag(version.to_s)
@@ -50,7 +50,7 @@ module VersionManager
50
50
  end
51
51
 
52
52
  def default_strategy
53
- yield version
53
+ @version = yield
54
54
  vcs.create_branch!(version.branch)
55
55
  vcs.commit(version_storage.store(version), default_commit_message)
56
56
  vcs.add_tag(version.to_s, default_commit_message)
@@ -8,10 +8,10 @@ module VersionManager
8
8
  end
9
9
  end
10
10
 
11
- def initialize(version_input)
12
- version_components = version_input.dup
13
- unless version_input.respond_to?(:to_ary)
14
- version_components = version_input.scan(/(\d+)\.{1}(\d+)\.?(\d*)(?:--(\w+))?/).flatten
11
+ def initialize(*version_input)
12
+ version_components = Array(version_input.dup.flatten)
13
+ if version_components.size == 1
14
+ version_components = version_components.first.scan(/(\d+)\.{1}(\d+)\.?(\d*)(?:--(\w+))?/).flatten
15
15
  raise ArgumentError, 'Incorrect version format' if version_components.all?(&:nil?) || version_components.empty?
16
16
  end
17
17
  @major, @minor, @patch = version_components[0..2].map(&:to_i)
@@ -39,22 +39,20 @@ module VersionManager
39
39
  find { |res| res != 0 } || 0
40
40
  end
41
41
 
42
+ def -(other_version)
43
+ self.class.new(parts.zip(other_version.parts).map { |x, y| x - y })
44
+ end
45
+
42
46
  def bump_major
43
- @major += 1
44
- @minor = 0
45
- @patch = 0
46
- recalculate_parts
47
+ self.class.new(@major + 1, 0, 0)
47
48
  end
48
49
 
49
50
  def bump_minor
50
- @minor += 1
51
- @patch = 0
52
- recalculate_parts
51
+ self.class.new(@major, @minor + 1, 0)
53
52
  end
54
53
 
55
54
  def bump_patch
56
- @patch += 1
57
- recalculate_parts
55
+ self.class.new(@major, @minor, @patch + 1)
58
56
  end
59
57
 
60
58
  def self.valid?(version)
@@ -69,6 +67,7 @@ module VersionManager
69
67
 
70
68
  def recalculate_parts
71
69
  @parts = [major, minor, patch].map(&:to_i)
70
+ self
72
71
  end
73
72
  end
74
73
  end
@@ -15,6 +15,10 @@ module VersionManager
15
15
  git.branch(branch_name).checkout
16
16
  end
17
17
 
18
+ def switch_branch(branch_name) # checkout moves commits to new branch
19
+ git.lib.send(:command, 'checkout', branch_name)
20
+ end
21
+
18
22
  def show_file(branch, filepath)
19
23
  git.object("#{branch}:#{filepath}").contents
20
24
  rescue StandardError
@@ -1,3 +1,3 @@
1
1
  module VersionManager
2
- VERSION = '0.0.4'.freeze
2
+ VERSION = '0.0.5'.freeze
3
3
  end
@@ -1,5 +1,12 @@
1
1
  module VersionManager
2
2
  class VersionStorage
3
+ class WrongLatestVersionError < StandardError
4
+ attr_reader :version
5
+ def initialize(version)
6
+ @version = version
7
+ end
8
+ end
9
+
3
10
  def initialize(vcs, storage_options)
4
11
  @filename = storage_options[:filename]
5
12
  @filepath = storage_options[:filepath]
@@ -18,7 +25,7 @@ module VersionManager
18
25
  name = name.split('/').last
19
26
  ReleaseVersion.new(name) if name.include?('release-') && ReleaseVersion.valid?(name)
20
27
  end
21
- version = versions.compact.sort.last
28
+ version = select_appropriate_version(versions)
22
29
  file_content = vcs.show_file(version.branch, relative_path) if version
23
30
  version = ReleaseVersion.new(file_content) if file_content && ReleaseVersion.valid?(file_content)
24
31
  version
@@ -35,5 +42,17 @@ module VersionManager
35
42
  def full_path
36
43
  File.expand_path(File.join(filepath, filename))
37
44
  end
45
+
46
+ def select_appropriate_version(versions)
47
+ sorted_versions = versions.compact.sort
48
+ prev_last_version, last_version = sorted_versions.last(2)
49
+ return prev_last_version unless last_version
50
+ diff = last_version - prev_last_version
51
+ is_appropriate = diff.major == 1
52
+ is_appropriate ||= diff.major == 0 && diff.minor == 1
53
+ is_appropriate ||= diff.major == 0 && diff.minor == 0 && diff.patch == 1
54
+ raise WrongLatestVersionError.new(last_version) unless is_appropriate
55
+ last_version
56
+ end
38
57
  end
39
58
  end
@@ -21,5 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency 'bundler', '~> 1.12'
22
22
  spec.add_development_dependency 'rake', '~> 10.0'
23
23
  spec.add_dependency 'docopt', '~> 0.5'
24
+ spec.add_dependency 'inquirer', '~> 0.2'
24
25
  spec.add_dependency 'git', '~> 1.3'
25
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: version-manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - isolo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-28 00:00:00.000000000 Z
11
+ date: 2017-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: inquirer
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.2'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: git
57
71
  requirement: !ruby/object:Gem::Requirement