rkh-monk 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -6,6 +6,6 @@ task :default => :test
6
6
 
7
7
  namespace :test do
8
8
  task :integration do
9
- system "cd test && mkdir -p tmp && ruby integration_test.rb"
9
+ system "cd test && ruby integration_test.rb"
10
10
  end
11
11
  end
@@ -0,0 +1,111 @@
1
+ require 'thor/core_ext/hash_with_indifferent_access'
2
+ require 'fileutils'
3
+ require 'monk'
4
+
5
+ class Monk < Thor
6
+ class Skeleton
7
+
8
+ include Thor::CoreExt
9
+ include FileUtils
10
+ attr_accessor :options, :target
11
+
12
+ DEFAULTS = { "remote_name" => "skeleton", "branch" => "master" }
13
+
14
+ def initialize(url = nil, opts = {})
15
+ opts, url = opts.merge(url), nil if url.respond_to? :merge
16
+ self.options = HashWithIndifferentAccess.new opts
17
+ options[:url] ||= url
18
+ raise ArgumentError, "no url given" unless options.url?
19
+ end
20
+
21
+ def mirror_path
22
+ return unless mirror?
23
+ options[:mirror_path] ||= begin
24
+ require 'digest/md5'
25
+ File.join(Monk.monk_mirrors, Digest::MD5.hexdigest(options[:url]))
26
+ end
27
+ end
28
+
29
+ def update_mirror
30
+ return unless mirror?
31
+ if File.exist? mirror_path
32
+ chdir(mirror_path) { system "git pull origin -q >/dev/null 2>&1"}
33
+ else
34
+ mkdir_p Monk.monk_mirrors
35
+ system "git clone -q #{url} #{mirror_path}"
36
+ end
37
+ end
38
+
39
+ def create(directory)
40
+ update_mirror
41
+ if Dir["#{directory}/*"].empty?
42
+ self.target = directory
43
+ return false unless clone_command
44
+ clean_up unless keep_remote?
45
+ true
46
+ end
47
+ end
48
+
49
+ def advanced_clone?
50
+ branch? or keep_remote?
51
+ end
52
+
53
+ def clone_command
54
+ advanced_clone? ? advanced_clone : fast_clone
55
+ end
56
+
57
+ def mirror_url
58
+ mirror? ? mirror_path : url
59
+ end
60
+
61
+ def fast_clone
62
+ system "git clone -q --depth 1 #{mirror_url} #{target}"
63
+ end
64
+
65
+ def advanced_clone
66
+ mkdir_p target
67
+ Dir.chdir target do
68
+ system "(git init -q &&
69
+ git remote add -t #{branch} -f #{remote_name} #{mirror_url} &&
70
+ git checkout -t #{remote_name}/#{branch} -q) >/dev/null 2>&1"
71
+ end
72
+ end
73
+
74
+ def clean_up
75
+ Dir.chdir(target) { system "rm -Rf .git" }
76
+ end
77
+
78
+ def config
79
+ options.keys == ["url"] ? options["url"] : Hash.new.replace(options)
80
+ end
81
+
82
+ def to_yaml(opts = {})
83
+ config.to_yaml(opts)
84
+ end
85
+
86
+ def description
87
+ parameters = options.map do |key, value|
88
+ case key
89
+ when "url", "mirror_path" then nil
90
+ when "mirror", "keep_remote"
91
+ "#{"no-" unless value}#{key.gsub("_", "-")}"
92
+ else
93
+ "#{key}: #{value.inspect}"
94
+ end
95
+ end.compact.join ", "
96
+ parameters = "(#{parameters})" unless parameters.empty?
97
+ "#{url} #{parameters}"
98
+ end
99
+
100
+ def method_missing(name, *args, &block)
101
+ name = name.to_s
102
+ return options[name] || DEFAULTS[name] if Monk.git_options.include? name
103
+ result = options.send(name, *args, &block)
104
+ if result.equal? options then self
105
+ elsif result.is_a? Hash then Skeleton.new result
106
+ else result
107
+ end
108
+ end
109
+
110
+ end
111
+ end
data/lib/monk.rb CHANGED
@@ -1,109 +1,140 @@
1
1
  #! /usr/bin/env ruby
2
2
 
