tumbler 0.0.4 → 0.0.6
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.
- data/CHANGELOG +11 -0
- data/README.rdoc +2 -6
- data/Tumbler +2 -7
- data/lib/template/Gemfile.erb +17 -0
- data/{template → lib/template}/Rakefile +0 -0
- data/lib/template/Tumbler.erb +9 -0
- data/{template → lib/template}/generic.gemspec.erb +0 -0
- data/lib/template/version.rb.erb +4 -0
- data/lib/tumbler.rb +3 -153
- data/lib/tumbler/cli.rb +3 -4
- data/lib/tumbler/gem.rb +1 -1
- data/lib/tumbler/gemspec.rb +1 -1
- data/lib/tumbler/gemspec_helper.rb +1 -1
- data/lib/tumbler/generate.rb +22 -25
- data/lib/tumbler/manager.rb +161 -0
- data/lib/tumbler/manager/changelog.rb +64 -0
- data/lib/tumbler/manager/version.rb +66 -0
- data/lib/tumbler/rake_tasks.rb +1 -7
- data/lib/tumbler/runner.rb +1 -1
- data/lib/tumbler/updater.rb +16 -6
- data/lib/tumbler/version.rb +2 -56
- data/spec/{bin_bijou_spec.rb → bin_tumbler_spec.rb} +4 -4
- data/spec/changelog_spec.rb +1 -1
- data/spec/gemspec_spec.rb +1 -1
- data/spec/spec_helper.rb +2 -2
- data/spec/updater_spec.rb +8 -2
- data/spec/version_spec.rb +1 -0
- metadata +14 -13
- data/VERSION +0 -1
- data/lib/tumbler/changelog.rb +0 -62
- data/template/Gemfile +0 -10
- data/template/generic.Tumbler.erb +0 -14
- data/tumbler-0.0.1.gem +0 -0
data/CHANGELOG
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
== 0.0.6
|
2
|
+
|
3
|
+
* corrected docs. correct version (Joshua Hull, a3ee9bc)
|
4
|
+
* new version scheme (Joshua Hull, 631c067)
|
5
|
+
* restructure (Joshua Hull, 641ea47)
|
6
|
+
* create Tumbler config on update (Joshua Hull, e26b306)
|
7
|
+
|
8
|
+
== 0.0.5
|
9
|
+
|
10
|
+
* remove push task (Joshua Hull, b85b730)
|
11
|
+
|
1
12
|
== 0.0.4
|
2
13
|
|
3
14
|
|
data/README.rdoc
CHANGED
@@ -19,14 +19,10 @@ For existing projects, you need to configure it to tell Tumbler to do its work.
|
|
19
19
|
gem_name 'my_awesome_gem'
|
20
20
|
|
21
21
|
# Use this file to track the version
|
22
|
-
|
23
|
-
filename 'VERSION'
|
24
|
-
end
|
22
|
+
version_file 'lib/my_awesome_gem/version.rb'
|
25
23
|
|
26
24
|
# Use this file to hang onto your changelog
|
27
|
-
|
28
|
-
filename 'CHANGELOG'
|
29
|
-
end
|
25
|
+
changelog_file 'CHANGELOG'
|
30
26
|
|
31
27
|
Your version number has to only be something parsable by Versionomy. The changelog will automatically be updated when you do releases.
|
32
28
|
|
data/Tumbler
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
source :rubygems
|
2
|
+
|
3
|
+
# your dependencies go here
|
4
|
+
# gem 'nokogiri'
|
5
|
+
<% @dependencies.each do |dep|%>
|
6
|
+
gem <%=dep.name.inspect%>, <%=dep.requirement.to_s.inspect%>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
group :development do
|
10
|
+
# your development dependencies go here
|
11
|
+
# gem 'rake'
|
12
|
+
# gem 'rspect'
|
13
|
+
<% development_dependencies.each do |dep| %>
|
14
|
+
gem <%=dep.name.inspect%>, <%=dep.requirement.to_s.inspect%>
|
15
|
+
<% end %>
|
16
|
+
end
|
17
|
+
|
File without changes
|
File without changes
|
data/lib/tumbler.rb
CHANGED
@@ -11,169 +11,19 @@ require 'tumbler/updater'
|
|
11
11
|
require 'tumbler/rake_tasks'
|
12
12
|
require 'tumbler/version'
|
13
13
|
require 'tumbler/gemspec_helper'
|
14
|
-
require 'tumbler/changelog'
|
15
14
|
require 'tumbler/generate'
|
16
15
|
require 'tumbler/gem'
|
17
16
|
require 'tumbler/cli'
|
17
|
+
require 'tumbler/manager'
|
18
18
|
|
19
|
-
|
20
|
-
def self.load_version(filename = Version::DEFAULT_FILE)
|
21
|
-
File.read(File.join(__DIR__, '..', filename))
|
22
|
-
end
|
23
|
-
|
24
|
-
VERSION = Tumbler.load_version
|
25
|
-
|
26
|
-
include Runner
|
27
|
-
|
28
|
-
Change = Struct.new(:hash, :author, :summary)
|
29
|
-
|
30
|
-
attr_reader :base, :version, :changelog, :gem, :name
|
31
|
-
attr_accessor :noop
|
32
|
-
|
19
|
+
module Tumbler
|
33
20
|
def self.use_rake_tasks(name = nil)
|
34
21
|
root = File.dirname(Callsite.parse(caller).find{|c| c.filename =~ /Rakefile/}.filename)
|
35
22
|
Tumbler::RakeTasks.register(File.expand_path(root), name)
|
36
23
|
end
|
37
24
|
|
38
25
|
def self.load(base)
|
39
|
-
File.exist?(File.join(base, 'Tumbler')) ? new(base) : nil
|
40
|
-
end
|
41
|
-
|
42
|
-
def set_version(version)
|
43
|
-
@version = Version.new
|
44
|
-
end
|
45
|
-
|
46
|
-
def gem_name(name)
|
47
|
-
@name = name
|
48
|
-
end
|
49
|
-
|
50
|
-
def bundler
|
51
|
-
@definition ||= Bundler::Dsl.evaluate(gemfile_path)
|
52
|
-
end
|
53
|
-
|
54
|
-
def config_path
|
55
|
-
File.join(@base, 'Tumbler')
|
56
|
-
end
|
57
|
-
|
58
|
-
def gemfile_path
|
59
|
-
File.join(@base, 'Gemfile')
|
60
|
-
end
|
61
|
-
|
62
|
-
def gemspec_path
|
63
|
-
File.join(@base, "#{@name}.gemspec")
|
64
|
-
end
|
65
|
-
|
66
|
-
def lockfile_path
|
67
|
-
File.join(@base, 'Gemfile.lock')
|
68
|
-
end
|
69
|
-
|
70
|
-
def use_version(&block)
|
71
|
-
@version = Version.new(self, &block)
|
72
|
-
end
|
73
|
-
|
74
|
-
def use_gem(&block)
|
75
|
-
@gem.instance_eval(block)
|
76
|
-
end
|
77
|
-
|
78
|
-
def use_changelog(&block)
|
79
|
-
@changelog = Changelog.new(self, &block)
|
80
|
-
end
|
81
|
-
|
82
|
-
def reset
|
83
|
-
@version = nil
|
84
|
-
@changelog = nil
|
85
|
-
end
|
86
|
-
|
87
|
-
def bump_and_commit(field)
|
88
|
-
guard_clean
|
89
|
-
@changelog.update if @changelog
|
90
|
-
bump(field)
|
91
|
-
if @changelog
|
92
|
-
@changelog.write_version_header
|
93
|
-
@changelog.commit
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def tag_and_push
|
98
|
-
guard_clean
|
99
|
-
guard_already_tagged
|
100
|
-
tag
|
101
|
-
push
|
102
|
-
end
|
103
|
-
|
104
|
-
def bump_and_push(field)
|
105
|
-
revert_on_error {
|
106
|
-
bump_and_commit(field)
|
107
|
-
tag_and_push
|
108
|
-
}
|
109
|
-
end
|
110
|
-
|
111
|
-
def current_revision
|
112
|
-
sh('git show --pretty=format:%H').split(/\n/)[0].strip
|
113
|
-
end
|
114
|
-
|
115
|
-
def revert_on_error
|
116
|
-
current_ref = current_revision
|
117
|
-
begin
|
118
|
-
yield
|
119
|
-
rescue
|
120
|
-
sh "git reset --hard #{current_ref}"
|
121
|
-
raise
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def guard_clean
|
126
|
-
clean? or raise("There are files that need to be committed first.")
|
127
|
-
end
|
128
|
-
|
129
|
-
def guard_already_tagged
|
130
|
-
sh('git tag').split(/\n/).include?(@version.to_s) and raise("This tag has already been committed to the repo.")
|
131
|
-
end
|
132
|
-
|
133
|
-
def bump(level)
|
134
|
-
from = @version.to_s
|
135
|
-
@version.bump(level)
|
136
|
-
@version.commit(from)
|
137
|
-
end
|
138
|
-
|
139
|
-
def clean?
|
140
|
-
sh("git ls-files -dm").split("\n").size.zero?
|
141
|
-
end
|
142
|
-
|
143
|
-
def push
|
144
|
-
sh "git push --all"
|
145
|
-
sh "git push --tags"
|
146
|
-
end
|
147
|
-
|
148
|
-
def tag
|
149
|
-
sh "git tag #{@version.to_s}"
|
150
|
-
end
|
151
|
-
|
152
|
-
def commit(msg)
|
153
|
-
sh "git commit #{@version.basefile} -m'#{msg}'"
|
154
|
-
end
|
155
|
-
|
156
|
-
def tags
|
157
|
-
sh('git tag').split(/\n/)
|
158
|
-
end
|
159
|
-
|
160
|
-
def reload
|
161
|
-
reset
|
162
|
-
@gem = Gem.new(self)
|
163
|
-
instance_eval(File.read(config_path), config_path, 1)
|
164
|
-
end
|
165
|
-
|
166
|
-
def latest_changes
|
167
|
-
changes = sh("git log --pretty=format:'%h (%aN) %s' --no-color #{@version}..HEAD").
|
168
|
-
scan(/([a-f0-9]{7}) \((.*?)\) (.*)$/).
|
169
|
-
map{|line| Change.new(line[0], line[1], line[2])}
|
170
|
-
end
|
171
|
-
|
172
|
-
private
|
173
|
-
def initialize(base)
|
174
|
-
@base = base
|
175
|
-
reload
|
176
|
-
@noop = true if ENV['DRY'] == '1'
|
26
|
+
File.exist?(File.join(base, 'Tumbler')) ? Manager.new(base) : nil
|
177
27
|
end
|
178
28
|
|
179
29
|
end
|
data/lib/tumbler/cli.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
|
3
|
-
|
3
|
+
module Tumbler
|
4
4
|
class CLI
|
5
5
|
def self.run(args)
|
6
6
|
CLI.new(args).run
|
@@ -8,8 +8,7 @@ class Tumbler
|
|
8
8
|
|
9
9
|
def initialize(args)
|
10
10
|
@options = {
|
11
|
-
:changelog => Changelog::DEFAULT_FILE,
|
12
|
-
:version => Version::INITIAL_VERSION
|
11
|
+
:changelog => Manager::Changelog::DEFAULT_FILE,
|
13
12
|
}
|
14
13
|
parser.parse!(args)
|
15
14
|
end
|
@@ -37,7 +36,7 @@ class Tumbler
|
|
37
36
|
@options[:version] = v
|
38
37
|
end
|
39
38
|
|
40
|
-
opts.on("-nv", "--no-
|
39
|
+
opts.on("-nv", "--no-version", "Disable version") do |v|
|
41
40
|
@options[:version] = nil
|
42
41
|
end
|
43
42
|
|
data/lib/tumbler/gem.rb
CHANGED
data/lib/tumbler/gemspec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'tumbler') unless Kernel.const_defined?(:Tumbler)
|
2
2
|
root = File.expand_path(File.dirname(Callsite.parse(caller).find{|c| c.filename =~ /\.gemspec$/}.filename))
|
3
3
|
Tumbler.send(:remove_const, :Gemspec) if (Tumbler.const_defined?(:Gemspec))
|
4
|
-
Tumbler::Gemspec = Tumbler::GemspecHelper.new(Tumbler.
|
4
|
+
Tumbler::Gemspec = Tumbler::GemspecHelper.new(Tumbler.load(root))
|
data/lib/tumbler/generate.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'erb'
|
3
3
|
|
4
|
-
|
4
|
+
module Tumbler
|
5
5
|
class Generate
|
6
6
|
|
7
7
|
include Runner
|
@@ -32,14 +32,18 @@ class Tumbler
|
|
32
32
|
@name = name
|
33
33
|
@dependencies = []
|
34
34
|
@development_dependencies = []
|
35
|
-
@version = Version::INITIAL_VERSION
|
36
|
-
@changelog = Changelog::DEFAULT_FILE
|
35
|
+
@version = Manager::Version::INITIAL_VERSION
|
36
|
+
@changelog = Manager::Changelog::DEFAULT_FILE
|
37
|
+
end
|
38
|
+
|
39
|
+
def constant_name
|
40
|
+
@name.split('_').map{|p| p.capitalize}.join
|
37
41
|
end
|
38
42
|
|
39
43
|
def write
|
40
44
|
write_gemspec
|
41
45
|
write_gemfile
|
42
|
-
write_version
|
46
|
+
write_version(@version)
|
43
47
|
write_changelog
|
44
48
|
write_rakefile
|
45
49
|
write_tumbler_config
|
@@ -62,18 +66,13 @@ class Tumbler
|
|
62
66
|
File.join(@base, 'Tumbler')
|
63
67
|
end
|
64
68
|
|
65
|
-
def
|
66
|
-
|
67
|
-
File.open(
|
69
|
+
def write_version(version)
|
70
|
+
FileUtils.mkdir_p(File.dirname(version_path))
|
71
|
+
File.open(version_path, 'w') {|f| f << generate_version(version) }
|
68
72
|
end
|
69
|
-
|
70
|
-
def
|
71
|
-
|
72
|
-
File.open(@changelog.file, "w") {|f| f << ''} unless File.exist?(@changelog.file)
|
73
|
-
end
|
74
|
-
|
75
|
-
def write_version
|
76
|
-
File.open(File.join(@base, Version::DEFAULT_FILE), 'w') {|f| f << @version }
|
73
|
+
|
74
|
+
def version_path
|
75
|
+
File.join(@base, 'lib', @name, 'version.rb')
|
77
76
|
end
|
78
77
|
|
79
78
|
def write_gemfile
|
@@ -109,23 +108,21 @@ class Tumbler
|
|
109
108
|
end
|
110
109
|
|
111
110
|
def template_path(path)
|
112
|
-
File.join(File.dirname(__FILE__), '..', '
|
111
|
+
File.join(File.dirname(__FILE__), '..', 'template', path)
|
113
112
|
end
|
114
113
|
|
115
114
|
def generate_tumbler_conf
|
116
|
-
template = ERB.new(File.read(template_path('
|
115
|
+
template = ERB.new(File.read(template_path('Tumbler.erb')))
|
117
116
|
template.result(binding)
|
118
117
|
end
|
119
118
|
|
120
119
|
def generate_gemfile
|
121
|
-
template = ERB.new
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
end
|
128
|
-
EOF
|
120
|
+
template = ERB.new(File.read(template_path('Gemfile.erb')))
|
121
|
+
template.result(binding)
|
122
|
+
end
|
123
|
+
|
124
|
+
def generate_version(version)
|
125
|
+
template = ERB.new(File.read(template_path('version.rb.erb')))
|
129
126
|
template.result(binding)
|
130
127
|
end
|
131
128
|
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'tumbler/manager/changelog'
|
2
|
+
require 'tumbler/manager/version'
|
3
|
+
|
4
|
+
module Tumbler
|
5
|
+
class Manager
|
6
|
+
include Runner
|
7
|
+
|
8
|
+
Change = Struct.new(:hash, :author, :summary)
|
9
|
+
|
10
|
+
attr_reader :base, :version, :changelog, :gem, :name
|
11
|
+
attr_accessor :noop
|
12
|
+
|
13
|
+
def default_version_file
|
14
|
+
File.join('lib', name, 'version.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
def default_changelog_file
|
18
|
+
Changelog::DEFAULT_FILE
|
19
|
+
end
|
20
|
+
|
21
|
+
def gem_name(name)
|
22
|
+
@name = name
|
23
|
+
end
|
24
|
+
|
25
|
+
def bundler
|
26
|
+
@definition ||= Bundler::Dsl.evaluate(gemfile_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def config_path
|
30
|
+
File.join(@base, 'Tumbler')
|
31
|
+
end
|
32
|
+
|
33
|
+
def gemfile_path
|
34
|
+
File.join(@base, 'Gemfile')
|
35
|
+
end
|
36
|
+
|
37
|
+
def gemspec_path
|
38
|
+
File.join(@base, "#{@name}.gemspec")
|
39
|
+
end
|
40
|
+
|
41
|
+
def lockfile_path
|
42
|
+
File.join(@base, 'Gemfile.lock')
|
43
|
+
end
|
44
|
+
|
45
|
+
def version_file(file = default_version_file, &block)
|
46
|
+
@version = Manager::Version.new(self)
|
47
|
+
@version.filename(file)
|
48
|
+
@version.instance_eval(&block) if block
|
49
|
+
@version.reload
|
50
|
+
@version
|
51
|
+
end
|
52
|
+
|
53
|
+
def use_gem(&block)
|
54
|
+
@gem.instance_eval(block)
|
55
|
+
end
|
56
|
+
|
57
|
+
def changelog_file(file = default_changelog_file, &block)
|
58
|
+
@changelog = Changelog.new(self)
|
59
|
+
@changelog.filename(file)
|
60
|
+
@changelog.instance_eval(&block) if block
|
61
|
+
@changelog
|
62
|
+
end
|
63
|
+
|
64
|
+
def reset
|
65
|
+
@version = nil
|
66
|
+
@changelog = nil
|
67
|
+
end
|
68
|
+
|
69
|
+
def bump_and_commit(field)
|
70
|
+
guard_clean
|
71
|
+
@changelog.update if @changelog
|
72
|
+
bump(field)
|
73
|
+
if @changelog
|
74
|
+
@changelog.write_version_header
|
75
|
+
@changelog.commit
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def tag_and_push
|
80
|
+
guard_clean
|
81
|
+
guard_already_tagged
|
82
|
+
tag
|
83
|
+
push
|
84
|
+
end
|
85
|
+
|
86
|
+
def bump_and_push(field)
|
87
|
+
revert_on_error {
|
88
|
+
bump_and_commit(field)
|
89
|
+
tag_and_push
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
def current_revision
|
94
|
+
sh('git show --pretty=format:%H').split(/\n/)[0].strip
|
95
|
+
end
|
96
|
+
|
97
|
+
def revert_on_error
|
98
|
+
current_ref = current_revision
|
99
|
+
begin
|
100
|
+
yield
|
101
|
+
rescue
|
102
|
+
sh "git reset --hard #{current_ref}"
|
103
|
+
raise
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def guard_clean
|
108
|
+
clean? or raise("There are files that need to be committed first.")
|
109
|
+
end
|
110
|
+
|
111
|
+
def guard_already_tagged
|
112
|
+
sh('git tag').split(/\n/).include?(@version.to_s) and raise("This tag has already been committed to the repo.")
|
113
|
+
end
|
114
|
+
|
115
|
+
def bump(level)
|
116
|
+
from = @version.to_s
|
117
|
+
@version.bump(level)
|
118
|
+
@version.commit(from)
|
119
|
+
end
|
120
|
+
|
121
|
+
def clean?
|
122
|
+
sh("git ls-files -dm").split("\n").size.zero?
|
123
|
+
end
|
124
|
+
|
125
|
+
def push
|
126
|
+
sh "git push --all"
|
127
|
+
sh "git push --tags"
|
128
|
+
end
|
129
|
+
|
130
|
+
def tag
|
131
|
+
sh "git tag #{@version.to_s}"
|
132
|
+
end
|
133
|
+
|
134
|
+
def commit(msg)
|
135
|
+
sh "git commit #{@version.basefile} -m'#{msg}'"
|
136
|
+
end
|
137
|
+
|
138
|
+
def tags
|
139
|
+
sh('git tag').split(/\n/)
|
140
|
+
end
|
141
|
+
|
142
|
+
def reload
|
143
|
+
reset
|
144
|
+
@gem = Gem.new(self)
|
145
|
+
instance_eval(File.read(config_path), config_path, 1)
|
146
|
+
end
|
147
|
+
|
148
|
+
def latest_changes
|
149
|
+
changes = sh("git log --pretty=format:'%h (%aN) %s' --no-color #{@version}..HEAD").
|
150
|
+
scan(/([a-f0-9]{7}) \((.*?)\) (.*)$/).
|
151
|
+
map{|line| Change.new(line[0], line[1], line[2])}
|
152
|
+
end
|
153
|
+
|
154
|
+
private
|
155
|
+
def initialize(base)
|
156
|
+
@base = base
|
157
|
+
reload
|
158
|
+
@noop = true if ENV['DRY'] == '1'
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Tumbler
|
5
|
+
class Manager
|
6
|
+
class Changelog
|
7
|
+
include Runner
|
8
|
+
|
9
|
+
DEFAULT_FILE = 'CHANGELOG'
|
10
|
+
|
11
|
+
attr_reader :file
|
12
|
+
|
13
|
+
def initialize(manager, &block)
|
14
|
+
@manager = manager
|
15
|
+
instance_eval(&block) if block
|
16
|
+
end
|
17
|
+
|
18
|
+
def filename(file)
|
19
|
+
@basefile = file
|
20
|
+
@file = File.join(@manager.base, file)
|
21
|
+
end
|
22
|
+
|
23
|
+
def write_version_header
|
24
|
+
prepend "== #{@manager.version}\n\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
def prepend(data)
|
28
|
+
if @manager.noop
|
29
|
+
@manager.dry "Prepending #{data} to #{@basefile}"
|
30
|
+
else
|
31
|
+
Tempfile.open('changelog') do |tmp|
|
32
|
+
tmp.puts data
|
33
|
+
File.open(@file) do |f|
|
34
|
+
f.each do |line|
|
35
|
+
tmp << line
|
36
|
+
end
|
37
|
+
end
|
38
|
+
tmp.close
|
39
|
+
FileUtils.copy(tmp.path, @file)
|
40
|
+
File.unlink(tmp.path)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def update
|
46
|
+
ensure_existence
|
47
|
+
prepend("\n")
|
48
|
+
prepend(@manager.latest_changes.inject('') { |changes, change| changes << "* #{change.summary} (#{change.author}, #{change.hash})\n" })
|
49
|
+
end
|
50
|
+
|
51
|
+
def ensure_existence
|
52
|
+
File.open(@file, 'w') {|f| f << ''} unless File.exist?(@file)
|
53
|
+
end
|
54
|
+
|
55
|
+
def commit
|
56
|
+
sh "git commit #{@basefile} -m'Updated changelog'"
|
57
|
+
end
|
58
|
+
|
59
|
+
def base
|
60
|
+
@manager.base
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Tumbler
|
2
|
+
class Manager
|
3
|
+
class Version
|
4
|
+
include Runner
|
5
|
+
|
6
|
+
attr_reader :file, :basefile, :field_names
|
7
|
+
|
8
|
+
DEFAULT_FIELD = [:major, :minor, :tiny]
|
9
|
+
INITIAL_VERSION = '0.0.0'
|
10
|
+
|
11
|
+
def initialize(manager, &block)
|
12
|
+
@manager = manager
|
13
|
+
filename(manager.default_version_file)
|
14
|
+
fields(DEFAULT_FIELD)
|
15
|
+
instance_eval(&block) if block
|
16
|
+
end
|
17
|
+
|
18
|
+
def fields(f)
|
19
|
+
@field_names = (f == :all ? @version.field_names : f)
|
20
|
+
end
|
21
|
+
|
22
|
+
def reload
|
23
|
+
@version = Versionomy.parse(File.exist?(file) ? extract : '0.0.0')
|
24
|
+
end
|
25
|
+
|
26
|
+
def extract
|
27
|
+
File.read(@file)[/Version\s*=\s*['"](.*?)['"]/i, 1]
|
28
|
+
end
|
29
|
+
|
30
|
+
def generate_with_new(version)
|
31
|
+
File.read(@file).gsub(/(Version\s*=\s*['"])(.*?)(['"])/i, "\\1#{version.to_s}\\3")
|
32
|
+
end
|
33
|
+
|
34
|
+
def filename(file)
|
35
|
+
@basefile = file
|
36
|
+
@file = File.join(@manager.base, file)
|
37
|
+
end
|
38
|
+
|
39
|
+
def value
|
40
|
+
@version
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
value.to_s
|
45
|
+
end
|
46
|
+
|
47
|
+
def bump(level)
|
48
|
+
if @manager.noop
|
49
|
+
@manager.dry "Bumping version to #{bump(level).to_s}"
|
50
|
+
else
|
51
|
+
new_file = generate_with_new(@version.bump(level).to_s)
|
52
|
+
File.open(file, 'w') {|f| f << new_file }
|
53
|
+
reload
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def commit(from)
|
58
|
+
sh "git commit #{@basefile} -m'Bumped version from #{from} to #{to_s}'"
|
59
|
+
end
|
60
|
+
|
61
|
+
def base
|
62
|
+
@manager.base
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/tumbler/rake_tasks.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
module Tumbler
|
2
2
|
class RakeTasks
|
3
3
|
|
4
4
|
def self.register(base, name)
|
@@ -59,12 +59,6 @@ class Tumbler
|
|
59
59
|
task :release do
|
60
60
|
@manager.bump_and_push(field)
|
61
61
|
end
|
62
|
-
|
63
|
-
desc "Bump version from #{@manager.version.to_s} -> #{@manager.version.value.bump(field).to_s} and push"
|
64
|
-
task :release do
|
65
|
-
@manager.bump_and_push(field)
|
66
|
-
@manager.gem.push
|
67
|
-
end
|
68
62
|
end
|
69
63
|
end
|
70
64
|
end
|
data/lib/tumbler/runner.rb
CHANGED
data/lib/tumbler/updater.rb
CHANGED
@@ -2,9 +2,8 @@ require 'net/http'
|
|
2
2
|
require 'uri'
|
3
3
|
require 'json'
|
4
4
|
|
5
|
-
|
5
|
+
module Tumbler
|
6
6
|
class Updater
|
7
|
-
|
8
7
|
def initialize(dir, opts = nil)
|
9
8
|
@dir = dir
|
10
9
|
@name = opts && opts[:name] || File.basename(File.expand_path(dir))
|
@@ -16,6 +15,13 @@ class Tumbler
|
|
16
15
|
upgrade_version
|
17
16
|
upgrade_changelog
|
18
17
|
upgrade_rakefile
|
18
|
+
upgrade_tumbler_config
|
19
|
+
end
|
20
|
+
|
21
|
+
def upgrade_tumbler_config
|
22
|
+
unless File.exist?(tumbler_config_path)
|
23
|
+
Tumbler::Generate.app(@dir, @name).write_tumbler_config
|
24
|
+
end
|
19
25
|
end
|
20
26
|
|
21
27
|
def upgrade_deps
|
@@ -40,13 +46,13 @@ raise # (see below)
|
|
40
46
|
# go to rubygems and get it
|
41
47
|
gem_data = JSON.parse(Net::HTTP.get(URI.parse("http://rubygems.org/api/v1/gems/#{URI.escape(@name)}.json")))
|
42
48
|
version = gem_data['version']
|
43
|
-
|
49
|
+
Tumbler::Generate.app(@dir, @name).write_version(version)
|
44
50
|
end
|
45
51
|
end
|
46
52
|
|
47
53
|
def upgrade_changelog
|
48
54
|
unless File.exists?(changelog_path)
|
49
|
-
|
55
|
+
Tumbler::Generate.app(@dir, @name).write_changelog
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
@@ -62,6 +68,10 @@ raise # (see below)
|
|
62
68
|
File.join(@dir, 'Rakefile')
|
63
69
|
end
|
64
70
|
|
71
|
+
def tumbler_config_path
|
72
|
+
File.join(@dir, 'Tumbler')
|
73
|
+
end
|
74
|
+
|
65
75
|
def create_rakefile
|
66
76
|
File.open(rakefile_path, 'w') { |f|
|
67
77
|
f.puts "require 'tumbler'\nnTumbler.use_rake_tasks"
|
@@ -69,11 +79,11 @@ raise # (see below)
|
|
69
79
|
end
|
70
80
|
|
71
81
|
def version_path
|
72
|
-
File.join(@dir,
|
82
|
+
File.join(@dir, 'lib', @name, 'version.rb')
|
73
83
|
end
|
74
84
|
|
75
85
|
def changelog_path
|
76
|
-
File.join(@dir, Changelog::DEFAULT_FILE)
|
86
|
+
File.join(@dir, Manager::Changelog::DEFAULT_FILE)
|
77
87
|
end
|
78
88
|
|
79
89
|
def gemspec_path
|
data/lib/tumbler/version.rb
CHANGED
@@ -1,57 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
include Runner
|
4
|
-
|
5
|
-
attr_reader :file, :basefile, :field_names
|
6
|
-
|
7
|
-
DEFAULT_FILE = 'VERSION'
|
8
|
-
DEFAULT_FIELD = [:major, :minor, :tiny]
|
9
|
-
INITIAL_VERSION = '0.0.0'
|
10
|
-
|
11
|
-
def initialize(manager, &block)
|
12
|
-
@manager = manager
|
13
|
-
filename(DEFAULT_FILE)
|
14
|
-
fields(DEFAULT_FIELD)
|
15
|
-
instance_eval(&block) if block
|
16
|
-
reload
|
17
|
-
end
|
18
|
-
|
19
|
-
def fields(f)
|
20
|
-
@field_names = (f == :all ? @version.field_names : f)
|
21
|
-
end
|
22
|
-
|
23
|
-
def reload
|
24
|
-
@version = Versionomy.parse(File.exist?(file) ? File.read(file).strip : '0.0.0')
|
25
|
-
end
|
26
|
-
|
27
|
-
def filename(file)
|
28
|
-
@basefile = file
|
29
|
-
@file = File.join(@manager.base, file)
|
30
|
-
end
|
31
|
-
|
32
|
-
def value
|
33
|
-
@version
|
34
|
-
end
|
35
|
-
|
36
|
-
def to_s
|
37
|
-
value.to_s
|
38
|
-
end
|
39
|
-
|
40
|
-
def bump(level)
|
41
|
-
if @manager.noop
|
42
|
-
@manager.dry "Bumping version to #{bump(level).to_s}"
|
43
|
-
else
|
44
|
-
File.open(file, 'w') {|f| f << @version.bump(level).to_s}
|
45
|
-
reload
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def commit(from)
|
50
|
-
sh "git commit #{@basefile} -m'Bumped version from #{from} to #{to_s}'"
|
51
|
-
end
|
52
|
-
|
53
|
-
def base
|
54
|
-
@manager.base
|
55
|
-
end
|
56
|
-
end
|
1
|
+
module Tumbler
|
2
|
+
VERSION = '0.0.6'
|
57
3
|
end
|
@@ -15,7 +15,7 @@ describe 'bin/tumbler' do
|
|
15
15
|
it "should generate an app" do
|
16
16
|
Dir.chdir(@target) {`bundle exec ruby #{@bin} test_gem`}
|
17
17
|
$?.should == 0
|
18
|
-
tumbler = Tumbler.
|
18
|
+
tumbler = Tumbler.load(File.join(@target, 'test_gem'))
|
19
19
|
tumbler.version.to_s.should == '0.0.0'
|
20
20
|
tumbler.bundler.dependencies.first.name.should == 'tumbler'
|
21
21
|
tumbler.bundler.dependencies.first.requirements_list.should == ['>= 0']
|
@@ -29,7 +29,7 @@ describe 'bin/tumbler' do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should do nothing on a normal existing tumbler app" do
|
32
|
-
tumbler = Tumbler.
|
32
|
+
tumbler = Tumbler.load(File.join(@target, 'rails'))
|
33
33
|
version_file = File.read(tumbler.version.file)
|
34
34
|
changelog_file = File.read(tumbler.changelog.file)
|
35
35
|
gemfile_file = File.read(tumbler.gemfile_path)
|
@@ -43,7 +43,7 @@ describe 'bin/tumbler' do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should work from inside the directory" do
|
46
|
-
tumbler = Tumbler.
|
46
|
+
tumbler = Tumbler.load(File.join(@target, 'rails'))
|
47
47
|
version_file = File.read(tumbler.version.file)
|
48
48
|
changelog_file = File.read(tumbler.changelog.file)
|
49
49
|
gemfile_file = File.read(tumbler.gemfile_path)
|
@@ -57,7 +57,7 @@ describe 'bin/tumbler' do
|
|
57
57
|
end
|
58
58
|
|
59
59
|
it "should not work if the directory and gemspec mismatch and you don't supply a name" do
|
60
|
-
tumbler = Tumbler.
|
60
|
+
tumbler = Tumbler.load(File.join(@target, 'rails'))
|
61
61
|
FileUtils.mv("#{@target}/rails/rails.gemspec", "#{@target}/rails/notrails.gemspec")
|
62
62
|
Dir.chdir(@target) {`bundle exec ruby #{@bin} rails -u`}
|
63
63
|
$?.exitstatus.should == 1
|
data/spec/changelog_spec.rb
CHANGED
data/spec/gemspec_spec.rb
CHANGED
@@ -19,7 +19,7 @@ describe Tumbler::GemspecHelper do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should have files" do
|
22
|
-
@helper.files.should == ["CHANGELOG", "Gemfile", "Rakefile", "Tumbler", "
|
22
|
+
@helper.files.should == ["CHANGELOG", "Gemfile", "Rakefile", "Tumbler", "lib/test/version.rb", "test.gemspec"]
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should have a date" do
|
data/spec/spec_helper.rb
CHANGED
@@ -10,7 +10,7 @@ def create_app(name = 'test', opts = {})
|
|
10
10
|
temp_dir(name) do |dir|
|
11
11
|
temp_dir("remote-#{name}.git") do |remote_dir|
|
12
12
|
Tumbler::Generate.app(dir, name, opts).write
|
13
|
-
tumbler = Tumbler.new(dir)
|
13
|
+
tumbler = Tumbler::Manager.new(dir)
|
14
14
|
|
15
15
|
Dir.chdir(remote_dir) { `git --bare init` }
|
16
16
|
|
@@ -29,7 +29,7 @@ end
|
|
29
29
|
def create_bare_app(name, opts = {})
|
30
30
|
dir = temp_dir(name)
|
31
31
|
Tumbler::Generate.app(dir, name, opts).write
|
32
|
-
tumbler = Tumbler.new(dir)
|
32
|
+
tumbler = Tumbler::Manager.new(dir)
|
33
33
|
[dir, tumbler]
|
34
34
|
end
|
35
35
|
|
data/spec/updater_spec.rb
CHANGED
@@ -16,9 +16,9 @@ describe Tumbler::Updater do
|
|
16
16
|
it "should fetch the version number" do
|
17
17
|
FakeWeb.allow_net_connect = false
|
18
18
|
FakeWeb.register_uri(:get, "http://rubygems.org/api/v1/gems/rails.json", :body => '{ "name": "rails", "info": "Rails is a framework for building web-application using CGI, FCGI, mod_ruby, or WEBrick on top of either MySQL, PostgreSQL, SQLite, DB2, SQL Server, or Oracle with eRuby- or Builder-based templates.", "version": "2.3.5", "version_downloads": 2451, "authors": "David Heinemeier Hansson", "downloads": 134451, "project_uri": "http://rubygems.org/gems/rails", "gem_uri": "http://rubygems.org/gems/rails-2.3.5.gem", "dependencies": { "runtime": [ { "name": "activesupport", "requirements": ">= 2.3.5" } ], "development": [ ] }}')
|
19
|
-
File.unlink("#{@target}/rails/
|
19
|
+
File.unlink("#{@target}/rails/lib/rails/version.rb")
|
20
20
|
Tumbler::Updater.new("#{@target}/rails", :name => 'rails').update
|
21
|
-
File.read("#{@target}/rails/
|
21
|
+
File.read("#{@target}/rails/lib/rails/version.rb").should match(/2\.3\.5/)
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should generate a CHANGELOG" do
|
@@ -51,4 +51,10 @@ describe Tumbler::Updater do
|
|
51
51
|
File.read("#{@target}/rails/rails.gemspec").scan(/Tumbler::Gemspec.inject_dependencies/).size.should == 1
|
52
52
|
end
|
53
53
|
|
54
|
+
it "should add a Tumbler config file if its not already there" do
|
55
|
+
File.unlink("#{@target}/rails/Tumbler")
|
56
|
+
Tumbler::Updater.new("#{@target}/rails", :name => 'rails').update
|
57
|
+
File.exist?("#{@target}/rails/Tumbler").should be_true
|
58
|
+
end
|
59
|
+
|
54
60
|
end
|
data/spec/version_spec.rb
CHANGED
@@ -9,6 +9,7 @@ describe 'Tumbler#version' do
|
|
9
9
|
|
10
10
|
it "should bump the current version by minor" do
|
11
11
|
create_app('test', :version => '0.1.2') { |tumbler|
|
12
|
+
puts "File.read(tumbler.version.file) #{File.read(tumbler.version.file)}"
|
12
13
|
tumbler.bump_and_push(:minor)
|
13
14
|
tumbler.version.to_s.should == '0.2.0'
|
14
15
|
tumbler.tags.should include('0.2.0')
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tumbler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joshua Hull
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-06-
|
18
|
+
date: 2010-06-17 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -132,20 +132,26 @@ files:
|
|
132
132
|
- README.rdoc
|
133
133
|
- Rakefile
|
134
134
|
- Tumbler
|
135
|
-
- VERSION
|
136
135
|
- bin/tumbler
|
136
|
+
- lib/template/Gemfile.erb
|
137
|
+
- lib/template/Rakefile
|
138
|
+
- lib/template/Tumbler.erb
|
139
|
+
- lib/template/generic.gemspec.erb
|
140
|
+
- lib/template/version.rb.erb
|
137
141
|
- lib/tumbler.rb
|
138
|
-
- lib/tumbler/changelog.rb
|
139
142
|
- lib/tumbler/cli.rb
|
140
143
|
- lib/tumbler/gem.rb
|
141
144
|
- lib/tumbler/gemspec.rb
|
142
145
|
- lib/tumbler/gemspec_helper.rb
|
143
146
|
- lib/tumbler/generate.rb
|
147
|
+
- lib/tumbler/manager.rb
|
148
|
+
- lib/tumbler/manager/changelog.rb
|
149
|
+
- lib/tumbler/manager/version.rb
|
144
150
|
- lib/tumbler/rake_tasks.rb
|
145
151
|
- lib/tumbler/runner.rb
|
146
152
|
- lib/tumbler/updater.rb
|
147
153
|
- lib/tumbler/version.rb
|
148
|
-
- spec/
|
154
|
+
- spec/bin_tumbler_spec.rb
|
149
155
|
- spec/changelog_spec.rb
|
150
156
|
- spec/gemspec_spec.rb
|
151
157
|
- spec/generate_spec.rb
|
@@ -154,14 +160,9 @@ files:
|
|
154
160
|
- spec/tasks_spec.rb
|
155
161
|
- spec/updater_spec.rb
|
156
162
|
- spec/version_spec.rb
|
157
|
-
- template/Gemfile
|
158
|
-
- template/Rakefile
|
159
|
-
- template/generic.Tumbler.erb
|
160
|
-
- template/generic.gemspec.erb
|
161
163
|
- test1
|
162
164
|
- thinking.txt
|
163
165
|
- thinking2.txt
|
164
|
-
- tumbler-0.0.1.gem
|
165
166
|
- tumbler.gemspec
|
166
167
|
has_rdoc: true
|
167
168
|
homepage: http://github.com/joshbuddy/tumbler
|
@@ -198,7 +199,7 @@ signing_key:
|
|
198
199
|
specification_version: 3
|
199
200
|
summary: This is awesome.
|
200
201
|
test_files:
|
201
|
-
- spec/
|
202
|
+
- spec/bin_tumbler_spec.rb
|
202
203
|
- spec/changelog_spec.rb
|
203
204
|
- spec/gemspec_spec.rb
|
204
205
|
- spec/generate_spec.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.0.4
|
data/lib/tumbler/changelog.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'tempfile'
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
|
-
class Tumbler
|
5
|
-
class Changelog
|
6
|
-
include Runner
|
7
|
-
|
8
|
-
DEFAULT_FILE = 'CHANGELOG'
|
9
|
-
|
10
|
-
attr_reader :file
|
11
|
-
|
12
|
-
def initialize(manager, &block)
|
13
|
-
@manager = manager
|
14
|
-
instance_eval(&block) if block
|
15
|
-
end
|
16
|
-
|
17
|
-
def filename(file)
|
18
|
-
@basefile = file
|
19
|
-
@file = File.join(@manager.base, file)
|
20
|
-
end
|
21
|
-
|
22
|
-
def write_version_header
|
23
|
-
prepend "== #{@manager.version}\n\n"
|
24
|
-
end
|
25
|
-
|
26
|
-
def prepend(data)
|
27
|
-
if @manager.noop
|
28
|
-
@manager.dry "Prepending #{data} to #{@basefile}"
|
29
|
-
else
|
30
|
-
Tempfile.open('changelog') do |tmp|
|
31
|
-
tmp.puts data
|
32
|
-
File.open(@file) do |f|
|
33
|
-
f.each do |line|
|
34
|
-
tmp << line
|
35
|
-
end
|
36
|
-
end
|
37
|
-
tmp.close
|
38
|
-
FileUtils.copy(tmp.path, @file)
|
39
|
-
File.unlink(tmp.path)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def update
|
45
|
-
ensure_existence
|
46
|
-
prepend("\n")
|
47
|
-
prepend(@manager.latest_changes.inject('') { |changes, change| changes << "* #{change.summary} (#{change.author}, #{change.hash})\n" })
|
48
|
-
end
|
49
|
-
|
50
|
-
def ensure_existence
|
51
|
-
File.open(@file, 'w') {|f| f << ''} unless File.exist?(@file)
|
52
|
-
end
|
53
|
-
|
54
|
-
def commit
|
55
|
-
sh "git commit #{@basefile} -m'Updated changelog'"
|
56
|
-
end
|
57
|
-
|
58
|
-
def base
|
59
|
-
@manager.base
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
data/template/Gemfile
DELETED
data/tumbler-0.0.1.gem
DELETED
Binary file
|