semver 0.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.
Files changed (6) hide show
  1. data/.semver +5 -0
  2. data/README.md +28 -0
  3. data/bin/semver +67 -0
  4. data/lib/semver.rb +108 -0
  5. data/semver.gemspec +14 -0
  6. metadata +59 -0
data/.semver ADDED
@@ -0,0 +1,5 @@
1
+ ---
2
+ :special: ""
3
+ :major: "0"
4
+ :minor: "1"
5
+ :patch: "0"
@@ -0,0 +1,28 @@
1
+ SemVer
2
+ ======
3
+
4
+ quickstart on the command line
5
+ ------------------------------
6
+ install it
7
+
8
+ % gem install semver
9
+
10
+ use it
11
+
12
+ % semver init
13
+ % semver tag # => v0.0.0
14
+ % semver inc minor # => v0.1.0
15
+ % git tag -a `semver tag`
16
+ % say 'that was easy'
17
+
18
+ quickstart for ruby
19
+ -------------------
20
+ require 'semver'
21
+ v = SemVer.find
22
+ v.major # => "0"
23
+ v.major.next!
24
+ v.major # => "1"
25
+ v.format "%M.%m.%p" # => "1.1.0"
26
+ v.save
27
+
28
+ [Franco Lazzarino](mailto:flazzarino@gmail.com)
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'semver'
4
+
5
+ begin
6
+ command = ARGV.shift or raise "no command given"
7
+
8
+ case command
9
+ when /^init(ialize)?$/
10
+ FileUtils.touch SemVer::FILE_NAME
11
+ version = SemVer.find
12
+ version
13
+ version.save
14
+
15
+ when /^inc(rement)?$/
16
+ version = SemVer.find
17
+ dimension = ARGV.shift or raise "required: major | minor | patch"
18
+
19
+ case dimension
20
+ when 'major' then version.major.next!
21
+ when 'minor' then version.minor.next!
22
+ when 'patch' then version.patch.next!
23
+ else raise "#{dimension} is invalid: major | minor | patch"
24
+ end
25
+
26
+ version.special = ''
27
+ version.save
28
+
29
+ when /^spe(cial)?$/
30
+ version = SemVer.find
31
+ special_str = ARGV.shift or raise "required: an arbitrary string (beta, alfa, romeo, etc)"
32
+ version.special = special_str
33
+ version.save
34
+
35
+ when 'format'
36
+ version = SemVer.find
37
+ format_str = ARGV.shift or raise "required: format string"
38
+ version.format format_str
39
+
40
+ when 'tag'
41
+ version = SemVer.find
42
+ puts version.format "v%M.%m.%p%s"
43
+
44
+ when 'help'
45
+ puts <<-HELP
46
+ semver commands
47
+ ---------------
48
+
49
+ init[ialze] # initialize semantic version tracking
50
+ inc[rement] major | minor | patch # increment a specific version number
51
+ spe[cial] [STRING] # set a special version suffix
52
+ format # printf like format: %M, %m, %p, %s
53
+ tag # equivalenti to format 'v%M.%m.%p%s'
54
+ help
55
+
56
+ PLEASE READ http://semver.org
57
+ HELP
58
+
59
+ else raise "invalid command #{command}"
60
+ end
61
+
62
+ rescue => e
63
+ puts e.message
64
+ puts e.backtrace
65
+ puts "#{$0} help for more info"
66
+ exit 1
67
+ end
@@ -0,0 +1,108 @@
1
+ class SemVer
2
+
3
+ FILE_NAME = '.semver'
4
+
5
+ def SemVer.find dir=nil
6
+ v = SemVer.new
7
+ v.load
8
+ v
9
+ end
10
+
11
+ def SemVer.find_file dir=nil
12
+ dir ||= Dir.pwd
13
+ raise "#{dir} is not a directory" unless File.directory? dir
14
+ path = FILE_NAME
15
+
16
+ Dir.chdir dir do
17
+
18
+ loop do
19
+
20
+ if Dir[FILE_NAME].empty?
21
+ return nil if File.expand_path(path) == '/'
22
+ path = File.join '..', path
23
+ next
24
+ else
25
+ path = File.expand_path path
26
+ return path
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
33
+
34
+ class << self
35
+
36
+ def attr_writer_pattern pattern, symbol
37
+
38
+ define_method("#{symbol}=".to_sym) do |str|
39
+
40
+ if str =~ pattern || str.empty?
41
+ instance_variable_set "@#{symbol}".to_sym, str
42
+ else
43
+ raise "#{symbol}: #{str} does not match pattern #{pattern}"
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ attr_writer_pattern /\d+/, :major
53
+ attr_writer_pattern /\d+/, :minor
54
+ attr_writer_pattern /\d+/, :patch
55
+ attr_writer_pattern /[A-Za-z][0-9A-Za-z-]+/, :special
56
+ attr_reader :major, :minor, :patch, :special
57
+
58
+ def initialize major='0', minor='0', patch='0', special=''
59
+ self.major, self.minor, self.patch, self.special = major.to_s, minor.to_s, patch.to_s, special.to_s
60
+ end
61
+
62
+ def load file=SemVer.find_file
63
+ hash = open(file) { |io| YAML::load io.read } || {}
64
+ self.major = hash[:major] || '0'
65
+ self.minor = hash[:minor] || '0'
66
+ self.patch = hash[:patch] || '0'
67
+ self.special = hash[:special] || ''
68
+ end
69
+
70
+ def save file=SemVer.find_file
71
+
72
+ hash = {
73
+ :major => @major,
74
+ :minor => @minor,
75
+ :patch => @patch,
76
+ :special => @special
77
+ }
78
+
79
+ yaml = YAML::dump hash
80
+ open(file, 'w') { |io| io.write yaml }
81
+ end
82
+
83
+ def format fmt
84
+ fmt.gsub! '%M', @major
85
+ fmt.gsub! '%m', @minor
86
+ fmt.gsub! '%p', @patch
87
+ fmt.gsub! '%s', @special
88
+ fmt
89
+ end
90
+
91
+ def <=> other
92
+ maj = major.to_i <=> other.major.to_i
93
+ return maj unless maj == 0
94
+
95
+ min = minor.to_i <=> other.minor.to_i
96
+ return min unless min == 0
97
+
98
+ pat = patch.to_i <=> other.patch.to_i
99
+ return pat unless pat == 0
100
+
101
+ spe = special <=> other.special
102
+ return spec unless spe == 0
103
+
104
+ 0
105
+ end
106
+
107
+ include Comparable
108
+ end
@@ -0,0 +1,14 @@
1
+ require 'semver'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "semver"
5
+ spec.version = SemVer.find.format '%M.%m.%p'
6
+ spec.summary = "Semantic Versioning"
7
+ spec.description = "maintain versions as per http://semver.rog"
8
+ spec.email = "flazzarino@gmail.com"
9
+ spec.authors = ["Francesco Lazzarino"]
10
+ spec.homepage = 'http://github.com/flazz/semver'
11
+ spec.executables << 'semver'
12
+ spec.files = [".semver", "semver.gemspec", "README.md"] + Dir["lib/**/*.rb"] + Dir['bin/*']
13
+ spec.has_rdoc = true
14
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: semver
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Francesco Lazzarino
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-02-13 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: maintain versions as per http://semver.rog
17
+ email: flazzarino@gmail.com
18
+ executables:
19
+ - semver
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - .semver
26
+ - semver.gemspec
27
+ - README.md
28
+ - lib/semver.rb
29
+ - bin/semver
30
+ has_rdoc: true
31
+ homepage: http://github.com/flazz/semver
32
+ licenses: []
33
+
34
+ post_install_message:
35
+ rdoc_options: []
36
+
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
51
+ requirements: []
52
+
53
+ rubyforge_project:
54
+ rubygems_version: 1.3.5
55
+ signing_key:
56
+ specification_version: 3
57
+ summary: Semantic Versioning
58
+ test_files: []
59
+