3
+ $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
4
+
3
5
  require "thor"
4
6
  require "yaml"
5
- require "fileutils"
7
+
8
+ require "monk/skeleton"
6
9
 
7
10
  class Monk < Thor
8
11
  include Thor::Actions
9
12
 
10
- class << self
11
- private
12
-
13
- # options every git aware task takes
14
- def git_options
15
- method_option :branch, :type => :string, :alias => "-b"
16
- method_option :keep_remote, :type => :boolean
17
- method_option :remote_name, :type => :string
18
- end
13
+ class_options[:skip].aliases.delete "-s"
14
+
15
+ def self.git_option(name, options = {})
16
+ class_option name, options.merge(:group => :git)
17
+ git_options << name.to_s
18
+ end
19
19
 
20
+ def self.git_options
21
+ @git_options ||= ["mirror_path"]
20
22
  end
21
-
22
- desc "init", "Initialize a Monk application"
23
- method_option :skeleton, :type => :string, :aliases => "-s"
24
- git_options
23
+
24
+ def self.monk_home
25
+ ENV["MONK_HOME"] || File.join(Thor::Util.user_home)
26
+ end
27
+
28
+ def self.monk_mirrors
29
+ File.join(monk_home, ".monk_mirrors")
30
+ end
31
+
32
+ git_option :branch, :type => :string, :aliases => "-b",
33
+ :desc => "Specify skeleton branch to use."
34
+ git_option :keep_remote, :type => :boolean, :aliases => "-k",
35
+ :desc => "Do not remove .git folder and keep skeleton as remote"
36
+ git_option :remote_name, :type => :string, :aliases => "-r",
37
+ :desc => "Remote name to use for the skeleton. Default is skeleton"
38
+ git_option :mirror, :type => :boolean, :aliases => "-m",
39
+ :desc => "Keep local mirror of the skeleton. For offline use and frequent project creation"
40
+
41
+ desc "init", "Initialize a Monk application. Will try to update mirror for given skeleton."
42
+ method_option :skeleton, :type => :string, :aliases => "-s"
25
43
  def init(target = ".")
26
- clone(source(options[:skeleton] || "default"), target) ?
27
- cleanup(target) :
44
+ say_status :fetching, skeleton.url
45
+ skeleton.create(target) ?
46
+ say_status(:initialized, target) :
28
47
  say_status(:error, clone_error(target))
29
48
  end
30
-
49
+
31
50
  desc "show NAME", "Display the repository address for NAME"
32
51
  def show(name)
33
- if monk_config.include? name
34
- say_status name, *source(name).values_at(:url, :branch)
35
- else
36
- say_status name, "repository not found"
37
- end
52
+ say_status name, monk_config[name] ? skeleton(name).description : "repository not found"
38
53
  end
39
54
 
40
55
  desc "list", "Lists the configured repositories"
41
56
  def list
42
- monk_config.keys.sort.each do |key|
43
- show(key)
44
- end
57
+ monk_config.keys.sort.each { |key| show(key) }
45
58
  end
46
59
 
47
60
  desc "add NAME REPOSITORY_URL", "Add the repository to the configuration file"
48
- git_options
49
61
  def add(name, repository_url)
50
- monk_config[name] = { :url => repository_url }
51
- monk_config[name].merge! options
62
+ monk_config[name] = Skeleton.new(repository_url)
63
+ monk_config[name].merge! git_options
64
+ monk_config[name].update_mirror
52
65
  write_monk_config_file
