YAVM 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f61250eb85d9a2e91c9e678d3a778af73077f1c
4
+ data.tar.gz: ce292887c4595dbeb3076e714dfe02aadebff7fa
5
+ SHA512:
6
+ metadata.gz: 8807b0ea3cfd119a4e50230f0fb8622216d2c5f7522975599f14338fa116bdda25a0f9743f6bd68283f026ba4fea174384b638cdda4593e942e0b00e8c92378e
7
+ data.tar.gz: dc0afe74765d1e989fb5a39f5e18d48bc29fa20cbb20d52009b71b4c4f57afaccad86398b1c8e4c70b56dbda374ed5c952637f541bd32b84515ba43585a97fa9
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # YAVM: Yet Another Version Manager
2
+
3
+ A tiny gem for managing project version numbers.
4
+
5
+ Heavily inspired by the `semver` gem, this is a tiny utility for managing version numbers,
6
+ which includes support for multiple version format stores:
7
+
8
+ * The `semver` gem's `.semver` file
9
+ * node.js `package.json` files
10
+ * bower `bower.json` files
11
+ * ruby `.gemspec` files
12
+
13
+ With planned support for:
14
+
15
+ * Python distutils package support
16
+
17
+ # Usage
18
+
19
+ *Exhaustive usage patterns can be found at `version help`*
20
+
21
+ ``` shell
22
+ # Install
23
+ $ gem install yavm
24
+
25
+ # In a language/framework without a supported versioning system:
26
+ $ version init
27
+ $ version # => 0.0.0
28
+
29
+ # In an existing project with supported versioning:
30
+ version # => 0.2.0
31
+
32
+ # Basic Usage
33
+ $ version inc minor # => 0.3.0
34
+ $ version inc major # => 1.0.0
35
+ $ version special pre4 # => 1.0.0-pre4
36
+ $ version special # => 1.0.0
37
+ $ version meta 20141113 # => 1.0.0 (meta not displayed by default)
38
+ $ version tag # => v1.0.0+20141113 (useful for version control)
39
+ $ version format "%M.%m" # => 1.0
40
+ ```
41
+
42
+ ## Available Format Tags
43
+
44
+ Tag | Meaning
45
+ ----|---------------------
46
+ %M | **M**ajor
47
+ %m | **M**inor
48
+ %p | **P**atch
49
+ %s | **S**pecial
50
+ %t | Me**t**a
51
+ %% | Literal % Character
52
+
53
+ ## Conflict Resolution
54
+
55
+ If your project contains multiple supported version "stores", YAVM will keep them in sync.
56
+ If they go out of sync outside of YAVM, you will be prompted to pick the canonical/authoritative
57
+ version, and all other stores will be updated.
58
+
59
+ ``` text
60
+ $ version
61
+ Multiple version stores are in use, and aren't consistent.
62
+ Please select the authoritative version:
63
+
64
+ WARNING: File munging is dangerous. A manual resolution might be safer.
65
+
66
+ 1: 1.0.0 [.semver file]
67
+ 2: 1.0.3 [bower.json file]
68
+ 3: 0.0.0 [gemspec: ./yavm.gemspec]
69
+
70
+ Selection: 2
71
+ Now on 1.0.3
72
+ ```
73
+
74
+ # Roadmap
75
+
76
+ ## Features
77
+
78
+ - [x] show version
79
+ - [x] increment
80
+ - [x] set special
81
+ - [x] set meta
82
+ - [x] formatting
83
+ - [x] tags
84
+ - [x] help
85
+ - [x] package.json support
86
+ - [x] bower.json support
87
+ - [ ] when changing version, show new one
88
+ - [ ] programmatic interface
89
+ - [ ] tests
90
+ - [ ] handle invalid version info (see Version#parse)
91
+ - [ ] 'version init'
92
+ - [ ] quick mode (when finding versions - short circuit once one is found)
93
+ - [ ] raise sensible exceptions
data/bin/version ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path('../lib/', __FILE__)
4
+ $:.unshift lib unless $:.include?(lib)
5
+
6
+ lib = File.expand_path('../../lib/', __FILE__)
7
+ $:.unshift lib unless $:.include?(lib)
8
+
9
+
10
+ require 'yavm/command_line'
11
+
12
+ begin
13
+ command_line = YAVM::CommandLine.new
14
+ command_line.invoke!
15
+ rescue Docopt::Exit => e
16
+ puts e.message
17
+ end
data/lib/yavm.rb ADDED
@@ -0,0 +1,25 @@
1
+ lib = File.dirname(__FILE__)
2
+ $:.unshift lib unless $:.include?(lib)
3
+
4
+ require 'yavm/version'
5
+ require 'yavm/stores'
6
+
7
+ module YAVM
8
+
9
+ def find(quiet = true)
10
+ versions = YAVM::Stores.locate_versions
11
+
12
+ if versions.equal?
13
+ return versions.first
14
+ else
15
+ return nil if quiet
16
+
17
+ raise RuntimeError, ''
18
+
19
+ end
20
+
21
+ end
22
+
23
+ module_function :find
24
+
25
+ end
@@ -0,0 +1,93 @@
1
+ # YAVM: Yet Another Version Manager
2
+
3
+ A tiny gem for managing project version numbers.
4
+
5
+ Heavily inspired by the `semver` gem, this is a tiny utility for managing version numbers,
6
+ which includes support for multiple version format stores:
7
+
8
+ * The `semver` gem's `.semver` file
9
+ * node.js `package.json` files
10
+ * bower `bower.json` files
11
+ * ruby `.gemspec` files
12
+
13
+ With planned support for:
14
+
15
+ * Python distutils package support
16
+
17
+ # Usage
18
+
19
+ *Exhaustive usage patterns can be found at `version help`*
20
+
21
+ ``` shell
22
+ # Install
23
+ $ gem install yavm
24
+
25
+ # In a language/framework without a supported versioning system:
26
+ $ version init
27
+ $ version # => 0.0.0
28
+
29
+ # In an existing project with supported versioning:
30
+ version # => 0.2.0
31
+
32
+ # Basic Usage
33
+ $ version inc minor # => 0.3.0
34
+ $ version inc major # => 1.0.0
35
+ $ version special pre4 # => 1.0.0-pre4
36
+ $ version special # => 1.0.0
37
+ $ version meta 20141113 # => 1.0.0 (meta not displayed by default)
38
+ $ version tag # => v1.0.0+20141113 (useful for version control)
39
+ $ version format "%M.%m" # => 1.0
40
+ ```
41
+
42
+ ## Available Format Tags
43
+
44
+ Tag | Meaning
45
+ ----|---------------------
46
+ %M | **M**ajor
47
+ %m | **M**inor
48
+ %p | **P**atch
49
+ %s | **S**pecial
50
+ %t | Me**t**a
51
+ %% | Literal % Character
52
+
53
+ ## Conflict Resolution
54
+
55
+ If your project contains multiple supported version "stores", YAVM will keep them in sync.
56
+ If they go out of sync outside of YAVM, you will be prompted to pick the canonical/authoritative
57
+ version, and all other stores will be updated.
58
+
59
+ ``` text
60
+ $ version
61
+ Multiple version stores are in use, and aren't consistent.
62
+ Please select the authoritative version:
63
+
64
+ WARNING: File munging is dangerous. A manual resolution might be safer.
65
+
66
+ 1: 1.0.0 [.semver file]
67
+ 2: 1.0.3 [bower.json file]
68
+ 3: 0.0.0 [gemspec: ./yavm.gemspec]
69
+
70
+ Selection: 2
71
+ Now on 1.0.3
72
+ ```
73
+
74
+ # Roadmap
75
+
76
+ ## Features
77
+
78
+ - [x] show version
79
+ - [x] increment
80
+ - [x] set special
81
+ - [x] set meta
82
+ - [x] formatting
83
+ - [x] tags
84
+ - [x] help
85
+ - [x] package.json support
86
+ - [x] bower.json support
87
+ - [ ] when changing version, show new one
88
+ - [ ] programmatic interface
89
+ - [ ] tests
90
+ - [ ] handle invalid version info (see Version#parse)
91
+ - [ ] 'version init'
92
+ - [ ] quick mode (when finding versions - short circuit once one is found)
93
+ - [ ] raise sensible exceptions
@@ -0,0 +1,150 @@
1
+ require 'docopt'
2
+ require 'yavm/stores'
3
+
4
+ module YAVM
5
+ class CommandLine
6
+
7
+ def initialize
8
+ @invocation = File.basename($0)
9
+ end
10
+
11
+ def invoke!
12
+ @args = Docopt::docopt(doc)
13
+ command = @args.select { |a, v| commands.include?(a) && v }.keys.first
14
+ command = 'show' if command.nil?
15
+
16
+ versions = YAVM::Stores.locate_versions
17
+
18
+ if versions.empty? && !@args['init']
19
+ puts "There doesn't seem to be any versioning information on this project."
20
+ puts "Use native versioning tools (see docs for support), or run `#{@invocation} init`"
21
+ puts "to use the default versioning method."
22
+ exit(1)
23
+ end
24
+
25
+ # Commands which use the version information require it to be consistent
26
+ if version_commands.include? command
27
+ choose_authoritative!(versions) unless versions.equal?
28
+ version = versions.first
29
+ end
30
+
31
+ case command
32
+ when 'show'
33
+ puts "#{version}"
34
+
35
+ when 'inc'
36
+ if @args['major']
37
+ version.major += 1
38
+ version.minor = version.patch = 0
39
+ version.special = version.meta = nil
40
+
41
+ elsif @args['minor']
42
+ version.minor += 1
43
+ version.patch = 0
44
+ version.special = version.meta = nil
45
+
46
+ elsif @args['patch']
47
+ version.patch += 1
48
+ version.special = version.meta = nil
49
+
50
+ end
51
+
52
+ versions.set_all!(version)
53
+
54
+ when 'special'
55
+ version.special = @args['<string>']
56
+
57
+ versions.set_all!(version)
58
+
59
+ when 'meta'
60
+ version.meta = @args['<string>']
61
+
62
+ versions.set_all!(version)
63
+
64
+ when 'format'
65
+ puts "#{version.format(@args['<string>'])}"
66
+
67
+ when 'tag'
68
+ puts "#{version.tag}"
69
+
70
+ when 'help'
71
+ Docopt::Exit.set_usage(nil)
72
+ raise Docopt::Exit, doc.strip
73
+ end
74
+
75
+ end
76
+
77
+ private
78
+
79
+ def choose_authoritative!(versions)
80
+ puts "Multiple version stores are in use, and aren't consistent."
81
+ puts " Please select the authoritative version:\n\n"
82
+ puts "WARNING: File munging is dangerous. A manual resolution might be safer.\n\n"
83
+
84
+ selection = ''
85
+
86
+ while selection.is_a? String
87
+ versions.each_with_index do |version, index|
88
+ puts " %3s: %-15s [%s]" % [index+1, version, version.store.name]
89
+ end
90
+
91
+ print "\nSelection: "
92
+ selection = STDIN.gets.chomp
93
+
94
+ if selection.to_i.to_s == selection && (1..versions.size) === selection.to_i
95
+ selection = selection.to_i
96
+ break
97
+ end
98
+ end
99
+
100
+ authoritative_version = versions[selection.to_i - 1]
101
+
102
+ versions.set_all!(authoritative_version)
103
+
104
+ puts "Now on #{authoritative_version}"
105
+ exit(0)
106
+
107
+ end
108
+
109
+ def doc
110
+ <<-DOCOPT.gsub(/^ {6}/, '')
111
+ YAVM. Yet Another Version Manager
112
+
113
+ Usage:
114
+ #{@invocation}
115
+ #{@invocation} inc (major|minor|patch)
116
+ #{@invocation} special [<string>]
117
+ #{@invocation} meta [<string>]
118
+ #{@invocation} format <string>
119
+ #{@invocation} tag
120
+ #{@invocation} help
121
+
122
+ Options:
123
+ inc Increment a specific version number
124
+ special Set a special (eg: pre-release) suffix
125
+ meta Set a metadata version suffix
126
+ format Display version in specific format (%M, %m, %p, %s, %t)
127
+ tag Equivalent to format 'v%M.%m.%p%s'
128
+ help Show this screen.
129
+
130
+ DOCOPT
131
+ end
132
+
133
+ #
134
+ # A list of arguments which should be considered commands.
135
+ # We should only ever see one of these at a time, typically.
136
+ #
137
+ def commands
138
+ version_commands + support_commands
139
+ end
140
+
141
+ def version_commands
142
+ ['show', 'inc', 'special', 'meta', 'format', 'tag']
143
+ end
144
+
145
+ def support_commands
146
+ ['help']
147
+ end
148
+
149
+ end
150
+ end
@@ -0,0 +1,31 @@
1
+ require 'yavm/versions'
2
+
3
+ require 'yavm/stores/semver'
4
+ require 'yavm/stores/package'
5
+ require 'yavm/stores/bower'
6
+ require 'yavm/stores/gem_spec'
7
+
8
+ module YAVM
9
+ module Stores
10
+
11
+ def stores
12
+ [
13
+ YAVM::Stores::Semver,
14
+ YAVM::Stores::Package,
15
+ YAVM::Stores::Bower,
16
+ YAVM::Stores::GemSpec,
17
+ ]
18
+ end
19
+
20
+ def locate_versions
21
+ versions = stores.map do |store|
22
+ store = store.new
23
+ next store.to_version if store.exists?
24
+ end
25
+
26
+ YAVM::Versions.new(versions)
27
+ end
28
+
29
+ module_function :locate_versions, :stores
30
+ end
31
+ end
@@ -0,0 +1,46 @@
1
+ require 'json'
2
+
3
+ module YAVM
4
+ module Stores
5
+
6
+ class Base
7
+ def name
8
+ self.class.name
9
+ end
10
+ #
11
+ # If the file for the store exists.
12
+ # Only 1 file must match the glob.
13
+ #
14
+ def exists?
15
+ Dir[glob].length == 1
16
+ end
17
+
18
+ #
19
+ # Fetch the matched filename for this store
20
+ #
21
+ def filename
22
+ Dir[glob].first if exists?
23
+ end
24
+
25
+ end
26
+
27
+ class GenericJSON < YAVM::Stores::Base
28
+
29
+ def data
30
+ @data ||= JSON.parse(IO.read(filename))
31
+ end
32
+
33
+ def to_version
34
+ Version.new(self, version_key)
35
+ end
36
+
37
+ def set!(new_version)
38
+ @data = update_version_key(new_version.to_s)
39
+ File.open(filename, 'w') { |f| f.write JSON.pretty_generate(data) }
40
+ end
41
+
42
+ end
43
+
44
+
45
+ end
46
+ end
@@ -0,0 +1,26 @@
1
+ require 'yavm/stores/base'
2
+
3
+ module YAVM
4
+ module Stores
5
+ class Bower < YAVM::Stores::GenericJSON
6
+
7
+ def name
8
+ 'bower.json file'
9
+ end
10
+
11
+ def glob
12
+ './bower.json'
13
+ end
14
+
15
+ def version_key
16
+ data['version']
17
+ end
18
+
19
+ def update_version_key(what)
20
+ data['version'] = what
21
+ return data
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,39 @@
1
+ require 'rubygems'
2
+ require 'yavm/version'
3
+ require 'yavm/stores/base'
4
+
5
+ module YAVM
6
+ module Stores
7
+ class GemSpec < YAVM::Stores::Base
8
+
9
+ def name
10
+ "gemspec: #{filename}"
11
+ end
12
+
13
+ def glob
14
+ './*.gemspec'
15
+ end
16
+
17
+ def spec
18
+ @spec ||= Gem::Specification.load(filename)
19
+ end
20
+
21
+ def to_version
22
+ Version.new(self, spec.version.to_s.gsub('.pre.', '-'))
23
+ end
24
+
25
+ #
26
+ # Munge the existing file to replace the version identifier.
27
+ # This might be a bit brittle.
28
+ #
29
+ def set!(new_version)
30
+ current_spec = IO.read(filename)
31
+ spec_token = current_spec.match(/Gem::Specification.new do \|(?<token>[^\|]+)\|/m)['token']
32
+ new_spec = current_spec.gsub(/^(\s+#{spec_token}\.version\s+=\s+)("|')([^"']+)(\2)/, "\\1\\2#{new_version}\\4")
33
+
34
+ File.open(filename, 'w') { |f| f.write new_spec }
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,26 @@
1
+ require 'yavm/stores/base'
2
+
3
+ module YAVM
4
+ module Stores
5
+ class Package < YAVM::Stores::GenericJSON
6
+
7
+ def name
8
+ 'npm package.json'
9
+ end
10
+
11
+ def glob
12
+ './package.json'
13
+ end
14
+
15
+ def version_key
16
+ data['version']
17
+ end
18
+
19
+ def update_version_key(what)
20
+ data['version'] = what
21
+ return data
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ require 'yaml'
2
+ require 'yavm/stores/base'
3
+
4
+ module YAVM
5
+ module Stores
6
+ class Semver < YAVM::Stores::Base
7
+
8
+ def name
9
+ '.semver file'
10
+ end
11
+
12
+ def glob
13
+ './.semver'
14
+ end
15
+
16
+ def data
17
+ @data ||= YAML.load_file(filename)
18
+ end
19
+
20
+ def to_version
21
+ Version.new(self, data)
22
+ end
23
+
24
+ def set!(new_version)
25
+ File.open(filename, 'w') { |f| f.write new_version.to_yaml }
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,88 @@
1
+ require 'forwardable'
2
+ require 'ostruct'
3
+
4
+ module YAVM
5
+ class Version
6
+ extend ::Forwardable
7
+
8
+ attr_accessor :store
9
+
10
+ def initialize(store, vobject = nil)
11
+ self.store = store
12
+
13
+ if vobject
14
+ case vobject
15
+ when String
16
+ parse(vobject)
17
+ when Hash
18
+ load(vobject)
19
+ end
20
+ end
21
+ end
22
+
23
+ def to_s
24
+ format('%M.%m.%p%s')
25
+ end
26
+
27
+ def to_hash
28
+ @_version.marshal_dump
29
+ end
30
+
31
+ def to_yaml
32
+ @_version.marshal_dump.to_yaml
33
+ end
34
+
35
+ def tag
36
+ format('v%M.%m.%p%s%t')
37
+ end
38
+
39
+ def format(string = '')
40
+ string = string.dup
41
+
42
+ string.gsub!('%M', major.to_s)
43
+ string.gsub!('%m', minor.to_s)
44
+ string.gsub!('%p', patch.to_s)
45
+ string.gsub!('%s', special ? "-#{special}" : '')
46
+ string.gsub!('%t', meta ? "+#{meta}" : '')
47
+ string.gsub!('%%', '%')
48
+
49
+ return string
50
+ end
51
+
52
+ def ==(other)
53
+ self.major == other.major &&
54
+ self.minor == other.minor &&
55
+ self.patch == other.patch &&
56
+ self.special == other.special
57
+ end
58
+
59
+ private
60
+
61
+ def parse(string)
62
+ match = string.match(/\A(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)(?:-(?<special>[a-z0-9]+))?(?:\+(?<meta>[a-z0-9]+))?\z/i)
63
+
64
+ @_version = Hash[ match.names.zip( match.captures ) ]
65
+ @_version = OpenStruct.new(@_version)
66
+ integerize!
67
+ end
68
+
69
+ def load(hash)
70
+ @_version = OpenStruct.new(hash)
71
+ integerize!
72
+ end
73
+
74
+ def integerize!
75
+ @_version.major = @_version.major.to_i
76
+ @_version.minor = @_version.minor.to_i
77
+ @_version.patch = @_version.patch.to_i
78
+ end
79
+
80
+ #
81
+ # Allows calling "version.minor" and the like on the Version instance
82
+ #
83
+ def_delegators :@_version,
84
+ :major, :minor, :patch, :special, :meta,
85
+ :major=, :minor=, :patch=, :special=, :meta=
86
+
87
+ end
88
+ end
@@ -0,0 +1,34 @@
1
+ require 'forwardable'
2
+
3
+ module YAVM
4
+ class Versions
5
+ extend ::Forwardable
6
+
7
+ def initialize(versions)
8
+ self.versions = versions.compact
9
+ end
10
+
11
+ # Set a given version to be the authoritative version for all defined stores
12
+ def set_all!(authoritative_version)
13
+ versions.each do |version|
14
+ version.store.set!(authoritative_version)
15
+ end
16
+ end
17
+
18
+ #
19
+ # Get a list of versions which aren't the same version
20
+ # as the first version, and boolean-ify that result
21
+ #
22
+ def equal?
23
+ versions.reject { |v| v == versions.first }.length.zero?
24
+ end
25
+
26
+ def_delegators :versions, :<<, :length, :size, :[],
27
+ :first, :each, :each_with_index, :empty?, :any?
28
+
29
+ private
30
+
31
+ attr_accessor :versions
32
+
33
+ end
34
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: YAVM
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Lewis Eason
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: docopt
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.5.0
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: 0.5.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.5.0
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: 0.5.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: json
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 1.8.0
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: 1.8.1
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 1.8.0
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: 1.8.1
53
+ description: A tiny gem for managing project version numbers
54
+ email: me@lewiseason.co.uk
55
+ executables:
56
+ - version
57
+ extensions: []
58
+ extra_rdoc_files: []
59
+ files:
60
+ - README.md
61
+ - bin/version
62
+ - lib/yavm.rb
63
+ - lib/yavm/README.md
64
+ - lib/yavm/command_line.rb
65
+ - lib/yavm/stores.rb
66
+ - lib/yavm/stores/base.rb
67
+ - lib/yavm/stores/bower.rb
68
+ - lib/yavm/stores/gem_spec.rb
69
+ - lib/yavm/stores/package.rb
70
+ - lib/yavm/stores/semver.rb
71
+ - lib/yavm/version.rb
72
+ - lib/yavm/versions.rb
73
+ homepage: https://github.com/lewiseason/yavm
74
+ licenses:
75
+ - GPLv2
76
+ metadata: {}
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ requirements: []
92
+ rubyforge_project:
93
+ rubygems_version: 2.2.2
94
+ signing_key:
95
+ specification_version: 4
96
+ summary: Yet Another Version Manager
97
+ test_files: []
98
+ has_rdoc: