snooper 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +15 -0
- data/bin/snooper +110 -10
- data/lib/snooper/snoop.rb +51 -8
- data/lib/snooper.rb +9 -1
- data/man/snooper-config.7 +41 -0
- data/man/snooper-config.7.html +141 -0
- data/man/snooper-config.7.ronn +43 -0
- data/man/snooper.1 +42 -0
- data/man/snooper.1.html +146 -0
- data/man/snooper.1.ronn +47 -0
- metadata +33 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c770ca85f973ece6ee0dafd2525fa4a1ab9a847
|
4
|
+
data.tar.gz: 809646762899f32c4f57e596be6d0c7b2eefe164
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 095a8c271de8100250a1346c1aca5fb41d660e6fdd9850fbc68d6f20063d9071c8def7a8feee4aea6266d41a3d8986227fcb12c42f2763b8a9d8ae9774323280
|
7
|
+
data.tar.gz: 0b09d92b6e88dd3324a20e3e035b524e2c24a92046f5cf73b2605ed3bae75b675195ad085a3b4cceafbf48c97489ed15189df457d6f973a0689b85d87041f1f5
|
data/README.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#Snooper
|
2
|
+
|
3
|
+
Snooper is a lightweight test automation tool, it monitors files and folders while you work and re-runs your tests when you change something. Snooper doesn't care what language you're using or what framework you are testing with, it's all configureable.
|
4
|
+
|
5
|
+
##Useage
|
6
|
+
|
7
|
+
```bash
|
8
|
+
$ snooper <directory> <command>
|
9
|
+
```
|
10
|
+
|
11
|
+
See [snooper(1)](http://iwillspeak.github.com/snooper/snooper.1.html) for more information.
|
12
|
+
|
13
|
+
##Licence
|
14
|
+
|
15
|
+
Snooper is open source! For more information check out [the licence](LICENCE.md).
|
data/bin/snooper
CHANGED
@@ -1,26 +1,126 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
|
3
|
+
# Author:: Will Speak (@willspeak)
|
4
|
+
# Copyright:: Copyright (c) 2013 Will Speak
|
5
|
+
# License:: Snoop is open source! See LICENCE.md for more details.
|
6
|
+
|
3
7
|
require 'snooper'
|
4
8
|
require 'colored'
|
9
|
+
require 'optparse'
|
10
|
+
require 'yaml'
|
11
|
+
|
12
|
+
##
|
13
|
+
# Main program loop
|
14
|
+
#
|
15
|
+
# Do our stuff, and exit cleanly when interrupted.
|
5
16
|
|
6
17
|
def test_loop(options)
|
7
18
|
begin
|
8
|
-
dirs = options[:
|
19
|
+
dirs = options[:paths].empty? ? './' : options[:paths]
|
9
20
|
Snooper.watch dirs, options
|
10
21
|
rescue Interrupt
|
11
22
|
puts # This is where the ^C is on unix
|
12
|
-
puts "
|
23
|
+
puts "Testing over, time for a coffee...".yellow
|
13
24
|
end
|
14
25
|
end
|
15
26
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
27
|
+
##
|
28
|
+
# Parse the command line and load the options
|
29
|
+
#
|
30
|
+
|
31
|
+
def get_options
|
32
|
+
|
33
|
+
helptext = <<END
|
34
|
+
|
35
|
+
Snooper is a lightweight test automation tool, it monitors files and folders
|
36
|
+
while you work and re-runs your tests when you change something. Snooper
|
37
|
+
doesn't care what language you're using or what framework you are testing with,
|
38
|
+
it's all configureable.
|
39
|
+
|
40
|
+
For more information see snooper(1).
|
41
|
+
END
|
42
|
+
|
43
|
+
config_path = '.snooper.yaml'
|
44
|
+
opts = OptionParser.new do |opts|
|
45
|
+
opts.banner =
|
46
|
+
"Useage: #{File.basename __FILE__} [--config <CONFIG> | --help] " +
|
47
|
+
"[<COMMAND>]*"
|
48
|
+
|
49
|
+
opts.separator helptext
|
50
|
+
|
51
|
+
opts.on '-c', '--config CONFIGFILE', 'YAML configuration file' do |path|
|
52
|
+
config_path = path
|
53
|
+
end
|
54
|
+
|
55
|
+
opts.on("-h", "--help", "Show this message") do
|
56
|
+
puts opts
|
57
|
+
exit
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Parse the options
|
62
|
+
begin
|
63
|
+
opts.parse!
|
64
|
+
rescue OptionParser::InvalidOption, \
|
65
|
+
OptionParser::MissingArgument, \
|
66
|
+
OptionParser::InvalidArgument => e
|
67
|
+
puts e
|
68
|
+
puts opts
|
69
|
+
exit 1
|
70
|
+
end
|
71
|
+
|
72
|
+
# Load the config file
|
73
|
+
begin
|
74
|
+
yamopts = YAML.load_file config_path
|
75
|
+
rescue Exception => e
|
76
|
+
puts "Error loading the config: #{e}"
|
77
|
+
exit 1
|
78
|
+
end
|
79
|
+
|
80
|
+
if not yamopts.is_a? Hash
|
81
|
+
puts "Invalid options file"
|
82
|
+
exit 1
|
83
|
+
end
|
84
|
+
|
85
|
+
# default options
|
86
|
+
options = {
|
87
|
+
:base_path => nil,
|
88
|
+
:command => nil,
|
89
|
+
:filters => [],
|
90
|
+
:ignored => [],
|
91
|
+
:paths => []
|
92
|
+
}
|
93
|
+
|
94
|
+
yamopts.each do |option, argument|
|
95
|
+
case option
|
96
|
+
when 'base_path', 'command'
|
97
|
+
options[option.to_sym] = argument.to_s
|
98
|
+
|
99
|
+
when 'paths', 'filters', 'ignored'
|
100
|
+
argument = argument.split if argument.is_a? String
|
101
|
+
options[option.to_sym] += Array(argument)
|
102
|
+
|
103
|
+
else
|
104
|
+
puts "Ignoring unknown option #{option}".red
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
if options[:base_path]
|
109
|
+
base = File.expand_path options[:base_path], File.dirname(config_path)
|
110
|
+
options[:paths].map! { |p| File.expand_path p, base }
|
111
|
+
options[:base_path] = base
|
112
|
+
end
|
113
|
+
|
114
|
+
# Override the command if one was specified
|
115
|
+
options[:command] = ARGV.join " " if not ARGV.empty?
|
116
|
+
|
117
|
+
options
|
118
|
+
end
|
23
119
|
|
24
|
-
|
120
|
+
options = get_options
|
25
121
|
|
122
|
+
# Run the tests, pusing the target directory
|
123
|
+
old_dir = File.expand_path '.'
|
124
|
+
Dir.chdir options[:base_path] if options[:base_path]
|
26
125
|
test_loop options
|
126
|
+
Dir.chdir old_dir
|
data/lib/snooper/snoop.rb
CHANGED
@@ -1,21 +1,46 @@
|
|
1
|
+
# Author:: Will Speak (@willspeak)
|
2
|
+
# Copyright:: Copyright (c) 2013 Will Speak
|
3
|
+
# License:: Snoop is open source! See LICENCE.md for more details.
|
4
|
+
|
1
5
|
module Snooper
|
6
|
+
|
7
|
+
##
|
8
|
+
# Watches over a directory, executing a comand when files change
|
9
|
+
#
|
10
|
+
# The fine-grained behaviour of this class is controlled by the parameters
|
11
|
+
# passed to the +new+ method.
|
2
12
|
class Snoop
|
3
13
|
|
4
14
|
require 'listen'
|
5
15
|
require 'colored'
|
6
16
|
require 'terminfo'
|
7
17
|
|
18
|
+
##
|
19
|
+
# Create a new source code spy
|
20
|
+
#
|
21
|
+
# @param [String, Array] path - the path (or paths) to begin watching
|
22
|
+
# @param [Hash] args - the options hash
|
23
|
+
# [+:filters+] [Array,String,Regexp] Files to include, empty for all
|
24
|
+
# [+:ignored+] [Array,String,Regexp] Paths to ignore
|
25
|
+
# [+:command+] [String] The command to run when changes are detected
|
26
|
+
|
8
27
|
def initialize(path, args = {})
|
9
28
|
to_regex = Proc.new { |r| Regexp.new r if not r.is_a?(Regexp) }
|
10
29
|
|
11
30
|
@paths = Array(path)
|
12
31
|
@filters = args[:filters]
|
13
|
-
@filters = Array(
|
32
|
+
@filters = Array(@filters).map(&to_regex) if @filters
|
14
33
|
@ignored = args[:ignored]
|
15
|
-
@ignored = Array(
|
34
|
+
@ignored = Array(@ignored).map(&to_regex) if @ignored
|
16
35
|
@command = args[:command]
|
17
36
|
end
|
18
37
|
|
38
|
+
##
|
39
|
+
# Change callback
|
40
|
+
#
|
41
|
+
# Called when a filesystem change is detected by +listen+. Runs the command
|
42
|
+
# passed to t he constructor and prints a summary of the output.
|
43
|
+
|
19
44
|
def on_change(modified, added, removed)
|
20
45
|
begin
|
21
46
|
# Puase the listener to make sure any build output doesn't mess with things
|
@@ -23,15 +48,17 @@ module Snooper
|
|
23
48
|
|
24
49
|
# summarise the changes made
|
25
50
|
changes = modified + added + removed
|
26
|
-
|
27
|
-
|
28
|
-
|
51
|
+
|
52
|
+
statusline = ('-' * removed.length).red
|
53
|
+
statusline << ('.' * modified.length).blue
|
54
|
+
statusline << ('+' * added.length).green
|
55
|
+
puts "#{statusline} #{changes.length.to_s.magenta.bold} changes"
|
29
56
|
|
30
57
|
# run the test suite and check the result
|
31
58
|
if system @command then
|
32
59
|
puts statusbar "All tests passed", &:white_on_green
|
33
60
|
else
|
34
|
-
puts
|
61
|
+
puts statusbar "Tests failed", &:white_on_red
|
35
62
|
end
|
36
63
|
|
37
64
|
# return to listening
|
@@ -42,15 +69,31 @@ module Snooper
|
|
42
69
|
end
|
43
70
|
end
|
44
71
|
|
72
|
+
##
|
73
|
+
# Prettify a status line
|
74
|
+
#
|
75
|
+
# Prints the message at the center of the line, automatically detected
|
76
|
+
# from the terminal info. If a block is supplied then the resulting message
|
77
|
+
# is post-filtered by it before being returned.
|
78
|
+
#
|
79
|
+
# @param message - the message to print
|
80
|
+
|
45
81
|
def statusbar(message)
|
46
82
|
message = message.to_s.center TermInfo.screen_width
|
47
83
|
block_given? ? yield(message) : message
|
48
84
|
end
|
49
|
-
|
85
|
+
|
86
|
+
##
|
87
|
+
# Main run loop
|
88
|
+
#
|
89
|
+
# Registers for filesystem notifications and dispatches them to the
|
90
|
+
# +on_change+ handler. This method also forces a dummy update to ensure that
|
91
|
+
# tests are run when watching begins.
|
92
|
+
|
50
93
|
def run
|
51
94
|
|
52
95
|
# Force a change to start with
|
53
|
-
|
96
|
+
on_change [], [], []
|
54
97
|
|
55
98
|
callback_helper = Proc.new {|*args| self.on_change *args }
|
56
99
|
|
data/lib/snooper.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
##
|
1
2
|
# This program runs in the background watching for file changes. When a file
|
2
3
|
# change is dtected a command is run. It is intended to watch repos for changes
|
3
4
|
# and run unit tests automatically when source files are changed.
|
@@ -6,11 +7,18 @@
|
|
6
7
|
# Copyright:: Copyright (c) 2013 Will Speak
|
7
8
|
# License:: Snoop is open source! See LICENCE.md for more details.
|
8
9
|
|
9
|
-
#
|
10
|
+
# This module provides the snooping abilities.
|
11
|
+
#
|
12
|
+
# For most applications calling the +Snooper#watch+ method should be sufficient
|
13
|
+
# if Snooper::Snoop objects can be created directly.
|
10
14
|
module Snooper
|
11
15
|
|
12
16
|
require 'snooper/snoop'
|
13
17
|
|
18
|
+
##
|
19
|
+
# Watch for changes in a directory
|
20
|
+
#
|
21
|
+
# @param args - see Snooper::Snoop.new for more information
|
14
22
|
def self.watch(*args)
|
15
23
|
george = Snoop.new *args
|
16
24
|
george.run
|
@@ -0,0 +1,41 @@
|
|
1
|
+
.\" generated with Ronn/v0.7.3
|
2
|
+
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
|
+
.
|
4
|
+
.TH "SNOOPER\-CONFIG" "7" "March 2013" "" ""
|
5
|
+
.
|
6
|
+
.SH "NAME"
|
7
|
+
\fBsnooper\-config\fR \- Configure for Espionage
|
8
|
+
.
|
9
|
+
.SH "DESCRIPTION"
|
10
|
+
Configuration of \fBsnooper\fR is controlled through a YAML file\.
|
11
|
+
.
|
12
|
+
.SH "FORMAT"
|
13
|
+
snooper(1) expects a YAML document of key\-value pairs; each pair specifies an option\. Unknown options are ignored\. Options that can contain a list of values may also be given a single value\.
|
14
|
+
.
|
15
|
+
.SH "OPTIONS"
|
16
|
+
String options
|
17
|
+
.
|
18
|
+
.TP
|
19
|
+
\fBbase_path:\fR \fIdirectory\fR
|
20
|
+
Specifies the \fIdirectory\fR that \fBsnooper\fR should base all relative paths from\. This is also the working directory that commands will inherit\.
|
21
|
+
.
|
22
|
+
.TP
|
23
|
+
\fBcommand:\fR \fIcommand_string\fR
|
24
|
+
Specifies the command string to execute when a file change is detected\.
|
25
|
+
.
|
26
|
+
.P
|
27
|
+
String Array options
|
28
|
+
.
|
29
|
+
.TP
|
30
|
+
\fBpaths:\fR \fIdirectories\fR
|
31
|
+
Specifies a list of \fIdirectories\fR to watch\. Directories can be either relative or absolute paths\. If no paths are specified the default is to watch \fBbase_path\fR\.
|
32
|
+
.
|
33
|
+
.TP
|
34
|
+
\fBfilters:\fR \fIfilters\fR, \fBignored:\fR \fIfilters\fR
|
35
|
+
Specifies a list of regular expressions \fIfilters\fR to use to filter the changes\. These should be in a format understood by ruby(1)\'s Regex\.new method\. If none are given then all changes in watched directories trigger testing\.
|
36
|
+
.
|
37
|
+
.IP
|
38
|
+
\fINote\fR: as these are regular expressions \fB\e\.c\fR will match both \fBfoo\.c\fR and \fBbar\.cfg\fR, \fB\e\.c$\fR will only match \fB\.c\fR files\.
|
39
|
+
.
|
40
|
+
.SH "SEE ALSO"
|
41
|
+
snooper(1)
|
@@ -0,0 +1,141 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv='content-type' value='text/html;charset=utf8'>
|
5
|
+
<meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
|
6
|
+
<title>snooper-config(7) - Configure for Espionage</title>
|
7
|
+
<style type='text/css' media='all'>
|
8
|
+
/* style: man */
|
9
|
+
body#manpage {margin:0}
|
10
|
+
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
|
11
|
+
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
|
12
|
+
.mp h2 {margin:10px 0 0 0}
|
13
|
+
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
|
14
|
+
.mp h3 {margin:0 0 0 4ex}
|
15
|
+
.mp dt {margin:0;clear:left}
|
16
|
+
.mp dt.flush {float:left;width:8ex}
|
17
|
+
.mp dd {margin:0 0 0 9ex}
|
18
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
|
19
|
+
.mp pre {margin-bottom:20px}
|
20
|
+
.mp pre+h2,.mp pre+h3 {margin-top:22px}
|
21
|
+
.mp h2+pre,.mp h3+pre {margin-top:5px}
|
22
|
+
.mp img {display:block;margin:auto}
|
23
|
+
.mp h1.man-title {display:none}
|
24
|
+
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
|
25
|
+
.mp h2 {font-size:16px;line-height:1.25}
|
26
|
+
.mp h1 {font-size:20px;line-height:2}
|
27
|
+
.mp {text-align:justify;background:#fff}
|
28
|
+
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
|
29
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
|
30
|
+
.mp u {text-decoration:underline}
|
31
|
+
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
|
32
|
+
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
|
33
|
+
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
|
34
|
+
.mp b.man-ref {font-weight:normal;color:#434241}
|
35
|
+
.mp pre {padding:0 4ex}
|
36
|
+
.mp pre code {font-weight:normal;color:#434241}
|
37
|
+
.mp h2+pre,h3+pre {padding-left:0}
|
38
|
+
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
|
39
|
+
ol.man-decor {width:100%}
|
40
|
+
ol.man-decor li.tl {text-align:left}
|
41
|
+
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
|
42
|
+
ol.man-decor li.tr {text-align:right;float:right}
|
43
|
+
</style>
|
44
|
+
<style type='text/css' media='all'>
|
45
|
+
/* style: dark */
|
46
|
+
.mp,body#manpage {background:#080706;color:#888}
|
47
|
+
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#aaa}
|
48
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {color:#fff}
|
49
|
+
.man-decor,.man-decor ol li {color:#666}
|
50
|
+
.mp code,.mp strong,.mp b {color:#fff}
|
51
|
+
.mp em,.mp var,.mp u {color:#ddd}
|
52
|
+
.mp pre code {color:#ddd}
|
53
|
+
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#fff}
|
54
|
+
</style>
|
55
|
+
<style type='text/css' media='all'>
|
56
|
+
/* style: toc */
|
57
|
+
.man-navigation {display:block !important;position:fixed;top:0;left:113ex;height:100%;width:100%;padding:48px 0 0 0;border-left:1px solid #dbdbdb;background:#eee}
|
58
|
+
.man-navigation a,.man-navigation a:hover,.man-navigation a:link,.man-navigation a:visited {display:block;margin:0;padding:5px 2px 5px 30px;color:#999;text-decoration:none}
|
59
|
+
.man-navigation a:hover {color:#111;text-decoration:underline}
|
60
|
+
</style>
|
61
|
+
</head>
|
62
|
+
<!--
|
63
|
+
The following styles are deprecated and will be removed at some point:
|
64
|
+
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
|
65
|
+
|
66
|
+
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
|
67
|
+
.man-navigation should be used instead.
|
68
|
+
-->
|
69
|
+
<body id='manpage'>
|
70
|
+
<div class='mp' id='man'>
|
71
|
+
|
72
|
+
<div class='man-navigation' style='display:none'>
|
73
|
+
<a href="#NAME">NAME</a>
|
74
|
+
<a href="#DESCRIPTION">DESCRIPTION</a>
|
75
|
+
<a href="#FORMAT">FORMAT</a>
|
76
|
+
<a href="#OPTIONS">OPTIONS</a>
|
77
|
+
<a href="#SEE-ALSO">SEE ALSO</a>
|
78
|
+
</div>
|
79
|
+
|
80
|
+
<ol class='man-decor man-head man head'>
|
81
|
+
<li class='tl'>snooper-config(7)</li>
|
82
|
+
<li class='tc'></li>
|
83
|
+
<li class='tr'>snooper-config(7)</li>
|
84
|
+
</ol>
|
85
|
+
|
86
|
+
<h2 id="NAME">NAME</h2>
|
87
|
+
<p class="man-name">
|
88
|
+
<code>snooper-config</code> - <span class="man-whatis">Configure for Espionage</span>
|
89
|
+
</p>
|
90
|
+
|
91
|
+
<h2 id="DESCRIPTION">DESCRIPTION</h2>
|
92
|
+
|
93
|
+
<p>Configuration of <code>snooper</code> is controlled through a YAML file.</p>
|
94
|
+
|
95
|
+
<h2 id="FORMAT">FORMAT</h2>
|
96
|
+
|
97
|
+
<p><a class="man-ref" href="snooper.1.html">snooper<span class="s">(1)</span></a> expects a YAML document of key-value pairs; each pair specifies an
|
98
|
+
option. Unknown options are ignored. Options that can contain a list of values
|
99
|
+
may also be given a single value.</p>
|
100
|
+
|
101
|
+
<h2 id="OPTIONS">OPTIONS</h2>
|
102
|
+
|
103
|
+
<p>String options</p>
|
104
|
+
|
105
|
+
<dl>
|
106
|
+
<dt><code>base_path:</code> <var>directory</var></dt><dd><p>Specifies the <var>directory</var> that <code>snooper</code> should base all relative paths from.
|
107
|
+
This is also the working directory that commands will inherit.</p></dd>
|
108
|
+
<dt><code>command:</code> <var>command_string</var></dt><dd><p>Specifies the command string to execute when a file change is detected.</p></dd>
|
109
|
+
</dl>
|
110
|
+
|
111
|
+
|
112
|
+
<p>String Array options</p>
|
113
|
+
|
114
|
+
<dl>
|
115
|
+
<dt><code>paths:</code> <var>directories</var></dt><dd><p>Specifies a list of <var>directories</var> to watch. Directories can be either
|
116
|
+
relative or absolute paths. If no paths are specified the default is to
|
117
|
+
watch <code>base_path</code>.</p></dd>
|
118
|
+
<dt><code>filters:</code> <var>filters</var>, <code>ignored:</code> <var>filters</var></dt><dd><p>Specifies a list of regular expressions <var>filters</var> to use to filter the
|
119
|
+
changes. These should be in a format understood by <span class="man-ref">ruby<span class="s">(1)</span></span>'s Regex.new
|
120
|
+
method. If none are given then all changes in watched directories trigger
|
121
|
+
testing.</p>
|
122
|
+
|
123
|
+
<p><em>Note</em>: as these are regular expressions <code>\.c</code> will match both
|
124
|
+
<code>foo.c</code> and <code>bar.cfg</code>, <code>\.c$</code> will only match <code>.c</code> files.</p></dd>
|
125
|
+
</dl>
|
126
|
+
|
127
|
+
|
128
|
+
<h2 id="SEE-ALSO">SEE ALSO</h2>
|
129
|
+
|
130
|
+
<p><a class="man-ref" href="snooper.1.html">snooper<span class="s">(1)</span></a></p>
|
131
|
+
|
132
|
+
|
133
|
+
<ol class='man-decor man-foot man foot'>
|
134
|
+
<li class='tl'></li>
|
135
|
+
<li class='tc'>March 2013</li>
|
136
|
+
<li class='tr'>snooper-config(7)</li>
|
137
|
+
</ol>
|
138
|
+
|
139
|
+
</div>
|
140
|
+
</body>
|
141
|
+
</html>
|
@@ -0,0 +1,43 @@
|
|
1
|
+
snooper-config(7) - Configure for Espionage
|
2
|
+
===========================================
|
3
|
+
|
4
|
+
## DESCRIPTION
|
5
|
+
|
6
|
+
Configuration of `snooper` is controlled through a YAML file.
|
7
|
+
|
8
|
+
## FORMAT
|
9
|
+
|
10
|
+
snooper(1) expects a YAML document of key-value pairs; each pair specifies an
|
11
|
+
option. Unknown options are ignored. Options that can contain a list of values
|
12
|
+
may also be given a single value.
|
13
|
+
|
14
|
+
## OPTIONS
|
15
|
+
|
16
|
+
String options
|
17
|
+
|
18
|
+
* `base_path:` <directory>:
|
19
|
+
Specifies the <directory> that `snooper` should base all relative paths from.
|
20
|
+
This is also the working directory that commands will inherit.
|
21
|
+
|
22
|
+
* `command:` <command_string>:
|
23
|
+
Specifies the command string to execute when a file change is detected.
|
24
|
+
|
25
|
+
String Array options
|
26
|
+
|
27
|
+
* `paths:` <directories>:
|
28
|
+
Specifies a list of <directories> to watch. Directories can be either
|
29
|
+
relative or absolute paths. If no paths are specified the default is to
|
30
|
+
watch `base_path`.
|
31
|
+
|
32
|
+
* `filters:` <filters>, `ignored:` <filters>:
|
33
|
+
Specifies a list of regular expressions <filters> to use to filter the
|
34
|
+
changes. These should be in a format understood by ruby(1)'s Regex.new
|
35
|
+
method. If none are given then all changes in watched directories trigger
|
36
|
+
testing.
|
37
|
+
|
38
|
+
_Note_: as these are regular expressions `\.c` will match both
|
39
|
+
`foo.c` and `bar.cfg`, `\.c$` will only match `.c` files.
|
40
|
+
|
41
|
+
## SEE ALSO
|
42
|
+
|
43
|
+
snooper(1)
|
data/man/snooper.1
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
.\" generated with Ronn/v0.7.3
|
2
|
+
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
|
+
.
|
4
|
+
.TH "SNOOPER" "1" "March 2013" "" ""
|
5
|
+
.
|
6
|
+
.SH "NAME"
|
7
|
+
\fBsnooper\fR \- Spy on Tests
|
8
|
+
.
|
9
|
+
.SH "SYNOPSIS"
|
10
|
+
\fBsnooper\fR \fIoptions\fR [\fIcommand_line\fR]*
|
11
|
+
.
|
12
|
+
.SH "DESCRIPTION"
|
13
|
+
\fBSnooper\fR is a lightweight test automation tool, it monitors files and folders while you work and re\-runs your tests when you change something\. Snooper doesn\'t care what language you\'re using or what framework you are testing with, it\'s all configureable\.
|
14
|
+
.
|
15
|
+
.SH "OPTIONS"
|
16
|
+
Most configuration takes place in the snooper\-config(7) file\. You can however override the command that is run\. This is useful if you are only working on a subsection of a project that has it\'s own tests\.
|
17
|
+
.
|
18
|
+
.TP
|
19
|
+
\fB\-c\fR, \fB\-\-config\fR \fIconfigfile\fR
|
20
|
+
Specify the configuration file to use\. The default is \fB\.snooper\.yaml\fR in the current directory\.
|
21
|
+
.
|
22
|
+
.TP
|
23
|
+
\fIcommand_line\fR
|
24
|
+
One or more \fIcommand_line\fRs to execute when source files change\. Overides any commands specified in the configuration file\.
|
25
|
+
.
|
26
|
+
.SH "EXAMPLES"
|
27
|
+
\fB$ snooper\fR
|
28
|
+
.
|
29
|
+
.P
|
30
|
+
To run snooper in the current directory, configured by the \fB\.snooper\.yaml\fR file\.
|
31
|
+
.
|
32
|
+
.P
|
33
|
+
\fB$ snooper \-\-config snooperrc "echo Hello World!"\fR
|
34
|
+
.
|
35
|
+
.P
|
36
|
+
To snooper using the cofiguration in \fIsnooperrc\fR executing \fBecho Hello World!\fR when files change\.
|
37
|
+
.
|
38
|
+
.SH "BUGS"
|
39
|
+
\fBSnooper\fR does not yet load the configuration file\.
|
40
|
+
.
|
41
|
+
.SH "AUTHORS"
|
42
|
+
Will Speak (@willspeak)
|
data/man/snooper.1.html
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv='content-type' value='text/html;charset=utf8'>
|
5
|
+
<meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
|
6
|
+
<title>snooper(1) - Spy on Tests</title>
|
7
|
+
<style type='text/css' media='all'>
|
8
|
+
/* style: man */
|
9
|
+
body#manpage {margin:0}
|
10
|
+
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
|
11
|
+
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
|
12
|
+
.mp h2 {margin:10px 0 0 0}
|
13
|
+
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
|
14
|
+
.mp h3 {margin:0 0 0 4ex}
|
15
|
+
.mp dt {margin:0;clear:left}
|
16
|
+
.mp dt.flush {float:left;width:8ex}
|
17
|
+
.mp dd {margin:0 0 0 9ex}
|
18
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
|
19
|
+
.mp pre {margin-bottom:20px}
|
20
|
+
.mp pre+h2,.mp pre+h3 {margin-top:22px}
|
21
|
+
.mp h2+pre,.mp h3+pre {margin-top:5px}
|
22
|
+
.mp img {display:block;margin:auto}
|
23
|
+
.mp h1.man-title {display:none}
|
24
|
+
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
|
25
|
+
.mp h2 {font-size:16px;line-height:1.25}
|
26
|
+
.mp h1 {font-size:20px;line-height:2}
|
27
|
+
.mp {text-align:justify;background:#fff}
|
28
|
+
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
|
29
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
|
30
|
+
.mp u {text-decoration:underline}
|
31
|
+
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
|
32
|
+
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
|
33
|
+
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
|
34
|
+
.mp b.man-ref {font-weight:normal;color:#434241}
|
35
|
+
.mp pre {padding:0 4ex}
|
36
|
+
.mp pre code {font-weight:normal;color:#434241}
|
37
|
+
.mp h2+pre,h3+pre {padding-left:0}
|
38
|
+
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
|
39
|
+
ol.man-decor {width:100%}
|
40
|
+
ol.man-decor li.tl {text-align:left}
|
41
|
+
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
|
42
|
+
ol.man-decor li.tr {text-align:right;float:right}
|
43
|
+
</style>
|
44
|
+
<style type='text/css' media='all'>
|
45
|
+
/* style: dark */
|
46
|
+
.mp,body#manpage {background:#080706;color:#888}
|
47
|
+
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#aaa}
|
48
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {color:#fff}
|
49
|
+
.man-decor,.man-decor ol li {color:#666}
|
50
|
+
.mp code,.mp strong,.mp b {color:#fff}
|
51
|
+
.mp em,.mp var,.mp u {color:#ddd}
|
52
|
+
.mp pre code {color:#ddd}
|
53
|
+
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#fff}
|
54
|
+
</style>
|
55
|
+
<style type='text/css' media='all'>
|
56
|
+
/* style: toc */
|
57
|
+
.man-navigation {display:block !important;position:fixed;top:0;left:113ex;height:100%;width:100%;padding:48px 0 0 0;border-left:1px solid #dbdbdb;background:#eee}
|
58
|
+
.man-navigation a,.man-navigation a:hover,.man-navigation a:link,.man-navigation a:visited {display:block;margin:0;padding:5px 2px 5px 30px;color:#999;text-decoration:none}
|
59
|
+
.man-navigation a:hover {color:#111;text-decoration:underline}
|
60
|
+
</style>
|
61
|
+
</head>
|
62
|
+
<!--
|
63
|
+
The following styles are deprecated and will be removed at some point:
|
64
|
+
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
|
65
|
+
|
66
|
+
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
|
67
|
+
.man-navigation should be used instead.
|
68
|
+
-->
|
69
|
+
<body id='manpage'>
|
70
|
+
<div class='mp' id='man'>
|
71
|
+
|
72
|
+
<div class='man-navigation' style='display:none'>
|
73
|
+
<a href="#NAME">NAME</a>
|
74
|
+
<a href="#SYNOPSIS">SYNOPSIS</a>
|
75
|
+
<a href="#DESCRIPTION">DESCRIPTION</a>
|
76
|
+
<a href="#OPTIONS">OPTIONS</a>
|
77
|
+
<a href="#EXAMPLES">EXAMPLES</a>
|
78
|
+
<a href="#BUGS">BUGS</a>
|
79
|
+
<a href="#AUTHORS">AUTHORS</a>
|
80
|
+
</div>
|
81
|
+
|
82
|
+
<ol class='man-decor man-head man head'>
|
83
|
+
<li class='tl'>snooper(1)</li>
|
84
|
+
<li class='tc'></li>
|
85
|
+
<li class='tr'>snooper(1)</li>
|
86
|
+
</ol>
|
87
|
+
|
88
|
+
<h2 id="NAME">NAME</h2>
|
89
|
+
<p class="man-name">
|
90
|
+
<code>snooper</code> - <span class="man-whatis">Spy on Tests</span>
|
91
|
+
</p>
|
92
|
+
|
93
|
+
<h2 id="SYNOPSIS">SYNOPSIS</h2>
|
94
|
+
|
95
|
+
<p><code>snooper</code> <var>options</var> [<var>command_line</var>]*</p>
|
96
|
+
|
97
|
+
<h2 id="DESCRIPTION">DESCRIPTION</h2>
|
98
|
+
|
99
|
+
<p><strong>Snooper</strong> is a lightweight test automation tool, it monitors files and
|
100
|
+
folders while you work and re-runs your tests when you change something.
|
101
|
+
Snooper doesn't care what language you're using or what framework you are
|
102
|
+
testing with, it's all configureable.</p>
|
103
|
+
|
104
|
+
<h2 id="OPTIONS">OPTIONS</h2>
|
105
|
+
|
106
|
+
<p>Most configuration takes place in the <a class="man-ref" href="snooper-config.7.html">snooper-config<span class="s">(7)</span></a> file. You can however
|
107
|
+
override the command that is run. This is useful if you are only working on a
|
108
|
+
subsection of a project that has it's own tests.</p>
|
109
|
+
|
110
|
+
<dl>
|
111
|
+
<dt><code>-c</code>, <code>--config</code> <var>configfile</var></dt><dd><p>Specify the configuration file to use. The default is <code>.snooper.yaml</code> in the
|
112
|
+
current directory.</p></dd>
|
113
|
+
<dt><var>command_line</var></dt><dd><p>One or more <var>command_line</var>s to execute when source files change. Overides any
|
114
|
+
commands specified in the configuration file.</p></dd>
|
115
|
+
</dl>
|
116
|
+
|
117
|
+
|
118
|
+
<h2 id="EXAMPLES">EXAMPLES</h2>
|
119
|
+
|
120
|
+
<p><code>$ snooper</code></p>
|
121
|
+
|
122
|
+
<p>To run snooper in the current directory, configured by the <code>.snooper.yaml</code> file.</p>
|
123
|
+
|
124
|
+
<p><code>$ snooper --config snooperrc "echo Hello World!"</code></p>
|
125
|
+
|
126
|
+
<p>To snooper using the cofiguration in <var>snooperrc</var> executing <code>echo Hello World!</code>
|
127
|
+
when files change.</p>
|
128
|
+
|
129
|
+
<h2 id="BUGS">BUGS</h2>
|
130
|
+
|
131
|
+
<p><strong>Snooper</strong> does not yet load the configuration file.</p>
|
132
|
+
|
133
|
+
<h2 id="AUTHORS">AUTHORS</h2>
|
134
|
+
|
135
|
+
<p>Will Speak (@willspeak)</p>
|
136
|
+
|
137
|
+
|
138
|
+
<ol class='man-decor man-foot man foot'>
|
139
|
+
<li class='tl'></li>
|
140
|
+
<li class='tc'>March 2013</li>
|
141
|
+
<li class='tr'>snooper(1)</li>
|
142
|
+
</ol>
|
143
|
+
|
144
|
+
</div>
|
145
|
+
</body>
|
146
|
+
</html>
|
data/man/snooper.1.ronn
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
snooper(1) -- Spy on Tests
|
2
|
+
==========================
|
3
|
+
|
4
|
+
## SYNOPSIS
|
5
|
+
|
6
|
+
`snooper` <options> [<command_line>]*
|
7
|
+
|
8
|
+
## DESCRIPTION
|
9
|
+
|
10
|
+
**Snooper** is a lightweight test automation tool, it monitors files and
|
11
|
+
folders while you work and re-runs your tests when you change something.
|
12
|
+
Snooper doesn't care what language you're using or what framework you are
|
13
|
+
testing with, it's all configureable.
|
14
|
+
|
15
|
+
## OPTIONS
|
16
|
+
|
17
|
+
Most configuration takes place in the snooper-config(7) file. You can however
|
18
|
+
override the command that is run. This is useful if you are only working on a
|
19
|
+
subsection of a project that has it's own tests.
|
20
|
+
|
21
|
+
* `-c`, `--config` <configfile>:
|
22
|
+
Specify the configuration file to use. The default is `.snooper.yaml` in the
|
23
|
+
current directory.
|
24
|
+
|
25
|
+
* <command_line>:
|
26
|
+
One or more <command_line>s to execute when source files change. Overides any
|
27
|
+
commands specified in the configuration file.
|
28
|
+
|
29
|
+
## EXAMPLES
|
30
|
+
|
31
|
+
`$ snooper`
|
32
|
+
|
33
|
+
To run snooper in the current directory, configured by the `.snooper.yaml` file.
|
34
|
+
|
35
|
+
`$ snooper --config snooperrc "echo Hello World!"`
|
36
|
+
|
37
|
+
To snooper using the cofiguration in <snooperrc> executing `echo Hello World!`
|
38
|
+
when files change.
|
39
|
+
|
40
|
+
## BUGS
|
41
|
+
|
42
|
+
**Snooper** does not yet load the configuration file.
|
43
|
+
|
44
|
+
## AUTHORS
|
45
|
+
|
46
|
+
Will Speak (@willspeak)
|
47
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: snooper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Will Speak
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colored
|
@@ -52,23 +52,50 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: ronn
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.7.3
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.7.3
|
55
69
|
description: A simple language and test system agnostic continuous test runner.
|
56
70
|
email: lithiumflame@gmail.com
|
57
71
|
executables:
|
58
72
|
- snooper
|
59
73
|
extensions: []
|
60
|
-
extra_rdoc_files:
|
74
|
+
extra_rdoc_files:
|
75
|
+
- man/snooper-config.7.ronn
|
76
|
+
- man/snooper.1.ronn
|
77
|
+
- LICENCE.md
|
78
|
+
- README.md
|
61
79
|
files:
|
62
|
-
- lib/snooper.rb
|
63
80
|
- lib/snooper/snoop.rb
|
81
|
+
- lib/snooper.rb
|
64
82
|
- bin/snooper
|
83
|
+
- man/snooper-config.7
|
84
|
+
- man/snooper-config.7.html
|
85
|
+
- man/snooper-config.7.ronn
|
86
|
+
- man/snooper.1
|
87
|
+
- man/snooper.1.html
|
88
|
+
- man/snooper.1.ronn
|
65
89
|
- LICENCE.md
|
90
|
+
- README.md
|
66
91
|
homepage: http://github.com/iwillspeak/snooper
|
67
92
|
licenses:
|
68
93
|
- Snooper is Open Source! See the LICENCE.md for more information.
|
69
94
|
metadata: {}
|
70
95
|
post_install_message:
|
71
|
-
rdoc_options:
|
96
|
+
rdoc_options:
|
97
|
+
- --main
|
98
|
+
- README.md
|
72
99
|
require_paths:
|
73
100
|
- lib
|
74
101
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -88,3 +115,4 @@ signing_key:
|
|
88
115
|
specification_version: 4
|
89
116
|
summary: Spying on Tests
|
90
117
|
test_files: []
|
118
|
+
has_rdoc:
|