53
- end
66
+ say_status :added, name
67
+ end
68
+
69
+ desc "change NAME", "Modifies options for a repository without having to repeat the url"
70
+ def change(name)
71
+ if monk_config.include? name
72
+ monk_config[name].merge! git_options
73
+ if options.include? "mirror" and not options.mirror?
74
+ path = monk_config[name].delete "mirror_path"
75
+ system "rm -R #{path}" if path
76
+ end
77
+ write_monk_config_file
78
+ say_status :modified, name
79
+ else
80
+ say_status name, "repository not found"
81
+ end
82
+ end
83
+
84
+ desc "rm NAME", "Remove the repository from the configuration file"
85
+ def rm(name)
86
+ skel = monk_config.delete(name)
87
+ write_monk_config_file
88
+ system "rm -R #{skel.mirror_path}" if skel.mirror_path?
89
+ say_status :deleted, name
90
+ end
91
+
92
+ desc "copy FROM TO", "Creates a copy of an existing skeleton"
93
+ def copy(from, to)
94
+ return unless monk_config.include? from
95
+ monk_config[to] = skeleton(from)
96
+ monk_config[to].delete "mirror_path"
97
+ write_monk_config_file
98
+ say_status :added, to
99
+ end
100
+
101
+ desc "cleanup", "Removes mirrors no longer used (or all mirrors with --all)"
102
+ method_option :all, :type => :boolean, :aliases => "-a"
103
+ def cleanup
104
+ say_status "scanning", "mirrors"
105
+ mirrors = Dir.glob File.join(Monk.monk_mirrors, "*")
106
+ monk_config.each_value do |skel|
107
+ mirrors.delete skel.mirror_path if skel.mirror_path?
108
+ end unless options["all"]
109
+ say_status "cleanup", "mirrors"
110
+ system "rm -R #{mirrors.join " "}"
111
+ end
112
+
113
+ desc "update", "Updates all mirrors or mirrors for given skeleton."
114
+ def update(name = nil)
115
+ name ||= options[:skeleton]
116
+ return monk_config.each_key { |s| update(s) } unless name
117
+ skel = skeleton(name)
118
+ if skel.mirror?
119
+ say_status "update", name
120
+ skel.update_mirror
121
+ end
122
+ end
54
123
 
55
- desc "change NAME", "Modifies options for a repository without having to repeat the url."
56
- git_options
57
- def change(name)
58
- if monk_config.include? name
59
- monk_config[name].merge! options
60
- write_monk_config_file
61
- else
62
- say_status name, "repository not found"
63
- end
64
- end
65
-
66
- desc "rm NAME", "Remove the repository from the configuration file"
67
- def rm(name)
68
- monk_config.delete(name)
69
- write_monk_config_file
70
- end
71
-
72
- desc "copy FROM TO", "Creates a copy of an existing skeleton."
73
- git_options
74
- def copy(from, to)
75
- return unless monk_config.include? from
76
- monk_config[to] = monk_config[from].merge options
77
- write_monk_config_file
78
- end
79
124
 
80
125
  private
81
126
 
82
- def clone(src, target)
83
- if Dir["#{target}/*"].empty?
84
- FileUtils.mkdir_p target
85
- Dir.chdir(target) do
86
- say_status :fetching, src[:url]
87
- branch = src[:branch] || "master"
88
- remote = src[:remote_name] || "skeleton"
89
- system <<-EOS
90
- git init &&
91
- git remote add -t #{branch} -f #{remote} #{src[:url]} &&
92
- git checkout -t #{remote}/#{branch}
93
- EOS
94
- end
95
- end
96
- end
97
-
98
- def cleanup(target)
99
- inside(target) { remove_file ".git" } unless options.keep_remote?
100
- say_status :initialized, target
101
- end
102
-
103
- def source(name)
104
- monk_config[name]
127
+ def skeleton(name = nil)
128
+ name ||= options[:skeleton] || "default"
129
+ (monk_config[name] || Skeleton.new(name)).merge git_options
105
130
  end
106
131
 
132
+ def git_options
133
+ self.class.git_options.inject({}) do |opts, key|
134
+ opts.merge! key => options[key] if options.include? key
135
+ opts
136
+ end
137
+ end
107
138
 
108
139
  def monk_config_file
109
140
  @monk_config_file ||= File.join(monk_home, ".monk")
@@ -113,20 +144,19 @@ private
113
144
  @monk_config ||= begin
114
145
  write_monk_config_file unless File.exists? monk_config_file
115
146
  YAML.load_file(monk_config_file).inject({}) do |config, (key, value)|
116
- # fixing old monk config files
117
- config.merge key => value.respond_to?(:keys) ? value : {:url => value}
147
+ config.merge key => Skeleton.new(value)
118
148
  end
119
149
  end
120
150
  end
121
151
 
122
152
  def write_monk_config_file
