automateit 0.71006 → 0.71012
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.tar.gz.sig +0 -0
- data/CHANGES.txt +12 -0
- data/Rakefile +6 -1
- data/TODO.txt +10 -2
- data/lib/automateit/account_manager/linux.rb +4 -2
- data/lib/automateit/address_manager.rb +2 -82
- data/lib/automateit/address_manager/base.rb +148 -0
- data/lib/automateit/address_manager/linux.rb +8 -46
- data/lib/automateit/address_manager/sunos.rb +46 -0
- data/lib/automateit/interpreter.rb +4 -0
- data/lib/automateit/platform_manager.rb +1 -0
- data/lib/automateit/platform_manager/darwin.rb +2 -2
- data/lib/automateit/platform_manager/freebsd.rb +4 -0
- data/lib/automateit/platform_manager/sunos.rb +39 -0
- data/lib/automateit/plugin/driver.rb +21 -4
- data/lib/automateit/plugin/manager.rb +2 -1
- data/lib/automateit/root.rb +1 -1
- data/lib/automateit/service_manager/sysv.rb +2 -1
- data/lib/automateit/shell_manager.rb +3 -0
- data/lib/automateit/shell_manager/portable.rb +22 -14
- data/lib/automateit/template_manager.rb +4 -3
- data/lib/automateit/template_manager/base.rb +13 -7
- data/spec/breaker.rb +8 -0
- data/spec/integration/{address_manager_linux_spec.rb → address_manager_spec.rb} +65 -25
- data/spec/integration/package_manager_spec.rb +4 -0
- data/spec/integration/service_manager_sysv_spec.rb +92 -34
- data/spec/integration/template_manager_erb_spec.rb +22 -5
- data/spec/unit/plugins_spec.rb +5 -0
- data/spec/unit/template_manager_erb_spec.rb +4 -0
- metadata +9 -4
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGES.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
0.71012:
|
2
|
+
Date: Fri, 12 Oct 2007 03:54:30 -0700
|
3
|
+
Desc:
|
4
|
+
- (%) Fixed #touch, it worked fine but was corrupting log output
|
5
|
+
- (%) Fixed AccountManager::Linux, it now only runs when the OS detected is Linux.
|
6
|
+
- Added PlatformManager::SunOS.
|
7
|
+
- Added AddressManager::SunOS.
|
8
|
+
- Improved #render, added default :backup option to save files before overwriting them.
|
9
|
+
- Improved #backup, added :quiet option to prevent output.
|
10
|
+
- Improved #chperm, it now displays the exact changes made rather than approximations.
|
11
|
+
- Improved ServiceManager::SysV spec to validate :wait and :pause options with safe mocks.
|
12
|
+
|
1
13
|
0.71006:
|
2
14
|
Date: Sat, 06 Oct 2007 17:55:37 -0700
|
3
15
|
Desc:
|
data/Rakefile
CHANGED
@@ -97,13 +97,18 @@ task :loclines do
|
|
97
97
|
if path.match(/(\bbin\b|.*\.(env|pl|py|rb|rake|java|sql|ftl|jsp|xml|properties|css|rcss|html|rhtml|erb|po|haml|sass)$)/)
|
98
98
|
data = File.read(path)
|
99
99
|
bytes += data.size
|
100
|
-
lines += data.scan(
|
100
|
+
### lines += data.scan(/^.*\w.*$/).size # Skip spaces
|
101
|
+
lines += data.scan(/^\s*(?!#)\w.*$/).size # Skip blanks and comments
|
101
102
|
end
|
102
103
|
end
|
103
104
|
puts "Lines: "+lines.commify
|
104
105
|
puts "Bytes: "+bytes.commify
|
105
106
|
end
|
106
107
|
|
108
|
+
task :loccount do
|
109
|
+
sh ""
|
110
|
+
end
|
111
|
+
|
107
112
|
desc "Display the lines of code changed in the repository"
|
108
113
|
task :locdiff do
|
109
114
|
if File.directory?(".hg")
|
data/TODO.txt
CHANGED
@@ -2,6 +2,16 @@ KEY: Important? Urgent? Easy? 1=yes, 0=no
|
|
2
2
|
|
3
3
|
#===[ App ]=============================================================
|
4
4
|
|
5
|
+
f=finished
|
6
|
+
d=disabled
|
7
|
+
|
8
|
+
Solaris 10
|
9
|
+
f Create PlatformManager::SunOS
|
10
|
+
d Create AccountManager::SunOS and prevent ::Linux from being used because it has the same commands but with different args
|
11
|
+
- Create ServiceManager::SMF
|
12
|
+
- Create PackageManager::Blastwave
|
13
|
+
- Create PackageManager::SunPkg
|
14
|
+
|
5
15
|
100 Shell -- Expand glob patterns, e.g. chown_R(500, 500, "*")
|
6
16
|
|
7
17
|
100 Edit -- Display summary of edits, return with :details as [rv, list]
|
@@ -9,12 +19,10 @@ KEY: Important? Urgent? Easy? 1=yes, 0=no
|
|
9
19
|
100 Interpreter#invoke and HelpfulERB -- Extract error context code into class
|
10
20
|
|
11
21
|
000 Shell#chperm -- With symbolic mode, wrap `chmod -v` as temporary workaround?
|
12
|
-
000 Changes -- Write parser and new format so I can use "#" symbol
|
13
22
|
000 FreeBSD -- Write driver for PackageManager::Ports
|
14
23
|
000 Darwin -- Write drivers, e.g. PackageManager for Fink, MacPorts, Pkgsrc
|
15
24
|
|
16
25
|
??? Shell -- Return false or list, never single item?
|
17
|
-
??? Shell -- Extract FileManager? change docs
|
18
26
|
??? Driver -- How to determine if a manager or driver method is available? Manager#available?, Manager#available and Driver#suitable? only say if it should be a default.
|
19
27
|
|
20
28
|
#===[ Web ]=============================================================
|
@@ -3,8 +3,10 @@
|
|
3
3
|
# A Linux-specific driver for the AccountManager.
|
4
4
|
class ::AutomateIt::AccountManager::Linux < ::AutomateIt::AccountManager::Portable
|
5
5
|
depends_on \
|
6
|
-
:programs => %w(useradd usermod userdel groupadd groupmod groupdel),
|
7
|
-
:callbacks => [lambda{
|
6
|
+
:programs => %w(uname useradd usermod userdel groupadd groupmod groupdel),
|
7
|
+
:callbacks => [lambda{
|
8
|
+
`uname -s`.match(/linux/i) && AutomateIt::AccountManager::Portable.has_etc?
|
9
|
+
}]
|
8
10
|
|
9
11
|
def suitability(method, *args) # :nodoc:
|
10
12
|
# Level must be higher than Portable
|
@@ -76,90 +76,10 @@ class AutomateIt::AddressManager < AutomateIt::Plugin::Manager
|
|
76
76
|
# hostnames_for("kagami")
|
77
77
|
# => ["kagami"]
|
78
78
|
def hostnames_for(hostname) dispatch(hostname) end
|
79
|
-
|
80
|
-
# Convert a mask to a CIDR.
|
81
|
-
#
|
82
|
-
# Example:
|
83
|
-
# mask_to_cidr("255.255.255.0") # => 24
|
84
|
-
def mask_to_cidr(mask) dispatch(mask) end
|
85
|
-
|
86
|
-
# Convert CIDR to mask.
|
87
|
-
#
|
88
|
-
# Example:
|
89
|
-
# cidr_to_mask(24) # => "255.255.255.0"
|
90
|
-
def cidr_to_mask(cidr) dispatch(cidr) end
|
91
|
-
|
92
|
-
# Convert a decimal number to binary notation.
|
93
|
-
#
|
94
|
-
# Example:
|
95
|
-
# dec2bin(255) # => "11111111"
|
96
|
-
def dec2bin(n) dispatch(n) end
|
97
|
-
|
98
|
-
# Convert a binary number to decimal.
|
99
|
-
#
|
100
|
-
# Example:
|
101
|
-
# bin2dec("11111111") # => 255
|
102
|
-
def bin2dec(s) dispatch(s) end
|
103
|
-
end
|
104
|
-
|
105
|
-
# == AddressManager::BaseDriver
|
106
|
-
#
|
107
|
-
# Base class for all AddressManager drivers.
|
108
|
-
class AutomateIt::AddressManager::BaseDriver< AutomateIt::Plugin::Driver
|
109
|
-
# See AddressManager#hostnames
|
110
|
-
def hostnames()
|
111
|
-
# NOTE: depends on driver's implementation of addresses
|
112
|
-
names = addresses.inject(Set.new) do |sum, address|
|
113
|
-
# Some addresses can't be resolved, bummer.
|
114
|
-
sum.merge(Resolv.getnames(address)) rescue Resolv::ResolvError; sum
|
115
|
-
end
|
116
|
-
names << Socket.gethostname
|
117
|
-
names.merge(Socket.gethostbyname(Socket.gethostname)[1]) rescue SocketError
|
118
|
-
|
119
|
-
names.each{|name| names.merge(hostnames_for(name))}
|
120
|
-
names << "localhost"
|
121
|
-
return names.to_a.sort
|
122
|
-
end
|
123
|
-
|
124
|
-
# See AddressManager#hostname_for
|
125
|
-
def hostnames_for(hostname)
|
126
|
-
results = []
|
127
|
-
elements = hostname.split(".")
|
128
|
-
for i in 1..elements.size
|
129
|
-
results << elements[0..i-1].join(".")
|
130
|
-
end
|
131
|
-
return results.to_a.sort
|
132
|
-
end
|
133
|
-
|
134
|
-
# See AddressManager#mask_to_cidr
|
135
|
-
def mask_to_cidr(mask)
|
136
|
-
# TODO Find less horrible solution which can handle IPv6.
|
137
|
-
result = ''
|
138
|
-
for chunk in mask.split(".")
|
139
|
-
result += dec2bin(chunk.to_i)
|
140
|
-
end
|
141
|
-
return result.scan(/1/).size
|
142
|
-
end
|
143
|
-
|
144
|
-
# See AddressManager#cidr_to_mask
|
145
|
-
def cidr_to_mask(cidr)
|
146
|
-
# TODO Find less horrible solution which can handle IPv6.
|
147
|
-
require 'ipaddr'
|
148
|
-
IPAddr.new("0.0.0.0/#{cidr}").inspect.match(%r{/([\d\.]+)>})[1]
|
149
|
-
end
|
150
|
-
|
151
|
-
# See AddressManager#dec2bin
|
152
|
-
def dec2bin(n)
|
153
|
-
# dec2bin(255)
|
154
|
-
return "%b" % n
|
155
|
-
end
|
156
|
-
|
157
|
-
# See AddressManager#bin2dec
|
158
|
-
def bin2dec(s)
|
159
|
-
return s.to_i(2)
|
160
|
-
end
|
161
79
|
end
|
162
80
|
|
163
81
|
# Drivers
|
82
|
+
require 'automateit/address_manager/base'
|
164
83
|
require 'automateit/address_manager/portable'
|
165
84
|
require 'automateit/address_manager/linux'
|
85
|
+
require 'automateit/address_manager/sunos'
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# == AddressManager::BaseDriver
|
2
|
+
#
|
3
|
+
# Base class for all AddressManager drivers.
|
4
|
+
class AutomateIt::AddressManager::BaseDriver< AutomateIt::Plugin::Driver
|
5
|
+
public
|
6
|
+
|
7
|
+
# See AddressManager#hostnames
|
8
|
+
def hostnames()
|
9
|
+
# NOTE: depends on driver's implementation of addresses
|
10
|
+
names = addresses.inject(Set.new) do |sum, address|
|
11
|
+
# Some addresses can't be resolved, bummer.
|
12
|
+
sum.merge(Resolv.getnames(address)) rescue Resolv::ResolvError; sum
|
13
|
+
end
|
14
|
+
names << Socket.gethostname
|
15
|
+
names.merge(Socket.gethostbyname(Socket.gethostname)[1]) rescue SocketError
|
16
|
+
|
17
|
+
names.each{|name| names.merge(hostnames_for(name))}
|
18
|
+
names << "localhost"
|
19
|
+
return names.to_a.sort
|
20
|
+
end
|
21
|
+
|
22
|
+
# See AddressManager#hostname_for
|
23
|
+
def hostnames_for(hostname)
|
24
|
+
results = []
|
25
|
+
elements = hostname.split(".")
|
26
|
+
for i in 1..elements.size
|
27
|
+
results << elements[0..i-1].join(".")
|
28
|
+
end
|
29
|
+
return results.to_a.sort
|
30
|
+
end
|
31
|
+
|
32
|
+
# See AddressManager#has?
|
33
|
+
def has?(opts)
|
34
|
+
raise ArgumentError.new(":device or :address must be specified") unless opts[:device] or opts[:address]
|
35
|
+
result = true
|
36
|
+
result &= interfaces.include?(opts[:device]) if opts[:device] and not opts[:label]
|
37
|
+
result &= interfaces.include?(opts[:device]+":"+opts[:label]) if opts[:device] and opts[:label]
|
38
|
+
result &= addresses.include?(opts[:address]) if opts[:address]
|
39
|
+
return result
|
40
|
+
end
|
41
|
+
|
42
|
+
#-----------------------------------------------------------------------
|
43
|
+
|
44
|
+
protected
|
45
|
+
|
46
|
+
# Convert a mask to a CIDR.
|
47
|
+
#
|
48
|
+
# Example:
|
49
|
+
# mask_to_cidr("255.255.255.0") # => 24
|
50
|
+
def mask_to_cidr(mask)
|
51
|
+
# TODO Find less horrible solution which can handle IPv6.
|
52
|
+
result = ''
|
53
|
+
for chunk in mask.split(".")
|
54
|
+
result += dec2bin(chunk.to_i)
|
55
|
+
end
|
56
|
+
return result.scan(/1/).size
|
57
|
+
end
|
58
|
+
|
59
|
+
# Convert CIDR to mask.
|
60
|
+
#
|
61
|
+
# Example:
|
62
|
+
# cidr_to_mask(24) # => "255.255.255.0"
|
63
|
+
def cidr_to_mask(cidr)
|
64
|
+
# TODO Find less horrible solution which can handle IPv6.
|
65
|
+
require 'ipaddr'
|
66
|
+
IPAddr.new("0.0.0.0/#{cidr}").inspect.match(%r{/([\d\.]+)>})[1]
|
67
|
+
end
|
68
|
+
|
69
|
+
# Convert a decimal number to binary notation.
|
70
|
+
#
|
71
|
+
# Example:
|
72
|
+
# dec2bin(255) # => "11111111"
|
73
|
+
def dec2bin(n)
|
74
|
+
# dec2bin(255)
|
75
|
+
return "%b" % n
|
76
|
+
end
|
77
|
+
|
78
|
+
# Convert a binary number to decimal.
|
79
|
+
#
|
80
|
+
# Example:
|
81
|
+
# bin2dec("11111111") # => 255
|
82
|
+
def bin2dec(s)
|
83
|
+
return s.to_i(2)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Helper for #add method.
|
87
|
+
def _add_helper(opts, &block)
|
88
|
+
opts[:announcements] = opts[:announcements].to_i || AutomateIt::AddressManager::DEFAULT_ANNOUNCEMENTS
|
89
|
+
raise SecurityError.new("you must be root") unless superuser?
|
90
|
+
raise ArgumentError.new(":device and :address must be specified") unless opts[:device] and opts[:address]
|
91
|
+
return false if has?(opts)
|
92
|
+
block.call(opts)
|
93
|
+
return true
|
94
|
+
end
|
95
|
+
|
96
|
+
# Helper for #remove method.
|
97
|
+
def _remove_helper(opts, &block)
|
98
|
+
return false unless has?(opts)
|
99
|
+
raise SecurityError.new("you must be root") unless superuser?
|
100
|
+
raise ArgumentError.new(":device and :address must be specified") unless opts[:device] and opts[:address]
|
101
|
+
return block.call(opts)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Alter +opts+ hash to add alternative names for various options.
|
105
|
+
def _normalize_opts(opts)
|
106
|
+
# Accept common alternative names
|
107
|
+
opts[:mask] ||= opts[:netmask] if opts[:netmask]
|
108
|
+
opts[:alias] ||= opts[:alias] if opts[:alias]
|
109
|
+
opts[:device] ||= opts[:interface] if opts[:interface]
|
110
|
+
|
111
|
+
if opts[:mask] and not opts[:mask].match(/\./)
|
112
|
+
opts[:mask] = cidr_to_mask(opts[:mask])
|
113
|
+
end
|
114
|
+
|
115
|
+
return opts
|
116
|
+
end
|
117
|
+
|
118
|
+
# Return the interface and label specified in +opts+ hash, e.g., "eth0:1".
|
119
|
+
def _interface_and_label(opts)
|
120
|
+
return(
|
121
|
+
if opts[:device] and not opts[:label]
|
122
|
+
opts[:device]
|
123
|
+
elsif opts[:device] and opts[:label]
|
124
|
+
"%s:%s" % [opts[:device], opts[:label]]
|
125
|
+
else
|
126
|
+
raise ArgumentError.new("Can't derive interface and label for: #{opts.inspect}")
|
127
|
+
end
|
128
|
+
)
|
129
|
+
end
|
130
|
+
|
131
|
+
def _ifconfig_helper(action, opts)
|
132
|
+
_raise_unless_available
|
133
|
+
action = :del if action.to_sym == :remove
|
134
|
+
|
135
|
+
_normalize_opts(opts)
|
136
|
+
|
137
|
+
### ifconfig hme0 192.9.2.106 netmask 255.255.255.0 up
|
138
|
+
### ifconfig hme0:1 172.40.30.4 netmask 255.255.0.0 up
|
139
|
+
|
140
|
+
ipcmd = "ifconfig"
|
141
|
+
ipcmd << " " << _interface_and_label(opts)
|
142
|
+
ipcmd << " %s" % opts[:address]
|
143
|
+
ipcmd << " netmask %s" % opts[:mask] if opts[:mask]
|
144
|
+
ipcmd << " up" if action == :add
|
145
|
+
ipcmd << " down" if action == :del
|
146
|
+
return ipcmd
|
147
|
+
end
|
148
|
+
end
|
@@ -4,67 +4,29 @@
|
|
4
4
|
# querying, adding and removing addresses on platforms that feature Linux-like
|
5
5
|
# tools.
|
6
6
|
class AutomateIt::AddressManager::Linux < AutomateIt::AddressManager::BaseDriver
|
7
|
-
depends_on :programs => "ifconfig",
|
7
|
+
depends_on :programs => "ifconfig",
|
8
8
|
:callbacks => lambda{`ifconfig --version 2>&1`.match(/net-tools/)}
|
9
9
|
|
10
10
|
def suitability(method, *args) # :nodoc:
|
11
11
|
available? ? 2 : 0
|
12
12
|
end
|
13
13
|
|
14
|
-
# See AddressManager#has?
|
15
|
-
def has?(opts)
|
16
|
-
raise ArgumentError.new(":device or :address must be specified") unless opts[:device] or opts[:address]
|
17
|
-
result = true
|
18
|
-
result &= interfaces.include?(opts[:device]) if opts[:device] and not opts[:label]
|
19
|
-
result &= interfaces.include?(opts[:device]+":"+opts[:label]) if opts[:device] and opts[:label]
|
20
|
-
result &= addresses.include?(opts[:address]) if opts[:address]
|
21
|
-
return result
|
22
|
-
end
|
23
|
-
|
24
14
|
# See AddressManager#add
|
25
15
|
def add(opts)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
if interpreter.which("arping")
|
32
|
-
interpreter.sh("arping -q -c #{announcements} -w #{announcements} -I #{opts[:device]} #{opts[:address]}")
|
16
|
+
_add_helper(opts) do |opts|
|
17
|
+
interpreter.sh(_ifconfig_helper(:add, opts))
|
18
|
+
if interpreter.which("arping")
|
19
|
+
interpreter.sh("arping -q -c #{opts[:announcements]} -w #{opts[:announcements]} -I #{opts[:device]} #{opts[:address]}")
|
20
|
+
end
|
33
21
|
end
|
34
|
-
return true
|
35
22
|
end
|
36
23
|
|
37
24
|
# See AddressManager#remove
|
38
25
|
def remove(opts)
|
39
|
-
|
40
|
-
|
41
|
-
raise ArgumentError.new(":device and :address must be specified") unless opts[:device] and opts[:address]
|
42
|
-
return interpreter.sh(_add_or_remove_command(:remove, opts))
|
43
|
-
end
|
44
|
-
|
45
|
-
def _add_or_remove_command(action, opts)
|
46
|
-
_raise_unless_available
|
47
|
-
action = :del if action.to_sym == :remove
|
48
|
-
|
49
|
-
# Accept common alternative names
|
50
|
-
opts[:mask] ||= opts[:netmask] if opts[:netmask]
|
51
|
-
opts[:alias] ||= opts[:alias] if opts[:alias]
|
52
|
-
opts[:device] ||= opts[:interface] if opts[:interface]
|
53
|
-
|
54
|
-
if opts[:mask] and not opts[:mask].match(/\./)
|
55
|
-
opts[:mask] = cidr_to_mask(opts[:mask])
|
26
|
+
_remove_helper(opts) do |opts|
|
27
|
+
interpreter.sh(_ifconfig_helper(:remove, opts))
|
56
28
|
end
|
57
|
-
|
58
|
-
ipcmd = "ifconfig"
|
59
|
-
ipcmd << " %s" % opts[:device] if opts[:device] and not opts[:label]
|
60
|
-
ipcmd << " %s:%s" % [opts[:device], opts[:label]] if opts[:device] and opts[:label]
|
61
|
-
ipcmd << " %s" % opts[:address]
|
62
|
-
ipcmd << " netmask %s" % opts[:mask] if opts[:mask]
|
63
|
-
ipcmd << " up" if action == :add
|
64
|
-
ipcmd << " down" if action == :del
|
65
|
-
return ipcmd
|
66
29
|
end
|
67
|
-
private :_add_or_remove_command
|
68
30
|
|
69
31
|
# See AddressManager#interfaces
|
70
32
|
def interfaces()
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# == AddressManager::SunOS
|
2
|
+
#
|
3
|
+
# A SunOS-specific driver for the AddressManager provides complete support for
|
4
|
+
# querying, adding and removing addresses.
|
5
|
+
class AutomateIt::AddressManager::SunOS < AutomateIt::AddressManager::BaseDriver
|
6
|
+
def self.token
|
7
|
+
:sunos
|
8
|
+
end
|
9
|
+
|
10
|
+
depends_on :programs => %w(ifconfig uname),
|
11
|
+
:callbacks => lambda{`uname -s`.match(/sunos/i)}
|
12
|
+
|
13
|
+
def suitability(method, *args) # :nodoc:
|
14
|
+
available? ? 2 : 0
|
15
|
+
end
|
16
|
+
|
17
|
+
# See AddressManager#add
|
18
|
+
def add(opts)
|
19
|
+
_add_helper(opts) do |opts|
|
20
|
+
interpreter.sh("ifconfig %s plumb" % _interface_and_label(opts))
|
21
|
+
interpreter.sh(_ifconfig_helper(:add, opts))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# See AddressManager#remove
|
26
|
+
def remove(opts)
|
27
|
+
_remove_helper(opts) do |opts|
|
28
|
+
interpreter.sh(_ifconfig_helper(:remove, opts))
|
29
|
+
interpreter.sh("ifconfig %s unplumb" % _interface_and_label(opts))
|
30
|
+
true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# See AddressManager#interfaces
|
35
|
+
def interfaces()
|
36
|
+
_raise_unless_available
|
37
|
+
return `ifconfig -a`.scan(/^([^ ]+):\s+/s).flatten
|
38
|
+
end
|
39
|
+
|
40
|
+
# See AddressManager#addresses
|
41
|
+
def addresses()
|
42
|
+
_raise_unless_available
|
43
|
+
return `ifconfig -a`.scan(/\s+inet\s+([^\s]+)\s+/).flatten
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -633,6 +633,10 @@ module AutomateIt
|
|
633
633
|
# * nil -- Returns boolean of whether nitpick messages will be displayed.
|
634
634
|
# * Boolean -- Sets nitpick state.
|
635
635
|
# * String or Symbol -- Displays nitpick message if state is on.
|
636
|
+
#
|
637
|
+
# Example:
|
638
|
+
# nitpick true
|
639
|
+
# nitpick "I'm nitpicking"
|
636
640
|
def nitpick(value=nil)
|
637
641
|
case value
|
638
642
|
when NilClass: @nitpick
|