clive 0.8.1 → 1.0.0
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/LICENSE +1 -1
- data/README.md +328 -227
- data/lib/clive.rb +130 -50
- data/lib/clive/argument.rb +170 -0
- data/lib/clive/arguments.rb +139 -0
- data/lib/clive/arguments/parser.rb +210 -0
- data/lib/clive/base.rb +189 -0
- data/lib/clive/command.rb +342 -444
- data/lib/clive/error.rb +66 -0
- data/lib/clive/formatter.rb +57 -141
- data/lib/clive/formatter/colour.rb +37 -0
- data/lib/clive/formatter/plain.rb +172 -0
- data/lib/clive/option.rb +185 -75
- data/lib/clive/option/runner.rb +163 -0
- data/lib/clive/output.rb +141 -16
- data/lib/clive/parser.rb +180 -87
- data/lib/clive/struct_hash.rb +109 -0
- data/lib/clive/type.rb +117 -0
- data/lib/clive/type/definitions.rb +170 -0
- data/lib/clive/type/lookup.rb +23 -0
- data/lib/clive/version.rb +3 -3
- data/spec/clive/a_cli_spec.rb +245 -0
- data/spec/clive/argument_spec.rb +148 -0
- data/spec/clive/arguments/parser_spec.rb +35 -0
- data/spec/clive/arguments_spec.rb +191 -0
- data/spec/clive/command_spec.rb +276 -209
- data/spec/clive/formatter/colour_spec.rb +129 -0
- data/spec/clive/formatter/plain_spec.rb +129 -0
- data/spec/clive/option/runner_spec.rb +92 -0
- data/spec/clive/option_spec.rb +149 -23
- data/spec/clive/output_spec.rb +86 -2
- data/spec/clive/parser_spec.rb +201 -81
- data/spec/clive/struct_hash_spec.rb +82 -0
- data/spec/clive/type/definitions_spec.rb +312 -0
- data/spec/clive/type_spec.rb +107 -0
- data/spec/clive_spec.rb +60 -0
- data/spec/extras/expectations.rb +86 -0
- data/spec/extras/focus.rb +22 -0
- data/spec/helper.rb +35 -0
- metadata +56 -36
- data/lib/clive/bool.rb +0 -67
- data/lib/clive/exceptions.rb +0 -54
- data/lib/clive/flag.rb +0 -199
- data/lib/clive/switch.rb +0 -31
- data/lib/clive/tokens.rb +0 -141
- data/spec/clive/bool_spec.rb +0 -54
- data/spec/clive/flag_spec.rb +0 -117
- data/spec/clive/formatter_spec.rb +0 -108
- data/spec/clive/switch_spec.rb +0 -14
- data/spec/clive/tokens_spec.rb +0 -38
- data/spec/shared_specs.rb +0 -16
- data/spec/spec_helper.rb +0 -12
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,280 +1,381 @@
|
|
1
1
|
# clive
|
2
2
|
|
3
|
-
Clive
|
4
|
-
|
3
|
+
Clive lets you easily create command line interfaces, from simply checking for
|
4
|
+
the presence of a few flags to multiple command behemoths.
|
5
5
|
|
6
6
|
## Install
|
7
7
|
|
8
8
|
Install with:
|
9
|
-
|
10
|
-
(sudo) gem install clive
|
11
|
-
|
12
|
-
|
13
|
-
## How To
|
14
|
-
|
15
|
-
Simply include `Clive::Parser` to start using.
|
16
|
-
A simple example:
|
17
|
-
|
18
|
-
# test.rb
|
19
|
-
require 'clive'
|
20
|
-
|
21
|
-
class CLI
|
22
|
-
include Clive::Parser
|
23
|
-
option_hash :config
|
24
|
-
|
25
|
-
desc 'Run verbosely'
|
26
|
-
switch :v, :verbose do
|
27
|
-
config[:verbose] = true
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
CLI.parse(ARGV)
|
32
|
-
p CLI.config
|
33
9
|
|
34
|
-
|
35
|
-
|
10
|
+
``` bash
|
11
|
+
$ gem install clive
|
12
|
+
```
|
36
13
|
|
37
|
-
test.rb -v
|
38
|
-
#=> {:verbose => true}
|
39
|
-
test.rb --verbose
|
40
|
-
#=> {:verbose => true}
|
41
|
-
|
42
14
|
|
43
|
-
|
15
|
+
## Usage
|
44
16
|
|
45
|
-
|
46
|
-
a
|
17
|
+
> __NOTE__: Throughout I will be using the new 1.9 `{a: b}` hash syntax,
|
18
|
+
> obviously the old `{:a => b}` syntax still works and can be used if you want
|
19
|
+
> or where 1.8 compatibility is needed.
|
47
20
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
# code
|
55
|
-
end
|
56
|
-
# Called with '--long'
|
57
|
-
|
58
|
-
switch :b, :both do
|
59
|
-
# code
|
60
|
-
end
|
61
|
-
# Called with '-b' or '--both'
|
21
|
+
Clive is generally used by creating a class to hold your command line interface
|
22
|
+
as shown in the example below.
|
23
|
+
|
24
|
+
``` ruby
|
25
|
+
# my_app.rb
|
26
|
+
require 'clive'
|
62
27
|
|
28
|
+
module MyApp
|
29
|
+
VERSION = "0.1.4"
|
63
30
|
|
64
|
-
|
31
|
+
# some code
|
65
32
|
|
66
|
-
|
67
|
-
|
68
|
-
used.
|
33
|
+
class CLI < Clive
|
34
|
+
config name: 'myapp'
|
69
35
|
|
70
|
-
|
71
|
-
|
36
|
+
opt :v, :version, 'Display the current version' do
|
37
|
+
puts MyApp::Version
|
38
|
+
exit 0
|
72
39
|
end
|
73
|
-
|
74
|
-
|
75
|
-
# '--no-force' returns false
|
40
|
+
end
|
41
|
+
end
|
76
42
|
|
77
|
-
|
43
|
+
result = MyApp::CLI.run
|
44
|
+
```
|
78
45
|
|
46
|
+
Then run with `my_app.rb --version` to display the version for MyApp. By default
|
47
|
+
`#run` will use `ARGV` as the input, but you can pass something else if
|
48
|
+
necessary.
|
79
49
|
|
80
|
-
|
50
|
+
`.run` returns an instance of `Clive::StructHash` by default, this is a hybrid
|
51
|
+
hash and struct allowing you to access keys by calling them or using `#[]`. It
|
52
|
+
also stores any extra arguments that may have been passed which can be accessed
|
53
|
+
with `#args` or `#[:args]`.
|
81
54
|
|
82
|
-
|
83
|
-
|
55
|
+
``` ruby
|
56
|
+
class CLI
|
57
|
+
opt :n, :name, args: '<first> <last>'
|
58
|
+
opt :age, arg: '<age>', as: Integer
|
59
|
+
end
|
84
60
|
|
85
|
-
|
86
|
-
flag :with, :args => "ARG" do |arg|
|
87
|
-
puts arg
|
88
|
-
end
|
89
|
-
|
90
|
-
# Creates a flag with an optional argument, by using []
|
91
|
-
flag :with, :args => "[ARG]" do |arg|
|
92
|
-
puts arg
|
93
|
-
end
|
94
|
-
|
95
|
-
# Creates a flag with multiple arguments
|
96
|
-
flag :with, :args => "FIRST [OPTIONAL]" do |i, j|
|
97
|
-
puts i, j
|
98
|
-
end
|
61
|
+
result = CLI.run %w(--name John Doe --age 23 "I like coding!")
|
99
62
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
end
|
105
|
-
|
106
|
-
flag :number, :args => 1..5 do |num|
|
107
|
-
puts num
|
108
|
-
end
|
109
|
-
|
63
|
+
bio = result.args #=> "I like coding!"
|
64
|
+
name = result.name #=> ['John', 'Doe']
|
65
|
+
age = result.age #=> 23
|
66
|
+
```
|
110
67
|
|
111
|
-
|
68
|
+
This simple example shows how Clive can handle multiple arguments, casting to
|
69
|
+
types (Integer in this case) and how extra arguments are stored in `#args`.
|
112
70
|
|
113
|
-
Commands allow you to group a collection of options (or more commands) under a keyword.
|
114
|
-
The block provided is run when one of the names for the command is encountered, but the
|
115
|
-
blocks of the options in it are only ran when they are found.
|
116
71
|
|
117
|
-
|
118
|
-
bool :force do |truth|
|
119
|
-
puts "Force"
|
120
|
-
end
|
121
|
-
end
|
122
|
-
# 'init --force'
|
123
|
-
|
72
|
+
## Options
|
124
73
|
|
125
|
-
|
74
|
+
Options are defined using `#opt` and/or `#option` they can have short (`-a`) or
|
75
|
+
long names (`--abc`) and can also have arguments. The description can be given
|
76
|
+
as an argument to `#opt` or can be defined before it using `#desc` (or
|
77
|
+
`#description`).
|
126
78
|
|
127
|
-
|
128
|
-
|
79
|
+
``` ruby
|
80
|
+
opt :v, :version, 'Display the current version' do
|
81
|
+
# ...
|
82
|
+
end
|
129
83
|
|
130
|
-
|
131
|
-
include Clive::Parser
|
132
|
-
|
133
|
-
switch(:hey) { puts "Hey" }
|
134
|
-
end
|
135
|
-
args = Args.parse(ARGV)
|
136
|
-
p args
|
137
|
-
|
138
|
-
# `file --hey argument "A string"`
|
139
|
-
#=> ['argument', 'A string']
|
84
|
+
# is equivalent to
|
140
85
|
|
86
|
+
desc 'Display the current version'
|
87
|
+
opt :v, :version do
|
88
|
+
# ...
|
89
|
+
end
|
90
|
+
```
|
141
91
|
|
142
|
-
|
92
|
+
Longer option names, containing `_`s are called by replacing the `_` with a `-` so
|
143
93
|
|
144
|
-
|
145
|
-
|
146
|
-
|
94
|
+
``` ruby
|
95
|
+
opt :longer_name_than_expected
|
96
|
+
```
|
147
97
|
|
148
|
-
|
149
|
-
option_var :ok, false
|
150
|
-
end
|
151
|
-
CLI.ok #=> false
|
152
|
-
CLI.ok = true
|
153
|
-
CLI.ok #=> true
|
154
|
-
|
155
|
-
class CLI
|
156
|
-
option_hash :config
|
157
|
-
#=> is same as option_var :config, {}
|
158
|
-
|
159
|
-
flag :set, :args => "KEY VALUE" do |key, value|
|
160
|
-
config[key.to_sym] = value
|
161
|
-
end
|
162
|
-
|
163
|
-
option_list :items
|
164
|
-
# or option_array :items
|
165
|
-
#=> are the same as option_var :items, []
|
166
|
-
# option_var :a_list, []
|
167
|
-
|
168
|
-
flag :add, :args => "ITEM" do |item|
|
169
|
-
items << item
|
170
|
-
end
|
171
|
-
end
|
172
|
-
CLI.parse %w(--set works true --add apple --add orange)
|
173
|
-
CLI.config #=> {:works => true}
|
174
|
-
CLI.items #=> ['apple', 'orange']
|
98
|
+
would be called with `--longer-name-than-expected`.
|
175
99
|
|
176
|
-
###
|
100
|
+
### Boolean Options
|
177
101
|
|
178
|
-
|
179
|
-
`
|
102
|
+
Boolean options are options which can be called with a `no-` prefix, which then
|
103
|
+
passes `false` to the block/state. For example,
|
180
104
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
end
|
185
|
-
end
|
186
|
-
Missing.parse %w(--hey)
|
187
|
-
#=> hey was used but not defined
|
105
|
+
``` ruby
|
106
|
+
bool :a, :auto
|
107
|
+
```
|
188
108
|
|
109
|
+
Can be called with `-a` or `--auto` which would set `:auto` to `true`, or
|
110
|
+
`--no-auto` which sets `:auto` to `false`. If a block is given you can retrieve
|
111
|
+
the truth by adding block parameters or using the `truth` variable which is
|
112
|
+
automatically set.
|
189
113
|
|
190
|
-
|
114
|
+
``` ruby
|
115
|
+
bool :a, :auto do |t|
|
116
|
+
puts t
|
117
|
+
end
|
191
118
|
|
192
|
-
|
193
|
-
change the formatter call `#help_formatter` with :default, or :white.
|
119
|
+
# OR
|
194
120
|
|
195
|
-
|
121
|
+
bool :a, :auto do
|
122
|
+
puts truth
|
123
|
+
end
|
124
|
+
```
|
196
125
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
126
|
+
Boolean options __must__ have a long name.
|
127
|
+
|
128
|
+
|
129
|
+
## Commands
|
130
|
+
|
131
|
+
Commands are defined using `#command`. They can be used to group related Options
|
132
|
+
together acting like a namespace, but Commands are fully featured Options so can
|
133
|
+
also take arguments. Commands can be created with multiple names.
|
134
|
+
|
135
|
+
``` ruby
|
136
|
+
desc 'Create a new project'
|
137
|
+
command :new, :create, arg: '<dir>', as: Pathname do
|
138
|
+
|
139
|
+
# Set the default type to use
|
140
|
+
set :type, :basic
|
141
|
+
|
142
|
+
desc 'Select type of template to use'
|
143
|
+
opt :type, arg: '<choice>', in: %w(basic complex custom), as: Symbol
|
144
|
+
|
145
|
+
bool :force, 'Force overwrite'
|
146
|
+
|
147
|
+
action do
|
148
|
+
puts "Creating #{get :type} in #{dir}"
|
149
|
+
# do writing
|
150
|
+
end
|
151
|
+
end
|
152
|
+
```
|
153
|
+
|
154
|
+
The above example also shows using the `#set` and `#get` methods, these allow
|
155
|
+
you to set and get values from the state. Also note how the logic for executing
|
156
|
+
the `new` command is given to `#action`, this is because the block passed to
|
157
|
+
`#command` is used for option definition.
|
158
|
+
|
159
|
+
|
160
|
+
## Arguments
|
161
|
+
|
162
|
+
As previously talked about Options and Commands can take arguments by passing a
|
163
|
+
hash with the key `:arg` or `:args`.
|
164
|
+
|
165
|
+
``` ruby
|
166
|
+
opt :size, args: '<height> <width>'
|
167
|
+
```
|
168
|
+
|
169
|
+
The option `--size` takes two arguments. These would be saved to state as an array,
|
170
|
+
for instance running with `--size 10 40` would set `:size` to `['10', '40']`.
|
171
|
+
|
172
|
+
Arguments can be made optional by enclosing one or more arguments with `[` and `]`:
|
173
|
+
|
174
|
+
``` ruby
|
175
|
+
# both required
|
176
|
+
opt :size, args: '<h> <w>'
|
177
|
+
# --size 10 #=> Error
|
178
|
+
|
179
|
+
# first required
|
180
|
+
opt :size, args: '<h> [<w>]'
|
181
|
+
# --size 10 #=> [10, nil]
|
182
|
+
|
183
|
+
# second required
|
184
|
+
opt :size, args: '[<h>] <w>'
|
185
|
+
# --size 10 #=> [nil, 10]
|
186
|
+
|
187
|
+
# neither required
|
188
|
+
opt :size, args: '[<h> <w>]'
|
189
|
+
# --size 10 #=> [10, nil]
|
190
|
+
```
|
191
|
+
|
192
|
+
There are also various options that can be passed to constrain or change the
|
193
|
+
arguments. If one of the below is passed to an option with `:arg` or `:args`
|
194
|
+
a generic argument called `<arg>` will be added.
|
195
|
+
|
196
|
+
### Types (`:types`, `:type`, `:kind` or `:as`)
|
197
|
+
|
198
|
+
An argument will be checked if it matches how the type should look, then converts
|
199
|
+
it to that type. For more information see `lib/clive/type/definitions.rb`.
|
200
|
+
|
201
|
+
``` ruby
|
202
|
+
opt :list, as: Array
|
203
|
+
```
|
204
|
+
|
205
|
+
This accepts a comma delimited list of items, `--list a,b,c` and sets `:list` to
|
206
|
+
`['a', 'b', 'c']`.
|
207
|
+
|
208
|
+
### Matches (`:matches` or `:match`)
|
209
|
+
|
210
|
+
Allows you to say that an argument must match a regular expression (or any object
|
211
|
+
which responds to `#match`).
|
212
|
+
|
213
|
+
``` ruby
|
214
|
+
opt :word, match: /^\w+$/
|
215
|
+
```
|
206
216
|
|
207
|
-
|
217
|
+
This accepts `--word hello` but not `--word 123`.
|
208
218
|
|
209
|
-
|
210
|
-
|
211
|
-
Commands:
|
212
|
-
test # A command
|
213
|
-
|
214
|
-
Options:
|
215
|
-
-h, --help # Display help
|
216
|
-
--[no-]force # Force build
|
219
|
+
### Withins (`:withins`, `:within` or `:in`)
|
217
220
|
|
218
|
-
|
221
|
+
Allows you to say that an argument must be within a passed Array, Set or Range
|
222
|
+
(any object which responds to `#include?`).
|
219
223
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
* desc - a string of the description for the option
|
224
|
+
``` ruby
|
225
|
+
opt :num, in: "1".."100"
|
226
|
+
```
|
224
227
|
|
225
|
-
|
228
|
+
This accepts `--num 50` but not `--num 900`. The example above had to use a range
|
229
|
+
of Strings because that is what is passed, you can use this with `:type` to use
|
230
|
+
Integers.
|
226
231
|
|
227
|
-
|
228
|
-
|
232
|
+
``` ruby
|
233
|
+
opt :num, as: Integer, in: 1..100
|
234
|
+
```
|
235
|
+
|
236
|
+
Would work in the same way as the one above but return an Integer.
|
237
|
+
|
238
|
+
### Defaults (`:defaults` or `:default`)
|
239
|
+
|
240
|
+
Allows you to give a default value that should be used if an argument is not
|
241
|
+
given.
|
242
|
+
|
243
|
+
``` ruby
|
244
|
+
opt :type, default: 'house'
|
245
|
+
```
|
246
|
+
|
247
|
+
So `--type` would set `:type` to `'house'`, but `--type shed` would set `:type`
|
248
|
+
to `'shed'`. The default value is only set if the option is used. To set a value
|
249
|
+
regardless of whether the option is used use `#set` in the class or commands
|
250
|
+
body.
|
251
|
+
|
252
|
+
``` ruby
|
253
|
+
set :type, 'house'
|
254
|
+
opt :type
|
255
|
+
```
|
256
|
+
|
257
|
+
Would always set `:type` to `'house'` even when `--type` is not used.
|
258
|
+
|
259
|
+
### Constraints (`:constraint` or `:constraint`)
|
260
|
+
|
261
|
+
Allows you to constrain the argument using a Proc, this is to cover the very
|
262
|
+
few events where the above options do not satisfy the requirements.
|
263
|
+
|
264
|
+
``` ruby
|
265
|
+
opt :long_word, constraint: -> i { i.size >= 7 }
|
266
|
+
```
|
267
|
+
|
268
|
+
Accepts `--long-word eventually` but not `--long-word event`. You can also pass
|
269
|
+
a symbol which will have `#to_proc` called on it.
|
270
|
+
|
271
|
+
``` ruby
|
272
|
+
opt :odd, as: Integer, constraint: :odd?
|
273
|
+
```
|
274
|
+
|
275
|
+
This only accepts odd Integers.
|
276
|
+
|
277
|
+
|
278
|
+
## Runner
|
279
|
+
|
280
|
+
All blocks passed to options or given to a command's action are run in the Runner
|
281
|
+
class. This provides a few shortcuts to make life easier. Here is a quick run down
|
282
|
+
with examples.
|
283
|
+
|
284
|
+
### Argument Referencing
|
285
|
+
|
286
|
+
You can reference an options or commands arguments directly by name without having
|
287
|
+
to use block parameters.
|
288
|
+
|
289
|
+
``` ruby
|
290
|
+
opt :size, args: '<height> <width>', as: [Float, Float] do # no params!
|
291
|
+
puts "Area = #{height} * #{width} = #{height * width}"
|
292
|
+
end
|
293
|
+
```
|
294
|
+
|
295
|
+
As shown earlier the truthiness of a boolean option is set to the value `truth`.
|
296
|
+
|
297
|
+
### Working with the State
|
298
|
+
|
299
|
+
Four fundamental methods are defined for working with the state, `#get`, `#set`,
|
300
|
+
`#update` and `#has?`.
|
301
|
+
|
302
|
+
`#get` allows you to get values previously set.
|
303
|
+
|
304
|
+
``` ruby
|
305
|
+
opt :get_some_key do
|
306
|
+
puts get(:some_key) #=> value set for :some_key
|
307
|
+
end
|
308
|
+
```
|
309
|
+
|
310
|
+
`#set` allows you to set values in the state.
|
311
|
+
|
312
|
+
``` ruby
|
313
|
+
opt :set_some_key, arg: '<value>' do
|
314
|
+
set :some_key, value
|
315
|
+
end
|
316
|
+
```
|
317
|
+
|
318
|
+
`#update` allows you to modify a value in the state.
|
319
|
+
|
320
|
+
``` ruby
|
321
|
+
set :list, []
|
322
|
+
opt :add, arg: '<item>' do
|
323
|
+
update :list, :<<, item
|
324
|
+
|
325
|
+
# or using a block
|
326
|
+
update(:list) {|l| l << item }
|
327
|
+
end
|
328
|
+
```
|
329
|
+
|
330
|
+
`#has?` tells you whether a value has been set for the key.
|
331
|
+
|
332
|
+
``` ruby
|
333
|
+
opt :has_some_key do
|
334
|
+
puts has?(:some_key)
|
335
|
+
end
|
336
|
+
```
|
337
|
+
|
338
|
+
|
339
|
+
## Help Formatters
|
340
|
+
|
341
|
+
Clive comes with two help formatters, one with colour and the other without. To use
|
342
|
+
the plain formatter (colour is default), use
|
343
|
+
|
344
|
+
``` ruby
|
345
|
+
class CLI < Clive
|
346
|
+
config formatter: Clive::Formatter::Plain.new
|
347
|
+
|
348
|
+
# ...
|
349
|
+
end
|
350
|
+
|
351
|
+
CLI.run
|
352
|
+
```
|
353
|
+
|
354
|
+
To create your own formatter take a look at `lib/clive/formatter.rb`.
|
229
355
|
|
230
|
-
Inside the { and } you can put any ruby, so feel free to use joins on the array.
|
231
356
|
|
232
|
-
|
233
357
|
## Clive::Output
|
234
358
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
- green
|
255
|
-
- red
|
256
|
-
- magenta
|
257
|
-
- yellow
|
258
|
-
- blue
|
259
|
-
- cyan
|
260
|
-
- black (light version called grey not l_black)
|
261
|
-
|
262
|
-
- + light versions of colours using l_colour)
|
263
|
-
- + background setters using colour_bg
|
264
|
-
- + light background using l_colour_bg
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
## Note on Patches/Pull Requests
|
269
|
-
|
270
|
-
* Fork the project.
|
271
|
-
* Make your feature addition or bug fix.
|
272
|
-
* Add tests for it. This is important so I don't break it in a
|
273
|
-
future version unintentionally.
|
274
|
-
* Commit, do not mess with rakefile, version, or history.
|
275
|
-
(if you want to have your own version, that is fine but bump version in a commit by itself so I can ignore when I pull)
|
276
|
-
* Send me a pull request. Bonus points for topic branches.
|
359
|
+
`clive/output` contains various monkey patches on String that allow you to easily
|
360
|
+
colourise output.
|
361
|
+
|
362
|
+
``` ruby
|
363
|
+
puts "I'm blue".blue # will print blue text
|
364
|
+
puts "I'm green and bold".green.bold # will print green and bold text
|
365
|
+
puts "Crazy".blue.l_yellow_bg.underline
|
366
|
+
# etc
|
367
|
+
```
|
368
|
+
|
369
|
+
Colours available: white, green, red, magenta, yellow, blue, cyan, black.
|
370
|
+
Effects available: bold, underline, blink, reverse.
|
371
|
+
|
372
|
+
Light versions can be used by prepending the name with `l_`, ie. `l_red`, the light
|
373
|
+
version of black is called grey.
|
374
|
+
|
375
|
+
All colours can be used as backgrounds by appending `_bg`, ie. `red_bg`, light
|
376
|
+
backgrounds are as expected, `l_red_bg`.
|
377
|
+
|
277
378
|
|
278
379
|
## Copyright
|
279
380
|
|
280
|
-
Copyright (c) 2010 Joshua Hawxwell. See LICENSE for details.
|
381
|
+
Copyright (c) 2010-12 Joshua Hawxwell. See LICENSE for details.
|