123
- remove_file monk_config_file
124
- create_file monk_config_file do
125
- config = @monk_config || { "default" => {:url => "git://github.com/monkrb/skeleton.git"} }
153
+ remove_file monk_config_file, :verbose => false
154
+ create_file(monk_config_file, nil, :verbose => false) do
155
+ config = @monk_config || { "default" => Skeleton.new("git://github.com/monkrb/skeleton.git") }
126
156
  config.to_yaml
127
157
  end
128
158
  end
129
-
159
+
130
160
  def self.source_root
131
161
  "."
132
162
  end
@@ -137,6 +167,6 @@ private
137
167
  end
138
168
 
139
169
  def monk_home
140
- ENV["MONK_HOME"] || File.join(Thor::Util.user_home)
170
+ self.class.monk_home
141
171
  end
142
- end
172
+ end
data/monk.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "monk"
3
- s.version = "0.0.5"
3
+ s.version = "0.0.6"
4
4
  s.summary = "Monk, the glue framework"
5
5
  s.description = "Monk is a glue framework for web development. It means that instead of installing all the tools you need for your projects, you can rely on a git repository and a list of dependencies, and Monk will care of the rest. By default, it ships with a Sinatra application that includes Contest, Stories, Webrat, Ohm and some other niceties, along with a structure and helpful documentation to get your hands wet in no time."
6
6
  s.authors = ["Damian Janowski", "Michel Martens"]
@@ -12,8 +12,8 @@ Gem::Specification.new do |s|
12
12
  s.executables << "monk"
13
13
 
14
14
  s.add_dependency("thor", "~> 0.11")
15
- s.add_dependency("dependencies", ">= 0.0.6")
15
+ s.add_dependency("dependencies", ">= 0.0.7")
16
16
  s.requirements << "git"
17
17
 
18
- s.files = ["LICENSE", "README.markdown", "Rakefile", "bin/monk", "lib/monk.rb", "monk.gemspec", "test/commands.rb", "test/integration_test.rb", "test/monk_test.rb"]
18
+ s.files = ["LICENSE", "README.markdown", "Rakefile", "bin/monk", "lib/monk/skeleton.rb", "lib/monk.rb", "monk.gemspec", "test/commands.rb", "test/integration_test.rb", "test/monk_test.rb", "test/test_helper.rb"]
19
19
  end
@@ -69,6 +69,9 @@ class TestMonk < Test::Unit::TestCase
69
69
  try_server "ruby1.9 init.rb", 4567
70
70
  try_reloading
71
71
  try_server "rackup1.9", 9292
72
+
73
+ try_server "jruby init.rb", 4567
74
+ try_reloading
72
75
  end
73
76
  end
74
77
  end
data/test/monk_test.rb CHANGED
@@ -3,12 +3,12 @@ require File.join(File.dirname(__FILE__), "test_helper")
3
3
  class TestMonk < Test::Unit::TestCase
4
4
  context "monk init NAME" do
5
5
  should "fail if the target working directory is not empty" do
6
- Dir.chdir(root("test", "tmp")) do
7
- FileUtils.rm_rf("monk-test")
8
- FileUtils.mkdir("monk-test")
6
+ chdir tmp_path do
7
+ rm_rf("monk-test")
8
+ mkdir("monk-test")
9
9
 
10
- Dir.chdir("monk-test") do
11
- FileUtils.touch("foobar")
10
+ chdir("monk-test") do
11
+ touch("foobar")
12
12
  end
13
13
 
14
14
  out, err = monk("init monk-test")
@@ -17,24 +17,125 @@ class TestMonk < Test::Unit::TestCase
17
17
  end
18
18
 
19
19
  should "create a skeleton app in the target directory" do
20
- Dir.chdir(root("test", "tmp")) do
21
- FileUtils.rm_rf("monk-test")
20
+ chdir tmp_path do
21
+ rm_rf("monk-test")
22
22
 
23
23
  out, err = monk("init monk-test")
24
24
  assert_match /initialized.* monk-test/, out
25
+ assert is_template?("monk-test", "default")
25
26
  end
26
27
  end
