monk-shake 1.0.0.pre1

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.
@@ -0,0 +1,59 @@
1
+ Monk
2
+ ====
3
+
4
+ A feature-complete rewrite of Monk that uses Shake instead of Thor.
5
+ It is modeled after Monk 1.0 beta.
6
+
7
+ See more info in [monkrb.com](http://www.morkrb.com).
8
+
9
+ **NOTE:** This is NOT an official replacement for Monk, nor is it
10
+ supported or endorsed by Citrusbyte.
11
+
12
+ ### What is it?
13
+
14
+ * Monk lets you start a Sinatra project painlessly with everything set
15
+ up for you.
16
+
17
+ ### Get started
18
+
19
+ You may need to uninstall the original monk gem.
20
+
21
+ $ rvm @global # TIP: Recommended for RVM users
22
+ $ gem uninstall monk
23
+ $ gem install monk-shake --pre
24
+ $ monk
25
+
26
+ ### Differences from the real Monk in general
27
+
28
+ * *No more Thor!* The new Monkfile has deprecated the old Thorfile.
29
+ This version uses Shake instead.
30
+
31
+ * *Faster* as a result of above.
32
+
33
+ * New help screens. They are actually very helpful.
34
+
35
+ * This stores your config in a new format (YAML) in `~/.monk.conf`.
36
+
37
+ * The default skeleton is [github.com/rstacruz/monk-plus](https://github.com/rstacruz/monk-plus),
38
+ the mere reason being it's the only one that takes advantage of new
39
+ features at the moment.
40
+
41
+ ### Changes from Monk 0.x
42
+
43
+ * This doesn't rely on the `dependencies` gem.
44
+
45
+ * `monk init` will cache skeleton files so it'll run faster next time.
46
+
47
+ * New `monk install` command installs gems from the `.gems` manifest file.
48
+
49
+ * The command `monk unpack` now uses the more reliable RVM.
50
+
51
+ * New `monk lock` command generates a `.gems` file for you.
52
+
53
+ ### Differences from Monk 1.0 beta
54
+
55
+ * This does not require RVM.
56
+
57
+ * `monk install` will first check if a gem is installed. It will not
58
+ try to reinstall gems you already have.
59
+
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems' if RUBY_VERSION <= "1.9"
3
+ require File.expand_path('../../vendor/shake/lib/shake', __FILE__)
4
+
5
+ # Legacy Monk compatibility.
6
+ # If there is a Thorfile (but no Monkfile), assume it's a Monk <1.0 project.
7
+ # Defer to Thor for processing of that file.
8
+ thor = Shake.find_in_project('Thorfile')
9
+ if thor
10
+ monk = Shake.find_in_project('Monkfile')
11
+ if !monk
12
+ Dir.chdir File.dirname(thor)
13
+ require 'thor'
14
+ load 'Thorfile'
15
+ Monk.start
16
+ exit
17
+ end
18
+ end
19
+
20
+ require File.expand_path('../../lib/monk', __FILE__)
21
+
22
+ Monk.load_monkfile
23
+ Monk.run!
@@ -0,0 +1,313 @@
1
+ $:.push *Dir[File.expand_path('../../vendor/*/lib', __FILE__)]
2
+
3
+ require 'fileutils'
4
+ require 'shake'
5
+
6
+ class Monk < Shake
7
+ VERSION = "1.0.0.pre1"
8
+ PREFIX = File.expand_path('../monk', __FILE__)
9
+
10
+ autoload :Helpers, "#{PREFIX}/helpers"
11
+ autoload :InitHelpers, "#{PREFIX}/init_helpers"
12
+ autoload :Config, "#{PREFIX}/config"
13
+
14
+ extend Helpers
15
+ extend InitHelpers
16
+
17
+ task(:init) do
18
+ name = params.extract('-s') || 'default'
19
+ wrong_usage if params.size != 1
20
+
21
+ target = params.shift
22
+
23
+ unless config.skeletons[name]
24
+ pass "No such skeleton: #{name}\n" +
25
+ "Type `#{executable} list` for a list of known skeletons."
26
+ end
27
+
28
+ if File.exists?(target)
29
+ pass "Error: the target directory already exists."
30
+ end
31
+
32
+ skeleton_files = cache_skeleton(name)
33
+ pass "Error: can't retrieve the skeleton files." unless skeleton_files
34
+ cp_r skeleton_files, target
35
+
36
+ in_path (target) {
37
+ rm_rf '.git'
38
+ touch 'Monkfile'
39
+ system_q "rvm #{RUBY_VERSION}@#{target} --rvmrc --create" if rvm?
40
+ system_q "rvm rvmrc trust" if rvm?
41
+ }
42
+
43
+ puts
44
+ puts "Success! You've created a new project."
45
+ puts "Get started now:"
46
+ puts
47
+ puts " $ cd #{target}"
48
+ puts " $ #{executable} start"
49
+ puts
50
+
51
+ if rvm?
52
+ puts "An RVM gemset @#{target} has been created for you."
53
+ puts
54
+ end
55
+ end
56
+
57
+ task(:install) do
58
+ manifest = '.gems'
59
+
60
+ pass "This project does not have a .gems manifest." unless File.exists?(manifest)
61
+
62
+ gems = File.read(manifest).split("\n")
63
+
64
+ gems.reject! { |name| name =~ /^\s*(#|$)/ }
65
+ pass "The .gems manifest is empty." unless gems.any?
66
+
67
+ gems.reject! { |name| has_gem? name }
68
+ pass "All good! You have all needed gems installed." unless gems.any?
69
+
70
+ unless rvm?
71
+ err "Tip: RVM is a great way to manage gems across multiple projects."
72
+ err "See http://rvm.beginrescueend.com for more info."
73
+ err
74
+ end
75
+
76
+ gems.each { |name| system "gem install #{name}" }
77
+ end
78
+
79
+ task(:unpack) do
80
+ ensure_rvm or pass
81
+ system "rvm rvmrc load"
82
+ system "rvm gemset unpack vendor"
83
+ end
84
+
85
+ task(:lock) do
86
+ ensure_rvm or pass
87
+ system "rvm rvmrc load"
88
+ system "rvm gemset export .gems"
89
+ end
90
+
91
+ task(:add) do
92
+ wrong_usage unless params.size == 2
93
+ name, repo = params
94
+
95
+ existed = !!config.skeletons[name]
96
+
97
+ config.skeletons[name] = repo
98
+ config.save!
99
+
100
+ if existed
101
+ err "Updated skeleton #{name}."
102
+ else
103
+ err "Added skeleton #{name}."
104
+ end
105
+ err "Create a new project from this skeleton by typing: #{executable} init NAME -s #{name}"
106
+ end
107
+
108
+ task (:rm) do
109
+ wrong_usage if params.size != 1
110
+ name = params.first
111
+
112
+ if name == 'default'
113
+ pass "You can't delete the default skeleton."
114
+ elsif config.skeletons[name]
115
+ config.skeletons.delete name.to_s
116
+ config.save!
117
+
118
+ err "Removed #{name}."
119
+ else
120
+ err "No such skeleton."
121
+ err "See `#{executable} list` for a list of skeletons."
122
+ end
123
+ end
124
+
125
+ task(:purge) do
126
+ rm_rf cache_path if File.directory?(cache_path)
127
+ err "Monk cache clear."
128
+ end
129
+
130
+ task(:list) do
131
+ wrong_usage if params.any?
132
+
133
+ puts "Available skeletons:"
134
+ puts
135
+ config.skeletons.each do |name, repo|
136
+ puts " %-20s %s" % [ name, repo ]
137
+ end
138
+ puts
139
+ puts "Create a new project by typing `#{executable} init NAME -s SKELETON`."
140
+ end
141
+
142
+ task(:help) do
143
+ show_help_for(params.first) and pass if params.any?
144
+
145
+ show_task = Proc.new { |name, t| err " %-20s %s" % [ t.usage || name, t.description ] }
146
+
147
+ err "Usage: #{executable} <command>"
148
+ err
149
+
150
+ if project?
151
+ err "Dependency commands:"
152
+ tasks_for(:dependency).each &show_task
153
+ err
154
+ if other_tasks.any?
155
+ err "Project commands:"
156
+ other_tasks.each &show_task
157
+ err
158
+ end
159
+ else
160
+ err "Commands:"
161
+ tasks_for(:init).each &show_task
162
+ err
163
+ err "Skeleton commands:"
164
+ tasks_for(:skeleton).each &show_task
165
+ err
166
+ end
167
+
168
+ err "Other commands:"
169
+ tasks_for(:help).each &show_task
170
+
171
+ unless project?
172
+ err
173
+ err "Get started by typing:"
174
+ err " $ #{executable} init my_project"
175
+ err
176
+ err "Type `#{executable} help COMMAND` for additional help on a command."
177
+ err "See http://www.monkrb.com for more information."
178
+ end
179
+ end
180
+
181
+ task(:version) do
182
+ puts "Monk-shake version #{VERSION}"
183
+ end
184
+
185
+ invalid do
186
+ task = task(command)
187
+ if task
188
+ err "Invalid usage."
189
+ err "Try: #{executable} #{task.usage}"
190
+ err
191
+ err "Type `#{executable} help` for more info."
192
+ else
193
+ err "Invalid command: #{command}"
194
+ err "Type `#{executable} help` for more info."
195
+ end
196
+ end
197
+
198
+ # Task metadata
199
+ default :help
200
+
201
+ task(:init).tap do |t|
202
+ t.category = :init
203
+ t.usage = "init NAME"
204
+ t.description = "Starts a Monk project"
205
+ t.help = %{
206
+ Usage:
207
+
208
+ #{executable} init NAME [-s SKELETON]
209
+
210
+ Initializes a Monk application of a given name.
211
+
212
+ You may use a different skeleton by specifying `-s SKELETON` where
213
+ SKELETON refers to the name or URL of the skeleton. If this isn't specified,
214
+ the default skeleton is used.
215
+
216
+ Examples
217
+ --------
218
+
219
+ This creates a new Monk/Sinatra application in the directory `myapp`.
220
+
221
+ #{executable} init myapp
222
+
223
+ This creates a new application based on the skeleton in the given Git repo.
224
+
225
+ #{executable} add myskeleton https://github.com/rstacruz/myskeleton.git
226
+ #{executable} init myapp -s myskeleton
227
+ }.gsub(/^ {6}/,'').strip.split("\n")
228
+ end
229
+
230
+ task(:add).tap do |t|
231
+ t.category = :skeleton
232
+ t.usage = "add NAME URL"
233
+ t.description = "Adds a skeleton"
234
+ end
235
+
236
+ task(:rm).tap do |t|
237
+ t.category = :skeleton
238
+ t.usage = "rm NAME"
239
+ t.description = "Removes a skeleton"
240
+ end
241
+
242
+ task(:list).tap do |t|
243
+ t.category = :skeleton
244
+ t.description = "Lists known skeletons"
245
+ end
246
+
247
+ task(:purge).tap do |t|
248
+ t.category = :skeleton
249
+ t.description = "Clears the skeleton cache"
250
+ end
251
+
252
+ task(:help).tap do |t|
253
+ t.category = :help
254
+ t.description = "Shows a list of commands"
255
+ end
256
+
257
+ task(:version).tap do |t|
258
+ t.category = :help
259
+ t.description = "Shows the Monk version"
260
+ end
261
+
262
+ task(:install).tap do |t|
263
+ t.category = :dependency
264
+ t.description = "Install gems in the .gems manifest file"
265
+ t.help = %{
266
+ Usage:
267
+
268
+ #{executable} install
269
+
270
+ Loads the given gemset name of your project, and installs the gems
271
+ needed by your project.
272
+
273
+ Gems are specified in the `.gems` file. This is created using
274
+ `#{executable} lock`.
275
+
276
+ The gemset name is then specified in `.rvmrc`, which is created upon
277
+ creating your project with `#{executable} init`.
278
+ }.gsub(/^ {6}/,'').strip.split("\n")
279
+ end
280
+
281
+ task(:unpack).tap do |t|
282
+ t.category = :dependency
283
+ t.description = "Freeze gem dependencies into vendor/"
284
+ t.help = %{
285
+ Usage:
286
+
287
+ #{executable} unpack
288
+
289
+ Freezes the current gem dependencies of your project into the `vendor/`
290
+ path of your project.
291
+
292
+ This allows you to commit the gem contents into your project's repository.
293
+ This way, deploying your project elsewhere would not need `monk install`
294
+ or `gem install` to set up the dependencies.
295
+ }.gsub(/^ {6}/,'').strip.split("\n")
296
+ end
297
+
298
+ task(:lock).tap do |t|
299
+ t.category = :dependency
300
+ t.description = "Lock gem dependencies into a .gems manifest file"
301
+ t.help = %{
302
+ Usage:
303
+
304
+ #{executable} lock
305
+
306
+ Locks the current gem version dependencies of your project into the gem
307
+ manifest file.
308
+
309
+ This creates the `.gems` file for your project, which is then used by
310
+ `#{executable} install`.
311
+ }.gsub(/^ {6}/,'').strip.split("\n")
312
+ end
313
+ end
@@ -0,0 +1,27 @@
1
+ require 'ostruct'
2
+ require 'yaml'
3
+
4
+ class Monk::Config < OpenStruct
5
+ def self.filename
6
+ File.expand_path(File.join(%w(~ .monk.conf)))
7
+ end
8
+
9
+ def self.load
10
+ if File.file?(filename)
11
+ self.new YAML::load_file(filename)
12
+ else
13
+ self.new
14
+ end
15
+ end
16
+
17
+ def initialize(*a)
18
+ super
19
+ self.skeletons ||= Hash.new
20
+ # At the time of writing, this is the only monk-shake compatible skeleton
21
+ self.skeletons['default'] ||= 'git://github.com/rstacruz/monk-plus.git'
22
+ end
23
+
24
+ def save!
25
+ File.open(self.class.filename, 'w') { |f| f.write YAML::dump(@table) }
26
+ end
27
+ end
@@ -0,0 +1,129 @@
1
+ # All these functions are available as Monk.xxxx.
2
+ # (eg, Monk.tasks_for)
3
+ #
4
+ module Monk::Helpers
5
+ def config
6
+ @config ||= Monk::Config.load
7
+ end
8
+
9
+ def tasks_for(category)
10
+ tasks.select { |name, t| t.category == category }
11
+ end
12
+
13
+ def other_tasks
14
+ tasks.select { |name, t| t.category.nil? }
15
+ end
16
+
17
+ def rvm?
18
+ @has_rvm = (!! `rvm` rescue false) if @has_rvm.nil?
19
+ @has_rvm
20
+ end
21
+
22
+ def ensure_rvm
23
+ return true if rvm?
24
+ err "You need RVM installed for this command."
25
+ err "See http://rvm.beginrescueend.com for more info."
26
+ end
27
+
28
+ # Checks if a certain gem is installed.
29
+ # The format is the same as that found in the .gems file.
30
+ #
31
+ # @example
32
+ # has_gem?('nest -v1.1.0')
33
+ #
34
+ def has_gem?(str)
35
+ _, name, version = str.match(/^([A-Za-z_\-]+) -v(.*)$/).to_a
36
+ name ||= str
37
+ version ||= ">=0"
38
+
39
+ begin
40
+ gem(name, version)
41
+ true
42
+ rescue Gem::LoadError
43
+ false
44
+ end
45
+ end
46
+
47
+ # Performs a given block in the given path.
48
+ def in_path(path, &blk)
49
+ old = Dir.pwd
50
+ Dir.chdir path
51
+ say_status :cd, path
52
+ yield
53
+ Dir.chdir old
54
+ end
55
+
56
+ # Loads the monkfile. Used by bin/monk.
57
+ def load_monkfile
58
+ file = find_in_project("Monkfile")
59
+
60
+ if file
61
+ load file
62
+ @project = File.dirname(file)
63
+ Dir.chdir @project
64
+ end
65
+ end
66
+
67
+ def show_help_for(task)
68
+ name = params.first
69
+ task = task(name)
70
+ pass "No such command. Try: #{executable} help" unless task
71
+
72
+ help = task.help
73
+ if help
74
+ help.each { |line| err line }
75
+ err
76
+ else
77
+ err "Usage: #{executable} #{task.usage || name}"
78
+ err "#{task.description}." if task.description
79
+ end
80
+ end
81
+
82
+ # Checks if there is a loaded project or not.
83
+ def project?
84
+ ! @project.nil?
85
+ end
86
+
87
+ # File expand: fx('~/.cache/monk')
88
+ def fx(*paths)
89
+ File.expand_path File.join(*paths.join('/').split('/'))
90
+ end
91
+
92
+ def system(cmd)
93
+ say_status :run, cmd
94
+ super
95
+ end
96
+
97
+ def system_q(cmd)
98
+ say_status :run, cmd
99
+ `#{cmd}`
100
+ end
101
+
102
+ def say_status(what, cmd)
103
+ c1 = "\033[0;33m"
104
+ c0 = "\033[0;m"
105
+ puts "#{c1}%10s#{c0} %s" % [ what, cmd ]
106
+ end
107
+
108
+ # File helpers
109
+ def touch(target)
110
+ say_status :touch, target
111
+ FileUtils.touch target
112
+ end
113
+
114
+ def mkdir_p(target)
115
+ return if File.directory?(target)
116
+ say_status :mkdir, target
117
+ FileUtils.mkdir_p target
118
+ end
119
+
120
+ def cp_r(from, target)
121
+ say_status :copy, "#{from} -> #{target}"
122
+ FileUtils.cp_r from, target
123
+ end
124
+
125
+ def rm_rf(target)
126
+ say_status :delete, target
127
+ FileUtils.rm_rf target
128
+ end
129
+ end
@@ -0,0 +1,34 @@
1
+ module Monk::InitHelpers
2
+ def cache_path(name=nil)
3
+ fx "~/.cache/monk", name
4
+ end
5
+
6
+ def directory_with_files?(path)
7
+ File.directory?(path) and Dir[File.join(path, '{.*,*}')].any?
8
+ end
9
+
10
+ # Cache skeleton files into ~/.cache/monk/default
11
+ def cache_skeleton(name)
12
+ repo = config.skeletons[name] or return
13
+
14
+ path = cache_path(name)
15
+ return path if directory_with_files?(path)
16
+
17
+ mkdir_p fx(path, '..')
18
+
19
+ git_clone repo, path
20
+
21
+ if $?.to_i != 0
22
+ rm_rf path
23
+ return nil
24
+ end
25
+
26
+ rm_rf File.join(path, '.git')
27
+
28
+ path
29
+ end
30
+
31
+ def git_clone(repo, path)
32
+ system "git clone --depth 1 #{repo} #{path}"
33
+ end
34
+ end
@@ -0,0 +1,48 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ scope do
4
+ test 'add fail' do
5
+ monk 'add'
6
+ assert_invalid
7
+ end
8
+
9
+ test 'add fail 2' do
10
+ monk 'add x y z'
11
+ assert_invalid
12
+ end
13
+
14
+ test 'add success' do
15
+ monk 'add foobar git://github.com/y'
16
+ assert cerr.include?('Added skeleton')
17
+
18
+ monk 'list'
19
+ assert cout =~ /foobar +git:\/\/github.com\/y/
20
+ end
21
+
22
+ test 'update' do
23
+ monk 'add foobar git://github.com/y'
24
+ assert cerr.include?('Added skeleton')
25
+
26
+ monk 'add foobar git://github.com/z'
27
+ assert cerr.include?('Updated skeleton')
28
+
29
+ monk 'list'
30
+ assert cout =~ /foobar +git:\/\/github.com\/z/
31
+ end
32
+
33
+ test 'add remove add' do
34
+ monk 'add foobar git://github.com/y'
35
+ assert cerr.include?('Added skeleton')
36
+
37
+ monk 'rm foobar'
38
+ assert cerr.include?('Removed')
39
+
40
+ monk 'add foobar git://github.com/y'
41
+ assert cerr.include?('Added skeleton')
42
+ end
43
+
44
+ test 'remove' do
45
+ monk 'rm foobar'
46
+ assert cerr.include?('No such skeleton')
47
+ end
48
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ scope do
4
+ test 'invalid command' do
5
+ monk 'shivers'
6
+ assert cout.empty?
7
+ assert cerr.include?('Invalid command')
8
+ end
9
+
10
+ test 'monk no args' do
11
+ monk 'help'
12
+ err = cerr
13
+
14
+ monk ''
15
+ assert err == cerr
16
+ end
17
+
18
+ test 'help' do
19
+ monk 'help'
20
+
21
+ assert cerr.include?('Usage:')
22
+ assert cerr.include?('www.monkrb.com')
23
+
24
+ %w(help version).each { |c| assert cerr.match(/^ #{c}/) }
25
+ %w(init add rm purge list).each { |c| assert cerr.match(/^ #{c}/) }
26
+ %w(unpack lock install).each { |c| assert !cerr.match(/^ #{c}/) }
27
+ end
28
+
29
+ test 'help in project' do
30
+ FileUtils.touch 'Monkfile'
31
+ monk 'help'
32
+
33
+ assert cerr.include?('Usage:')
34
+
35
+ %w(help version).each { |c| assert cerr.match(/^ #{c}/) }
36
+ %w(init add rm purge list).each { |c| assert !cerr.match(/^ #{c}/) }
37
+ %w(unpack lock install).each { |c| assert cerr.match(/^ #{c}/) }
38
+ end
39
+ end
@@ -0,0 +1,63 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ scope do
4
+ def mock_cache(name)
5
+ path = File.join(Monk.cache_path, name)
6
+ Monk.git_clone 'git://github.com/x/y', path
7
+ end
8
+
9
+ setup do
10
+ Dir[File.join(Monk.cache_path, '*')].each { |path| FileUtils.rm_rf path }
11
+ end
12
+
13
+ test 'init fail' do
14
+ monk 'init'
15
+ assert_invalid
16
+ end
17
+
18
+ test 'init fail 2' do
19
+ monk 'init x y z'
20
+ assert_invalid
21
+ end
22
+
23
+ test 'init git' do
24
+ monk 'init x'
25
+ assert_successful_init 'x'
26
+ end
27
+
28
+ test 'init cached' do
29
+ mock_cache 'default'
30
+
31
+ monk 'init x'
32
+ assert_successful_init 'x'
33
+
34
+ monk 'init x'
35
+ assert cerr.include?('exists')
36
+ end
37
+
38
+ test 'init caching' do
39
+ monk 'init x'
40
+ assert_successful_init 'x'
41
+ assert cout.include?('git clone')
42
+
43
+ assert File.directory?(Monk.cache_path('default'))
44
+
45
+ monk 'init x'
46
+ assert !cout.include?('git clone')
47
+ end
48
+
49
+ test 'custom skeleton' do
50
+ monk 'add shivers git://github.com/a/b'
51
+ monk 'init x -s shivers'
52
+
53
+ assert_successful_init 'x'
54
+ assert cout.include?('git://github.com/a/b')
55
+ end
56
+
57
+ test 'invalid skeleton' do
58
+ monk 'init x -s scabs'
59
+ assert cerr.include?('No such skeleton')
60
+ end
61
+
62
+ # TODO: git fail test
63
+ end
@@ -0,0 +1,36 @@
1
+ # Silly mocking
2
+
3
+ # Capture output and input
4
+ class << Monk
5
+ def puts(what=nil)
6
+ $out << "#{what}\n"
7
+ end
8
+
9
+ def err(what=nil)
10
+ $err << "#{what}\n"
11
+ end
12
+ end
13
+
14
+ # Caching will always happen in a temp folder
15
+ module Monk::InitHelpers
16
+ def cache_path(name=nil)
17
+ File.expand_path("../tmp/#{name}", __FILE__)
18
+ end
19
+
20
+ def git_clone(repo, path)
21
+ FileUtils.mkdir_p path
22
+ FileUtils.touch File.join(path, 'Monkfile')
23
+ FileUtils.touch File.join(path, 'init.rb')
24
+ say_status :run, "git clone --depth 1 #{repo} #{path}"
25
+ end
26
+ end
27
+
28
+ # Config will never load the config file
29
+ class Monk::Config
30
+ def self.load
31
+ self.new
32
+ end
33
+
34
+ def save!
35
+ end
36
+ end
@@ -0,0 +1,48 @@
1
+ $:.push *Dir[File.expand_path('../../lib', __FILE__)]
2
+
3
+ require 'cutest'
4
+ require 'shellwords'
5
+ require 'fileutils'
6
+ require 'monk'
7
+
8
+ require File.expand_path('../mock', __FILE__)
9
+
10
+ def monk(cmd)
11
+ $out = ''
12
+ $err = ''
13
+
14
+ Monk.load_monkfile
15
+ Monk.run *Shellwords.shellsplit(cmd)
16
+ end
17
+
18
+ def cout
19
+ $out
20
+ end
21
+
22
+ def cerr
23
+ $err
24
+ end
25
+
26
+ def assert_invalid
27
+ assert cout.empty?
28
+ assert cerr.include?('Invalid usage')
29
+ end
30
+
31
+ def assert_successful_init(path)
32
+ assert cout.include?("Success! You've created a new project")
33
+ assert cerr.empty?
34
+ assert File.directory?(path)
35
+ assert File.file?(File.join(path, 'Monkfile'))
36
+ assert File.file?(File.join(path, 'init.rb'))
37
+ assert !File.exists?(File.join(path, '.git'))
38
+ end
39
+
40
+ tmp_path = File.expand_path('../tmp', __FILE__)
41
+ FileUtils.mkdir_p tmp_path
42
+
43
+ prepare do
44
+ # Clear config
45
+ Dir.chdir tmp_path
46
+ Monk.instance_variable_set :@config, nil
47
+ FileUtils.rm_rf 'Monkfile'
48
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: monk-shake
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: 6
5
+ version: 1.0.0.pre1
6
+ platform: ruby
7
+ authors:
8
+ - Rico Sta. Cruz
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-02-15 00:00:00 +08:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: shake
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 0.1.1
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ description: Monk lets you build Sinatra applications quickly and painlessly by letting it set up the directory structure for you. Monk-shake is a rewritten version of Monk that uses the Shake gem.
28
+ email:
29
+ - rico@sinefunc.com
30
+ executables:
31
+ - monk
32
+ extensions: []
33
+
34
+ extra_rdoc_files: []
35
+
36
+ files:
37
+ - bin/monk
38
+ - lib/monk/config.rb
39
+ - lib/monk/helpers.rb
40
+ - lib/monk/init_helpers.rb
41
+ - lib/monk.rb
42
+ - test/add_test.rb
43
+ - test/help_test.rb
44
+ - test/init_test.rb
45
+ - test/mock.rb
46
+ - test/test_helper.rb
47
+ - README.md
48
+ has_rdoc: true
49
+ homepage: http://www.github.com/rstacruz/monk-shake
50
+ licenses: []
51
+
52
+ post_install_message:
53
+ rdoc_options: []
54
+
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.3.1
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.5.0
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Monk the Sinatra glue framework -- reloaded
76
+ test_files: []
77
+