rkh-monk 0.0.5 → 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/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