28
+
29
+ should "not remove .git if keep-remote option is passed" do
30
+ chdir tmp_path do
31
+ rm_rf("monk-test")
32
+
33
+ out, err = monk("init monk-test --keep-remote")
34
+ assert_match /initialized.* monk-test/, out
35
+ assert File.exist?(tmp_path("monk-test", ".git"))
36
+ end
37
+ end
38
+
39
+ should "remove .git if no-keep-remote option is passed" do
40
+ chdir tmp_path do
41
+ rm_rf("monk-test")
42
+
43
+ out, err = monk("init monk-test --no-keep-remote")
44
+ assert_match /initialized.* monk-test/, out
45
+ assert !File.exist?(tmp_path("monk-test", ".git"))
46
+ end
47
+ end
48
+
49
+ should "not remove .git if k option is passed" do
50
+ chdir tmp_path do
51
+ rm_rf("monk-test")
52
+
53
+ out, err = monk("init monk-test -k")
54
+ assert_match /initialized.* monk-test/, out
55
+ assert File.exist?(tmp_path("monk-test", ".git"))
56
+ end
57
+ end
58
+
59
+ should "name remote after remote-name parameter" do
60
+ chdir tmp_path do
61
+ rm_rf "monk-test"
62
+ out, err = monk("init monk-test --keep-remote --remote-name foo")
63
+ assert_match /initialized.* monk-test/, out
64
+ chdir("monk-test") { assert %x[git remote show]["foo"] }
65
+ end
66
+ end
67
+
68
+ should "be able to pull from skeletons with parameter mirror if original is not available" do
69
+ chdir tmp_path do
70
+ rm_rf "monk-test"
71
+ rm_rf create_template("foo", "--mirror")
72
+ out, err = monk("init monk-test --skeleton foo")
73
+ assert_match /initialized.* monk-test/, out
74
+ assert is_template?("monk-test", "foo")
75
+ end
76
+ end
77
+
78
+ should "be able to pull from skeletons with parameter m if original is not available" do
79
+ chdir tmp_path do
80
+ rm_rf "monk-test"
81
+ rm_rf create_template("foo", "-m")
82
+ out, err = monk("init monk-test --skeleton foo")
83
+ assert_match /initialized.* monk-test/, out
84
+ assert is_template?("monk-test", "foo")
85
+ end
86
+ end
87
+
88
+ should "be able to pull from a url instead of a known skeleton" do
89
+ chdir tmp_path do
90
+ rm_rf "monk-test"
91
+ path = create_template("foo")
92
+ out, err = monk("init monk-test --skeleton #{path}")
93
+ assert_match /initialized.* monk-test/, out
94
+ assert is_template?("monk-test", "foo")
95
+ end
96
+ end
97
+
98
+ should "respect the branch parameter" do
99
+ chdir tmp_path do
100
+ in_template "foobar" do
101
+ system "git checkout -b foo 1>/dev/null 2>&1 || git checkout foo -q"
102
+ File.open("only_in_branch", "w").close
103
+ system "(git add only_in_branch && git commit -a -m 'added') 1>/dev/null 2>&1"
104
+ end
105
+ rm_rf "monk-test"
106
+ out, err = monk("init monk-test --skeleton foobar --branch foo")
107
+ assert_match /initialized.* monk-test/, out
108
+ assert is_template?("monk-test", "foobar")
109
+ assert File.exist?(File.join("monk-test", "only_in_branch"))
110
+ end
111
+ end
112
+
113
+ should "respect the b parameter" do
114
+ chdir tmp_path do
115
+ in_template "foobar" do
116
+ system "git checkout -b foo 1>/dev/null 2>&1 || git checkout foo -q"
117
+ File.open("only_in_branch", "w").close
118
+ system "(git add only_in_branch && git commit -a -m 'added') 1>/dev/null 2>&1"
119
+ end
120
+ rm_rf "monk-test"
121
+ out, err = monk("init monk-test --skeleton foobar -b foo")
122
+ assert_match /initialized.* monk-test/, out
123
+ assert is_template?("monk-test", "foobar")
124
+ assert File.exist?(File.join("monk-test", "only_in_branch"))
125
+ end
126
+ end
127
+
27
128
  end
28
129
 
29
130
  context "monk init" do
30
131
  should "fail if the current working directory is not empty" do
31
- Dir.chdir(root("test", "tmp")) do
32
- FileUtils.rm_rf("monk-test")
33
- FileUtils.mkdir("monk-test")
132
+ chdir tmp_path do
133
+ rm_rf("monk-test")
134
+ mkdir("monk-test")
34
135
 
