linebook 0.2.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,390 @@
1
+ # Generated by Linecook
2
+
3
+ module Linebook
4
+ module Os
5
+ module Posix
6
+ # Returns true if the obj converts to a string which is whitespace or empty.
7
+ def blank?(obj)
8
+ # shortcut for nil...
9
+ obj.nil? || obj.to_s.strip.empty?
10
+ end
11
+
12
+ # Encloses the arg in quotes if the arg is not quoted and is quotable.
13
+ # Stringifies arg using to_s.
14
+ def quote(arg)
15
+ arg = arg.to_s
16
+ quoted?(arg) || !quote?(arg) ? arg : "\"#{arg}\""
17
+ end
18
+
19
+ # Returns true if the str is not an option (ie it begins with - or +), and is
20
+ # not already quoted (either by quotes or apostrophes). The intention is to
21
+ # check whether a string _should_ be quoted.
22
+ def quote?(str)
23
+ c = str[0]
24
+ c == ?- || c == ?+ || quoted?(str) ? false : true
25
+ end
26
+
27
+ # Returns true if the str is quoted (either by quotes or apostrophes).
28
+ def quoted?(str)
29
+ str =~ /\A".*"\z/ || str =~ /\A'.*'\z/ ? true : false
30
+ end
31
+
32
+ # Formats a command line command. Arguments are quoted. If the last arg is a
33
+ # hash, then it will be formatted into options using format_options and
34
+ # prepended to args.
35
+ def format_cmd(command, *args)
36
+ opts = args.last.kind_of?(Hash) ? args.pop : {}
37
+ args.compact!
38
+ args.collect! {|arg| quote(arg) }
39
+
40
+ args = format_options(opts) + args
41
+ args.unshift(command)
42
+ args.join(' ')
43
+ end
44
+
45
+ # Formats a hash key-value string into command line options using the
46
+ # following heuristics:
47
+ #
48
+ # * Prepend '--' to mulit-char keys and '-' to single-char keys (unless they
49
+ # already start with '-').
50
+ # * For true values return the '--key'
51
+ # * For false/nil values return nothing
52
+ # * For all other values, quote (unless already quoted) and return '--key
53
+ # "value"'
54
+ #
55
+ # In addition, key formatting is performed on non-string keys (typically
56
+ # symbols) such that underscores are converted to dashes, ie :some_key =>
57
+ # 'some-key'. Note that options are sorted, such that short options appear
58
+ # after long options, and so should 'win' given typical option processing.
59
+ def format_options(opts)
60
+ options = []
61
+
62
+ opts.each do |(key, value)|
63
+ unless key.kind_of?(String)
64
+ key = key.to_s.gsub('_', '-')
65
+ end
66
+
67
+ unless key[0] == ?-
68
+ prefix = key.length == 1 ? '-' : '--'
69
+ key = "#{prefix}#{key}"
70
+ end
71
+
72
+ case value
73
+ when true
74
+ options << key
75
+ when false, nil
76
+ next
77
+ else
78
+ options << "#{key} #{quote(value.to_s)}"
79
+ end
80
+ end
81
+
82
+ options.sort
83
+ end
84
+
85
+ # An array of functions defined for self.
86
+ def functions
87
+ @functions ||= []
88
+ end
89
+
90
+ # Defines a function from the block. The block content is indented and
91
+ # cleaned up some to make a nice function definition. To avoid formatting,
92
+ # provide the body directly.
93
+ #
94
+ # A body and block given together raises an error. Raises an error if the
95
+ # function is already defined with a different body.
96
+ def function(name, body=nil)
97
+ if body && block_given?
98
+ raise "define functions with body or block"
99
+ end
100
+
101
+ if body.nil?
102
+ str = capture_str { indent { yield } }
103
+ body = "\n#{str.chomp("\n")}\n"
104
+ end
105
+
106
+ function = "#{name}() {#{body}}"
107
+
108
+ if current = functions.find {|func| func.index("#{name}()") == 0 }
109
+ if current != function
110
+ raise "function already defined: #{name.inspect}"
111
+ end
112
+ end
113
+
114
+ functions << function
115
+ writeln function
116
+
117
+ name
118
+ end
119
+
120
+ # Returns true if the function is defined.
121
+ def function?(name)
122
+ declaration = "#{name}()"
123
+ functions.any? {|func| func.index(declaration) == 0 }
124
+ end
125
+
126
+ CHECK_STATUS = /(\s*(?:\ncheck_status.*?\n\s*)?)\z/
127
+
128
+ # Adds a redirect to append stdout to a file.
129
+ def append(path=nil)
130
+ redirect(nil, path || '/dev/null', '>>')
131
+ chain_proxy
132
+ end
133
+
134
+ def _append(*args, &block) # :nodoc:
135
+ str = capture_str { append(*args, &block) }
136
+ str.strip!
137
+ str
138
+ end
139
+
140
+ # Adds a check that ensures the last exit status is as indicated. Note that no
141
+ # check will be added unless check_status_function is added beforehand.
142
+ def check_status(expect_status=0, fail_status='$?')
143
+ # <% if function?('check_status') %>
144
+ # check_status <%= expect_status %> $? <%= fail_status %> $LINENO
145
+ #
146
+ # <% end %>
147
+ if function?('check_status')
148
+ write "check_status "; write(( expect_status ).to_s); write " $? "; write(( fail_status ).to_s); write " $LINENO\n"
149
+ write "\n"
150
+ end
151
+ chain_proxy
152
+ end
153
+
154
+ def _check_status(*args, &block) # :nodoc:
155
+ str = capture_str { check_status(*args, &block) }
156
+ str.strip!
157
+ str
158
+ end
159
+
160
+ # Adds the check status function.
161
+ def check_status_function()
162
+ function 'check_status', ' if [ $2 -ne $1 ]; then echo "[$2] $0:${4:-?}"; exit $3; else return $2; fi '
163
+ chain_proxy
164
+ end
165
+
166
+ def _check_status_function(*args, &block) # :nodoc:
167
+ str = capture_str { check_status_function(*args, &block) }
168
+ str.strip!
169
+ str
170
+ end
171
+
172
+ # Writes a comment.
173
+ def comment(str)
174
+ # # <%= str %>
175
+ #
176
+ write "# "; write(( str ).to_s); write "\n"
177
+
178
+ chain_proxy
179
+ end
180
+
181
+ def _comment(*args, &block) # :nodoc:
182
+ str = capture_str { comment(*args, &block) }
183
+ str.strip!
184
+ str
185
+ end
186
+
187
+ # Executes a command and checks the output status. Quotes all non-option args
188
+ # that aren't already quoted. Accepts a trailing hash which will be transformed
189
+ # into command line options.
190
+ def execute(command, *args)
191
+ if chain?
192
+ rewrite(CHECK_STATUS)
193
+ write ' | '
194
+ end
195
+ # <%= format_cmd(command, *args) %>
196
+ #
197
+ # <% check_status %>
198
+ write(( format_cmd(command, *args) ).to_s)
199
+ write "\n"
200
+ check_status
201
+ chain_proxy
202
+ end
203
+
204
+ def _execute(*args, &block) # :nodoc:
205
+ str = capture_str { execute(*args, &block) }
206
+ str.strip!
207
+ str
208
+ end
209
+
210
+ # Exports a variable.
211
+ def export(key, value)
212
+ # export <%= key %>=<%= quote(value) %>
213
+ #
214
+ write "export "; write(( key ).to_s); write "="; write(( quote(value) ).to_s); write "\n"
215
+
216
+ chain_proxy
217
+ end
218
+
219
+ def _export(*args, &block) # :nodoc:
220
+ str = capture_str { export(*args, &block) }
221
+ str.strip!
222
+ str
223
+ end
224
+
225
+ # Assigns stdin to the file.
226
+ def from(path)
227
+ redirect(nil, path, '<')
228
+ chain_proxy
229
+ end
230
+
231
+ def _from(*args, &block) # :nodoc:
232
+ str = capture_str { from(*args, &block) }
233
+ str.strip!
234
+ str
235
+ end
236
+
237
+ # Makes a heredoc statement surrounding the contents of the block. Options:
238
+ #
239
+ # delimiter the delimiter used, by default HEREDOC_n where n increments
240
+ # outdent add '-' before the delimiter
241
+ # quote quotes the delimiter
242
+ def heredoc(options={})
243
+ tail = chain? ? rewrite(CHECK_STATUS) {|m| write ' '; m[1].lstrip } : nil
244
+
245
+ unless options.kind_of?(Hash)
246
+ options = {:delimiter => options}
247
+ end
248
+
249
+ delimiter = options[:delimiter] || begin
250
+ @heredoc_count ||= -1
251
+ "HEREDOC_#{@heredoc_count += 1}"
252
+ end
253
+ # <<<%= options[:outdent] ? '-' : ' '%><%= options[:quote] ? "\"#{delimiter}\"" : delimiter %><% outdent(" # :#{delimiter}:") do %>
254
+ # <% yield %>
255
+ # <%= delimiter %><% end %>
256
+ #
257
+ # <%= tail %>
258
+ write "<<"; write(( options[:outdent] ? '-' : ' ').to_s); write(( options[:quote] ? "\"#{delimiter}\"" : delimiter ).to_s); outdent(" # :#{delimiter}:") do ; write "\n"
259
+ yield
260
+ write(( delimiter ).to_s); end
261
+ write "\n"
262
+ write(( tail ).to_s)
263
+ chain_proxy
264
+ end
265
+
266
+ def _heredoc(*args, &block) # :nodoc:
267
+ str = capture_str { heredoc(*args, &block) }
268
+ str.strip!
269
+ str
270
+ end
271
+
272
+ # Executes the block when the expression evaluates to zero.
273
+ def if_(expression)
274
+ # if <%= expression %>
275
+ # then
276
+ # <% indent { yield } %>
277
+ # fi
278
+ #
279
+ #
280
+ write "if "; write(( expression ).to_s); write "\n"
281
+ write "then\n"
282
+ indent { yield }
283
+ write "fi\n"
284
+ write "\n"
285
+
286
+ chain_proxy
287
+ end
288
+
289
+ def _if_(*args, &block) # :nodoc:
290
+ str = capture_str { if_(*args, &block) }
291
+ str.strip!
292
+ str
293
+ end
294
+
295
+ # Makes a redirect statement.
296
+ def redirect(source, target, redirection='>')
297
+ source = source.nil? || source.kind_of?(Fixnum) ? source : "#{source} "
298
+ target = target.nil? || target.kind_of?(Fixnum) ? "&#{target}" : " #{target}"
299
+
300
+ match = chain? ? rewrite(CHECK_STATUS) : nil
301
+ write " #{source}#{redirection}#{target}"
302
+ write match[1] if match
303
+ chain_proxy
304
+ end
305
+
306
+ def _redirect(*args, &block) # :nodoc:
307
+ str = capture_str { redirect(*args, &block) }
308
+ str.strip!
309
+ str
310
+ end
311
+
312
+ # Sets the options to on (true) or off (false) as specified.
313
+ def set(options)
314
+ # <% options.keys.sort_by {|opt| opt.to_s }.each do |opt| %>
315
+ # set <%= options[opt] ? '-' : '+' %>o <%= opt %>
316
+ # <% end %>
317
+ #
318
+ options.keys.sort_by {|opt| opt.to_s }.each do |opt|
319
+ write "set "; write(( options[opt] ? '-' : '+' ).to_s); write "o "; write(( opt ).to_s); write "\n"
320
+ end
321
+
322
+ chain_proxy
323
+ end
324
+
325
+ def _set(*args, &block) # :nodoc:
326
+ str = capture_str { set(*args, &block) }
327
+ str.strip!
328
+ str
329
+ end
330
+
331
+ # Adds a redirect of stdout to a file.
332
+ def to(path=nil)
333
+ redirect(nil, path || '/dev/null')
334
+ chain_proxy
335
+ end
336
+
337
+ def _to(*args, &block) # :nodoc:
338
+ str = capture_str { to(*args, &block) }
339
+ str.strip!
340
+ str
341
+ end
342
+
343
+ # Executes the block when the expression evaluates to a non-zero value.
344
+ def unless_(expression)
345
+ if_("! #{expression}") { yield }
346
+ chain_proxy
347
+ end
348
+
349
+ def _unless_(*args, &block) # :nodoc:
350
+ str = capture_str { unless_(*args, &block) }
351
+ str.strip!
352
+ str
353
+ end
354
+
355
+ # Unsets a list of variables.
356
+ def unset(*keys)
357
+ # <% keys.each do |key| %>
358
+ # unset <%= key %>
359
+ # <% end %>
360
+ keys.each do |key|
361
+ write "unset "; write(( key ).to_s); write "\n"
362
+ end
363
+ chain_proxy
364
+ end
365
+
366
+ def _unset(*args, &block) # :nodoc:
367
+ str = capture_str { unset(*args, &block) }
368
+ str.strip!
369
+ str
370
+ end
371
+
372
+ # Set a variable.
373
+ def variable(key, value)
374
+ # <%= key %>=<%= quote(value) %>
375
+ #
376
+ #
377
+ write(( key ).to_s); write "="; write(( quote(value) ).to_s)
378
+ write "\n"
379
+
380
+ chain_proxy
381
+ end
382
+
383
+ def _variable(*args, &block) # :nodoc:
384
+ str = capture_str { variable(*args, &block) }
385
+ str.strip!
386
+ str
387
+ end
388
+ end
389
+ end
390
+ end
@@ -0,0 +1,23 @@
1
+ # Generated by Linecook
2
+
3
+ module Linebook
4
+ module Os
5
+ module Ubuntu
6
+ require 'linebook/os/linux'
7
+ include Linux
8
+
9
+ # Installs a package using apt-get.
10
+ def package(name, version=nil, options={:q => true, :y => true})
11
+ name = "#{name}=#{version}" unless blank?(version)
12
+ execute "apt-get install", name, options
13
+ chain_proxy
14
+ end
15
+
16
+ def _package(*args, &block) # :nodoc:
17
+ str = capture_str { package(*args, &block) }
18
+ str.strip!
19
+ str
20
+ end
21
+ end
22
+ end
23
+ end