35
136
 
36
- Dir.chdir("monk-test") do
37
- FileUtils.touch("foobar")
137
+ chdir("monk-test") do
138
+ touch("foobar")
38
139
  out, err = monk("init")
39
140
  assert_match /error/, out
40
141
  end
@@ -42,36 +143,103 @@ class TestMonk < Test::Unit::TestCase
42
143
  end
43
144
 
44
145
  should "create a skeleton app in the working directory" do
45
- Dir.chdir(root("test", "tmp")) do
46
- FileUtils.rm_rf("monk-test")
47
- FileUtils.mkdir("monk-test")
146
+ chdir tmp_path do
147
+ rm_rf("monk-test")
148
+ mkdir("monk-test")
48
149
 
49
- Dir.chdir("monk-test") do
150
+ chdir("monk-test") do
50
151
  out, err = monk("init")
51
152
  assert_match /initialized/, out
153
+ assert is_template?(".", "default")
52
154
  end
53
155
  end
54
156
  end
55
157
 
56
158
  should "use an alternative skeleton if the option is provided" do
57
- Dir.chdir(root("test", "tmp")) do
58
- FileUtils.rm_rf("monk-test")
59
- FileUtils.mkdir("monk-test")
159
+ chdir tmp_path do
160
+ rm_rf("monk-test")
161
+ mkdir("monk-test")
60
162
 
61
- monk("add foobar git://github.com/monkrb/skeleton.git")
163
+ create_template "foobar"
62
164
 
63
- Dir.chdir("monk-test") do
165
+ chdir("monk-test") do
64
166
  out, err = monk("init -s foobar")
65
167
  assert_match /initialized/, out
168
+ assert is_template?(".", "foobar")
66
169
  end
67
170
  end
68
171
  end
172
+
173
+ should "not remove .git if keep-remote option is passed" do
174
+ chdir tmp_path do
175
+ rm_rf("monk-test")
176
+ mkdir("monk-test")
177
+
178
+ chdir("monk-test") do
179
+ out, err = monk("init --keep-remote")
180
+ assert_match /initialized/, out
181
+ assert File.exist?(".git")
182
+ end
183
+ end
184
+ end
185
+
186
+ should "remove .git if no-keep-remote option is passed" do
187
+ chdir tmp_path do
188
+ rm_rf("monk-test")
189
+ mkdir("monk-test")
190
+
191
+ chdir("monk-test") do
192
+ out, err = monk("init --no-keep-remote")
193
+ assert_match /initialized/, out
194
+ assert !File.exist?(".git")
195
+ end
196
+ end
197
+ end
198
+
199
+ should "not remove .git if k option is passed" do
200
+ chdir tmp_path do
201
+ rm_rf("monk-test")
202
+ mkdir("monk-test")
203
+
204
+ chdir("monk-test") do
205
+ out, err = monk("init -k")
206
+ assert_match /initialized/, out
207
+ assert File.exist?(".git")
208
+ end
209
+ end
210
+ end
211
+
212
+ should "name remote after remote-name parameter" do
213
+ chdir tmp_path do
214
+ rm_rf "monk-test"
215
+ mkdir "monk-test"
216
+ chdir "monk-test" do
217
+ out, err = monk("init --keep-remote --remote-name foo")
218
+ assert_match /initialized/, out
219
+ assert %x[git remote show]["foo"]
220
+ end
221
+ end
222
+ end
223
+
224
+ should "be able to pull from a url instead of a known skeleton" do
225
+ chdir tmp_path do
226
+ rm_rf "monk-test"
227
+ mkdir "monk-test"
228
+ path = create_template("foo")
229
+ chdir "monk-test" do
230
+ out, err = monk("init --skeleton #{path}")
231
+ assert_match /initialized/, out
232
+ assert is_template?(".", "foo")
233
+ end
234
+ end
235
+ end
236
+
69
237
  end
70
238
 
71
239
  context "monk show NAME" do
72
240
  should "display the repository for NAME" do
73
241
  out, err = monk("show default")
74
- assert out["git://github.com/monkrb/skeleton.git"]
242
+ assert out[template_path "default"]
75
243
  end
76
244
 
77
245
  should "display nothing if NAME is not set" do
@@ -84,7 +252,7 @@ class TestMonk < Test::Unit::TestCase
84
252
  should "display the configured repositories" do
85
253
  out, err = monk("list")
86
254
  assert out["default"]
87
- assert out["git://github.com/monkrb/skeleton.git"]
255
+ assert out[template_path "default"]
88
256
  end
89
257
  end
90
258
 
@@ -98,30 +266,85 @@ class TestMonk < Test::Unit::TestCase
98
266
  end
99
267
 
100
268
  should "allow to fetch from the added repository when using the skeleton parameter" do
101
- monk("add glue git://github.com/monkrb/glue.git")
269
+ path = create_template "foo"
102
270
 
103
- Dir.chdir(root("test", "tmp")) do
104
- FileUtils.rm_rf("monk-test")
105
- FileUtils.mkdir("monk-test")
271
+ chdir(tmp_path) do
272
+ rm_rf("monk-test")
273
+ mkdir("monk-test")
106
274
 
107
- out, err = monk("init monk-test --skeleton glue")
275
+ out, err = monk("init monk-test --skeleton foo")
108
276
  assert_match /initialized/, out
109
- assert_match /glue.git/, out
277
+ assert_match /#{path}/, out
278
+ assert is_template?("monk-test", "foo")
110
279
  end
111
280
  end
112
281
 
113
282
  should "allow to fetch from the added repository when using the s parameter" do
114
- monk("add glue git://github.com/monkrb/glue.git")
283
+ path = create_template "foo"
115
284
 
116
- Dir.chdir(root("test", "tmp")) do
117
- FileUtils.rm_rf("monk-test")
118
- FileUtils.mkdir("monk-test")
285
+ chdir(tmp_path) do
286
+ rm_rf("monk-test")
287
+ mkdir("monk-test")
119
288
 
120
- out, err = monk("init monk-test -s glue")
289
+ out, err = monk("init monk-test -s foo")
121
290
  assert_match /initialized/, out
122
- assert_match /glue.git/, out
291
+ assert_match /#{path}/, out
292
+ assert is_template?("monk-test", "foo")
123
293
  end
124
294
  end
295
+
296
+ should "not remove .git if keep-remote option is passed" do
297
+ chdir tmp_path do
298
+ rm_rf("monk-test")
299
+ mkdir("monk-test")
300
+ create_template "foo", "--keep-remote"
301
+
302
+ chdir("monk-test") do
303
+ out, err = monk("init --skeleton foo")
304
+ assert_match /initialized/, out
305
+ assert File.exist?(".git")
306
+ end
307
+ end
308
+ end
309
+
310
+ should "remove .git if no-keep-remote option is passed" do
311
+ chdir tmp_path do
312
+ rm_rf("monk-test")
313
+ mkdir("monk-test")
314
+ create_template "foo", "--no-keep-remote"
315
+
316
+ chdir("monk-test") do
317
+ out, err = monk("init --skeleton foo")
318
+ assert_match /initialized/, out
319
+ assert !File.exist?(".git")
320
+ end
321
+ end
322
+ end
323
+
324
+ should "not remove .git if k option is passed" do
325
+ chdir tmp_path do
326
+ rm_rf("monk-test")
327
+ mkdir("monk-test")
328
+ create_template "foo", "-k"
329
+
330
+ chdir("monk-test") do
331
+ out, err = monk("init --skeleton foo")
332
+ assert_match /initialized/, out
333
+ assert File.exist?(".git")
334
+ end
335
+ end
336
+ end
337
+
338
+ should "name remote after remote-name parameter" do
339
+ chdir tmp_path do
340
+ rm_rf "monk-test"
341
+ create_template "foo", "--keep-remote --remote-name foo"
342
+ out, err = monk("init monk-test --skeleton foo")
343
+ assert_match /initialized.* monk-test/, out
344
+ chdir("monk-test") { assert %x[git remote show]["foo"] }
345
+ end
346
+ end
347
+
125
348
  end
126
349
 
127
350
  context "monk rm NAME" do
@@ -132,4 +355,28 @@ class TestMonk < Test::Unit::TestCase
132
355
  assert out["repository not found"]
133
356
  end
134
357
  end
358
+
359
+ context "monk copy FROM TO" do
360
+ should "copy a template" do
361
+ chdir tmp_path do
362
+ rm_rf "monk-test"
363
+ monk "copy default foo"
364
+ monk "init monk-test -s foo"
365
+ assert is_template?("monk-test", "default")
366
+ end
367
+ end
368
+ end
369
+
370
+ context "monk change NAME" do
371
+ should "remove the named repository from the configuration" do
372
+ monk("add foobar git://github.com/monkrb/foo.git --keep-remote")
373
+ out, err = monk("show foobar")
374
+ assert out["keep-remote"]
375
+ assert !out["no-keep-remote"]
376
+ monk("change foobar --no-keep-remote")
377
+ out, err = monk("show foobar")
378
+ assert out["no-keep-remote"]
379
+ end
380
+ end
381
+
135
382
  end
@@ -0,0 +1,63 @@
1
+ #require "rubygems"
2
+ require "contest"
3
+ require "hpricot"
4
+ require "fileutils"
5
+
6
+ ROOT = File.expand_path(File.join(File.dirname(__FILE__), ".."))
7
+
8
+ $:.unshift ROOT
9
+
10
+ require "test/commands"
11
+
12
+ class Test::Unit::TestCase
13
+ include Test::Commands
14
+ include FileUtils
15
+
16
+ def root(*args)
17
+ File.expand_path File.join(ROOT, *args)
18
+ end
19
+
20
+ def tmp_path(*args)
21
+ root("test", "tmp", *args)
22
+ end
23
+
24
+ def setup
25
+ mkdir_p tmp_path
26
+ rm_f tmp_path(".monk")
27
+ create_template "default"
28
+ end
29
+
30
+ def template_path(name = default)
31
+ tmp_path("templates", name)
32
+ end
33
+
34
+ def create_template(name, add = "")
35
+ dir = template_path(name)
36
+ mkdir_p dir
37
+ chdir(dir) do
38
+ unless File.exist? "name"
39
+ File.open("name", "w") { |f| f << name }
40
+ raise RuntimeError, "could not initialize git repo" unless system <<-EOS
41
+ git init -q &&
42
+ git add name 2>/dev/null &&
43
+ git ci -m "created template" -q
44
+ EOS
45
+ end
46
+ end
47
+ monk("add #{name} #{dir} #{add}") if add
48
+ dir
49
+ end
50
+
51
+ def in_template(name, &block)
52
+ chdir(create_template(name), &block)
53
+ end
54
+
55
+ def is_template?(path, name)
56
+ file = File.join path, "name"
57
+ File.exist?(file) && File.read(file) == name
58
+ end
59
+
60
+ def monk(args = nil)
61
+ sh("env MONK_HOME=#{File.join(ROOT, "test", "tmp")} ruby -rubygems #{root "bin/monk"} #{args}")
62
+ end
63
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rkh-monk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damian Janowski
@@ -31,7 +31,7 @@ dependencies:
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: 0.0.6
34
+ version: 0.0.7
35
35
  version:
36
36
  description: Monk is a glue framework for web development. It means that instead of installing all the tools you need for your projects, you can rely on a git repository and a list of dependencies, and Monk will care of the rest. By default, it ships with a Sinatra application that includes Contest, Stories, Webrat, Ohm and some other niceties, along with a structure and helpful documentation to get your hands wet in no time.
37
37
  email:
@@ -48,14 +48,15 @@ files:
48
48
  - README.markdown
49
49
  - Rakefile
50
50
  - bin/monk
51
+ - lib/monk/skeleton.rb
51
52
  - lib/monk.rb
52
53
  - monk.gemspec
53
54
  - test/commands.rb
54
55
  - test/integration_test.rb
55
56
  - test/monk_test.rb
57
+ - test/test_helper.rb
56
58
  has_rdoc: false
57
59
  homepage: http://monkrb.com
58
- licenses:
59
60
  post_install_message:
60
61
  rdoc_options: []
61
62
 
@@ -76,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
77
  requirements:
77
78
  - git
78
79
  rubyforge_project: monk
79
- rubygems_version: 1.3.5
80
+ rubygems_version: 1.2.0
80
81
  signing_key:
81
82
  specification_version: 2
82
83
  summary: Monk, the glue framework