syc-spector 0.0.1
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/README +17 -0
- data/bin/sycspector +7 -0
- data/doc/Inspector/Console.html +256 -0
- data/doc/Inspector/Options.html +301 -0
- data/doc/Inspector/Runner.html +239 -0
- data/doc/Inspector/Separator.html +456 -0
- data/doc/Inspector.html +157 -0
- data/doc/Object.html +165 -0
- data/doc/README.html +119 -0
- data/doc/TestConsole.html +143 -0
- data/doc/TestOptions.html +246 -0
- data/doc/TestSeparator.html +270 -0
- data/doc/created.rid +11 -0
- data/doc/images/add.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +94 -0
- data/doc/js/darkfish.js +153 -0
- data/doc/js/jquery.js +18 -0
- data/doc/js/navigation.js +142 -0
- data/doc/js/search.js +94 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/searcher.js +228 -0
- data/doc/rdoc.css +543 -0
- data/doc/table_of_contents.html +109 -0
- data/lib/inspector/console.rb +60 -0
- data/lib/inspector/options.rb +212 -0
- data/lib/inspector/pattern.rb +11 -0
- data/lib/inspector/runner.rb +31 -0
- data/lib/inspector/separator.rb +182 -0
- data/sycspector.gemspec +18 -0
- data/test/test_console.rb +26 -0
- data/test/test_options.rb +115 -0
- data/test/test_separator.rb +118 -0
- metadata +140 -0
@@ -0,0 +1,212 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'io/wait'
|
3
|
+
|
4
|
+
require_relative 'pattern.rb'
|
5
|
+
|
6
|
+
# Module Inspector contains the functions related to the command line parsing.
|
7
|
+
# Provides the parsed user input in the options hash.
|
8
|
+
module Inspector
|
9
|
+
|
10
|
+
# Parses the provided command line flags, switches and arguments
|
11
|
+
class Options
|
12
|
+
# Options hold all the parameters used by the application
|
13
|
+
attr_reader :options
|
14
|
+
|
15
|
+
# Initializes Options and parses the provided user input from the command
|
16
|
+
# line
|
17
|
+
def initialize(argv)
|
18
|
+
parse(argv)
|
19
|
+
end
|
20
|
+
|
21
|
+
# After running the application output files are saved in the history.
|
22
|
+
# --get_file_from_history-- retrieves the valid or invalid file from the
|
23
|
+
# last application invokation. Where type is eather +valid+ or +invalid+.
|
24
|
+
#
|
25
|
+
# :call-seq:
|
26
|
+
# get_file_from_history(type)
|
27
|
+
def get_file_from_history(type)
|
28
|
+
pattern = Regexp.new('_'+type.to_s)
|
29
|
+
File.open(".sycspector.data", 'r') do |file|
|
30
|
+
while name = file.gets.chop
|
31
|
+
return name unless name.scan(pattern).empty?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Save the results of the last run of the application to +.sycspector.data+.
|
37
|
+
# It contains the valid and invalid file as well as the pattern.
|
38
|
+
def save_result_files(opts)
|
39
|
+
File.open(".sycspector.data", 'w') do |file|
|
40
|
+
file.puts opts[:valid_file]
|
41
|
+
file.puts opts[:invalid_file]
|
42
|
+
file.puts opts[:pattern].to_s
|
43
|
+
file.puts opts[:scan_pattern].to_s
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
# Creates the output files valid and invalid files based on the input file's
|
50
|
+
# name. If the filename already exists it is copied with a new timestamp.
|
51
|
+
#
|
52
|
+
# :call-seq:
|
53
|
+
# create_output_files(filename)
|
54
|
+
def create_output_files(filename)
|
55
|
+
timestamp = Time.now.strftime("%Y%m%d-%H%M%S")
|
56
|
+
if filename =~ /\d{8}-\d{6}/
|
57
|
+
`cp #{filename} #{filename.sub(/\d{8}-\d{6}/, timestamp)}`
|
58
|
+
filename.slice!(/\d{8}-\d{6}_(valid|invalid)_/)
|
59
|
+
end
|
60
|
+
files = {valid_file: "#{timestamp}_valid_#{filename}",
|
61
|
+
invalid_file: "#{timestamp}_invalid_#{filename}"}
|
62
|
+
end
|
63
|
+
|
64
|
+
# Parses the provided arguments and stores the value in @options
|
65
|
+
#
|
66
|
+
# :call-seq:
|
67
|
+
# parse(argv)
|
68
|
+
def parse(argv)
|
69
|
+
@options = {}
|
70
|
+
OptionParser.new do |opts|
|
71
|
+
opts.banner = "Usage: sycspector input_file [ options ]"
|
72
|
+
|
73
|
+
# create a switch
|
74
|
+
|
75
|
+
@options[:individualize] = false
|
76
|
+
opts.on("-i", "--individualize",
|
77
|
+
"Remove duplicate values") do
|
78
|
+
@options[:individualize] = true
|
79
|
+
end
|
80
|
+
|
81
|
+
@options[:sort] = false
|
82
|
+
opts.on("-s", "--sort",
|
83
|
+
"Sort values") do
|
84
|
+
@options[:sort] = true
|
85
|
+
end
|
86
|
+
|
87
|
+
@options[:fix] = false
|
88
|
+
opts.on("-f", "--fix",
|
89
|
+
"prompt invalid values for fixing") do
|
90
|
+
@options[:fix] = true
|
91
|
+
end
|
92
|
+
|
93
|
+
@options[:mode] = 'w'
|
94
|
+
opts.on("-a", "--append",
|
95
|
+
"Append values to output file OUTFILE") do
|
96
|
+
@options[:mode] = 'a'
|
97
|
+
end
|
98
|
+
|
99
|
+
# Create a flag
|
100
|
+
|
101
|
+
@options[:pattern] = /\A.*\Z/
|
102
|
+
@options[:scan_pattern] = /\A.*\Z/
|
103
|
+
|
104
|
+
opts.on("-p", "--pattern PATTERN",
|
105
|
+
"Values that match the pattern are",
|
106
|
+
"considered as valid values.",
|
107
|
+
"Default matches all.",
|
108
|
+
"'sycspector' -p email matches emails") do |pattern|
|
109
|
+
if pattern == 'email'
|
110
|
+
@options[:pattern] = EMAIL_PATTERN
|
111
|
+
@options[:scan_pattern] = ANY_EMAIL_PATTERN
|
112
|
+
else
|
113
|
+
@options[:pattern] = Regexp.new(pattern)
|
114
|
+
scan_pattern = pattern.match(FULL_LINE).to_s
|
115
|
+
puts "'#{scan_pattern}' '#{pattern}'"
|
116
|
+
pattern = scan_pattern unless scan_pattern.empty?
|
117
|
+
@options[:scan_pattern] = Regexp.new(pattern)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
@options[:delimiter] = ";"
|
122
|
+
opts.on("-d", "--delimiter DELIMITER", String,
|
123
|
+
"Delimiter between values.",
|
124
|
+
"Default delimiter is ';'") do |delimiter|
|
125
|
+
@options[:delimiter] = delimiter || ";"
|
126
|
+
end
|
127
|
+
|
128
|
+
opts.on("-o", "--output OUTFILE", String,
|
129
|
+
"File name as basis for creation of valid",
|
130
|
+
"and invalid file name.",
|
131
|
+
"default '<timestamp>_valid_values,",
|
132
|
+
"<timestamp>_invalid_values'",
|
133
|
+
"where <timestamp> = 'YYmmDD-HHMMSS'") do |outfile|
|
134
|
+
|
135
|
+
files = create_output_files outfile
|
136
|
+
@options[:valid_file] = files[:valid_file]
|
137
|
+
@options[:invalid_file] = files[:invalid_file]
|
138
|
+
end
|
139
|
+
|
140
|
+
opts.on("--show [valid|invalid]", [:valid, :invalid],
|
141
|
+
"Show the last valid or invalid file",
|
142
|
+
"Default is valid") do |show|
|
143
|
+
@options[:show] = show || :valid
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
opts.on("-h", "--help", "Show this message") do
|
148
|
+
puts opts
|
149
|
+
exit(0)
|
150
|
+
end
|
151
|
+
|
152
|
+
begin
|
153
|
+
argv << "-h" if argv.empty?
|
154
|
+
opts.parse!(argv)
|
155
|
+
|
156
|
+
rescue OptionParser::ParseError => e
|
157
|
+
STDERR.puts e.message, "\n", opts
|
158
|
+
exit(-1)
|
159
|
+
end
|
160
|
+
|
161
|
+
if @options[:fix] and argv.empty?
|
162
|
+
|
163
|
+
files = {}
|
164
|
+
if File.exist?(".sycspector.data")
|
165
|
+
File.open(".sycspector.data", 'r') do |file|
|
166
|
+
files = create_output_files file.gets.chomp
|
167
|
+
argv << file.gets.chomp
|
168
|
+
@options[:pattern] = Regexp.new(file.gets.chomp)
|
169
|
+
@options[:scan_pattern] = Regexp.new(file.gets.chomp)
|
170
|
+
end
|
171
|
+
else
|
172
|
+
STDERR.puts "--> no sycspector history.\n" +
|
173
|
+
" You first have to run sycspector FILENAME"
|
174
|
+
exit(-1)
|
175
|
+
end
|
176
|
+
|
177
|
+
unless files.empty?
|
178
|
+
@options[:valid_file] = files[:valid_file]
|
179
|
+
@options[:invalid_file] = files[:invalid_file]
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
if @options[:show] and argv.empty?
|
185
|
+
unless File.exist?(".sycspector.data")
|
186
|
+
STDERR.puts "--> no sycspector history." +
|
187
|
+
" You first have to run 'sycspector FILENAME'"
|
188
|
+
exit(-1)
|
189
|
+
end
|
190
|
+
else
|
191
|
+
@options[:infile] = argv.shift
|
192
|
+
|
193
|
+
if @options[:infile].nil?
|
194
|
+
STDERR.puts "--> missing input file"
|
195
|
+
exit(-1)
|
196
|
+
end
|
197
|
+
|
198
|
+
unless File.exist?(@options[:infile])
|
199
|
+
STDERR.puts "--> infile '#{@options[:infile]}' does not exist"
|
200
|
+
exit(-1)
|
201
|
+
end
|
202
|
+
|
203
|
+
if @options[:valid_file].nil? or @options[:invalid_file].nil?
|
204
|
+
files = create_output_files "values"
|
205
|
+
@options[:valid_file] = files[:valid_file]
|
206
|
+
@options[:invalid_file] = files[:invalid_file]
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Pattern that relizes emails. Matches whole lines only
|
4
|
+
EMAIL_PATTERN = /\A[\w!#\$%&'*+\/=?`{|}~^-]+(?:\.[\w!#\$%&'*+\/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,6}\Z/
|
5
|
+
|
6
|
+
# Pattern that relizes an email within a line.
|
7
|
+
ANY_EMAIL_PATTERN = /[\w!#\$%&'*+\/=?`{|}~^-]+(?:\.[\w!#\$%&'*+\/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,6}/
|
8
|
+
|
9
|
+
# Pattern that relizes strings between \A and \Z that is beginning of line and
|
10
|
+
# end of line patterns.
|
11
|
+
FULL_LINE = /(?<=\\A).*(?=\\Z)/
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'options'
|
2
|
+
require_relative 'separator'
|
3
|
+
|
4
|
+
# Module Inspector contains functions related to running the application
|
5
|
+
module Inspector
|
6
|
+
# Processes based on the provided command line arguments the scan of the
|
7
|
+
# file or shows the last processed files.
|
8
|
+
class Runner
|
9
|
+
|
10
|
+
# Initializes runner and invokes Options with the command line arguments
|
11
|
+
# provided
|
12
|
+
def initialize(argv)
|
13
|
+
@options = Options.new(argv)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Runs the Separator or shows the requested valid or invalid file. To show
|
17
|
+
# the file 'less' is used.
|
18
|
+
def run
|
19
|
+
opts = @options.options
|
20
|
+
if opts[:infile]
|
21
|
+
separator = Separator.new
|
22
|
+
separator.process(opts)
|
23
|
+
separator.print_statistics(opts)
|
24
|
+
@options.save_result_files opts
|
25
|
+
end
|
26
|
+
if show = opts[:show]
|
27
|
+
system "less #{@options.get_file_from_history show}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
require_relative 'console'
|
2
|
+
|
3
|
+
# This module encapsulates functionality related to scanning values for
|
4
|
+
# patterns. If a line contains the pattern that line is added to valid files.
|
5
|
+
# If the pattern is not found in the line the line is added to invalid files.
|
6
|
+
# Lines can if requested to be fixed. The line is presented to the user and the
|
7
|
+
# user can eather fix the value by typing the corrected value. Other
|
8
|
+
# possibilities are to drop the line, scan the line or just considering the
|
9
|
+
# line as valid so it is added to valid values.
|
10
|
+
module Inspector
|
11
|
+
|
12
|
+
# The Separator scans the input file for a provided pattern and prints the
|
13
|
+
# results of the scan to the console.
|
14
|
+
class Separator
|
15
|
+
# The prompt string is presented to the user when values are requested to
|
16
|
+
# be fixed. (v)alid will add the value to the valid values without testing
|
17
|
+
# against the pattern. (i)nvalid adds the value to the invalid values.
|
18
|
+
# (d)rop discards the value, (s)can scans the line to look for the pattern.
|
19
|
+
# (f)ix allows to type the corrected value.
|
20
|
+
PROMPT_STRING = "-> (v)alid (i)nvalid (d)rop (s)can (f)ix: "
|
21
|
+
|
22
|
+
# Initializes the Separator and creating a Console object
|
23
|
+
def initialize
|
24
|
+
@console = Console.new
|
25
|
+
end
|
26
|
+
|
27
|
+
# Prints the results of the invokation of Separator.process
|
28
|
+
#
|
29
|
+
# :call-seq:
|
30
|
+
# print_statistics(opts)
|
31
|
+
def print_statistics(opts)
|
32
|
+
puts "-> statistics"
|
33
|
+
puts " ----------"
|
34
|
+
printf("%7s: %4d\n%7s: %4d\n%7s: %4d\n%7s: %4d\n%7s: %4d\n",
|
35
|
+
" total", opts[:valid_counter] +
|
36
|
+
opts[:invalid_counter] +
|
37
|
+
opts[:skip_counter] +
|
38
|
+
opts[:double_counter],
|
39
|
+
" valid", opts[:valid_counter],
|
40
|
+
" invalid", opts[:invalid_counter],
|
41
|
+
" drop", opts[:skip_counter],
|
42
|
+
" double", opts[:double_counter])
|
43
|
+
puts
|
44
|
+
puts "-> pattern: #{opts[:pattern].inspect}"
|
45
|
+
puts "-> scan pattern: #{opts[:scan_pattern].inspect}"
|
46
|
+
puts
|
47
|
+
puts "-> files operated on"
|
48
|
+
puts " -----------------"
|
49
|
+
puts " values read from: #{opts[:infile]}"
|
50
|
+
puts " valid values written to: #{opts[:valid_file]}"
|
51
|
+
puts " invalid values written to: #{opts[:invalid_file]}"
|
52
|
+
if opts[:note]
|
53
|
+
puts
|
54
|
+
puts "-> Note"
|
55
|
+
puts " ----"
|
56
|
+
puts opts[:note]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Prompts the PROMPT_STRING and tests the value against the pattern
|
61
|
+
#
|
62
|
+
# :call-seq:
|
63
|
+
# fix(value, pattern) -> hash
|
64
|
+
#
|
65
|
+
# Return a hash with :value and :answer where :value contains the fixed
|
66
|
+
# value and the answer. To test whether the value is valid or invalid the
|
67
|
+
# :answer has to checked first.
|
68
|
+
def fix(value, pattern)
|
69
|
+
choice = value
|
70
|
+
result = {}
|
71
|
+
|
72
|
+
while not pattern.match(choice)
|
73
|
+
puts "-> #{choice}?"
|
74
|
+
result[:answer] = @console.prompt PROMPT_STRING
|
75
|
+
case result[:answer]
|
76
|
+
when 'v'
|
77
|
+
result[:value] = choice
|
78
|
+
break
|
79
|
+
when 'i'
|
80
|
+
result[:value] = choice
|
81
|
+
break
|
82
|
+
when 'f'
|
83
|
+
print "-> fix: "
|
84
|
+
choice = gets.chomp
|
85
|
+
print "-> confirm "
|
86
|
+
redo
|
87
|
+
when 'd'
|
88
|
+
result[:value] = value
|
89
|
+
break
|
90
|
+
when 's'
|
91
|
+
result[:value] = value
|
92
|
+
break
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
return result
|
97
|
+
end
|
98
|
+
|
99
|
+
# Processes the scan of the lines of the file and add the values eather to
|
100
|
+
# the valid or invalid values. The result of the scan will be added to the
|
101
|
+
# opts.
|
102
|
+
#
|
103
|
+
# :call-seq:
|
104
|
+
# process(opts)
|
105
|
+
def process(opts)
|
106
|
+
valid_file = File.open(opts[:valid_file], opts[:mode])
|
107
|
+
valid_values = []
|
108
|
+
|
109
|
+
invalid_file = File.open(opts[:invalid_file], 'w')
|
110
|
+
invalid_values = []
|
111
|
+
|
112
|
+
skip_counter = 0
|
113
|
+
|
114
|
+
File.open(opts[:infile], 'r') do |file|
|
115
|
+
while line = file.gets
|
116
|
+
line.chomp.split(opts[:delimiter]).each do |value|
|
117
|
+
|
118
|
+
match = value.match(opts[:pattern])
|
119
|
+
|
120
|
+
if match.nil?
|
121
|
+
if opts[:fix]
|
122
|
+
result = fix value, opts[:pattern]
|
123
|
+
case result[:answer]
|
124
|
+
when 'v'
|
125
|
+
valid_values << result[:value]
|
126
|
+
when 'i'
|
127
|
+
invalid_values << result[:value]
|
128
|
+
when 'd'
|
129
|
+
skip_counter += 1
|
130
|
+
when 's'
|
131
|
+
value.scan(opts[:scan_pattern]).each do |value|
|
132
|
+
valid_values << value
|
133
|
+
end
|
134
|
+
end
|
135
|
+
else
|
136
|
+
invalid_values << value
|
137
|
+
end
|
138
|
+
else
|
139
|
+
valid_values << match
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
valid_counter = valid_values.size
|
146
|
+
|
147
|
+
valid_values.uniq! {|value| value.downcase } if opts[:individualize]
|
148
|
+
valid_values.sort! if opts[:sort]
|
149
|
+
|
150
|
+
valid_values.each do |value|
|
151
|
+
valid_file.puts value
|
152
|
+
end
|
153
|
+
|
154
|
+
invalid_counter = invalid_values.size
|
155
|
+
|
156
|
+
invalid_values.uniq! {|value| value.downcase} if opts[:individualize]
|
157
|
+
invalid_values.sort! if opts[:sort]
|
158
|
+
|
159
|
+
invalid_values.each do |value|
|
160
|
+
invalid_file.puts value
|
161
|
+
end
|
162
|
+
|
163
|
+
valid_file.close
|
164
|
+
invalid_file.close
|
165
|
+
|
166
|
+
double_counter = valid_counter - valid_values.size +
|
167
|
+
invalid_counter - invalid_values.size
|
168
|
+
|
169
|
+
opts[:valid_counter] = valid_values.size
|
170
|
+
opts[:invalid_counter] = invalid_values.size
|
171
|
+
opts[:skip_counter] = skip_counter
|
172
|
+
opts[:double_counter] = double_counter
|
173
|
+
if (invalid_values.size > 0 and not opts[:fix])
|
174
|
+
opts[:note] = " You can fix invalid values and append " +
|
175
|
+
"to valid with: $ sycspector -fa"
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
data/sycspector.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "syc-spector"
|
3
|
+
s.summary =
|
4
|
+
"Analyze a file and extract values matching a provided pattern.\n \
|
5
|
+
Allow to sort, remove double and manually fix values."
|
6
|
+
s.description = File.read(File.join(File.dirname(__FILE__), 'README'))
|
7
|
+
s.requirements = ['No requirements']
|
8
|
+
s.version = "0.0.1"
|
9
|
+
s.author = "Pierre Sugar"
|
10
|
+
s.email = "pierre@sugaryourcoffee.de"
|
11
|
+
s.homepage = "http://syc.dyndns.org/drupal"
|
12
|
+
s.platform = Gem::Platform::RUBY
|
13
|
+
s.required_ruby_version = '>=1.9'
|
14
|
+
s.files = Dir['**/**']
|
15
|
+
s.executables = ['sycspector']
|
16
|
+
s.test_files = Dir['test/test*.rb']
|
17
|
+
s.has_rdoc = true
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'shoulda'
|
3
|
+
require_relative '../lib/inspector/console'
|
4
|
+
|
5
|
+
# Tests the Console class
|
6
|
+
class TestConsole < Test::Unit::TestCase
|
7
|
+
|
8
|
+
context "console" do
|
9
|
+
should "return value from prompt string" do
|
10
|
+
console = Inspector::Console.new
|
11
|
+
result = console.prompt "(v)alid, (i)nvalid, (d)rop, (s)can, (f)ix: "
|
12
|
+
choices = %w(v i d s f)
|
13
|
+
assert choices.index(result) >= 0
|
14
|
+
end
|
15
|
+
|
16
|
+
should "exit with code 0" do
|
17
|
+
console = Inspector::Console.new
|
18
|
+
begin
|
19
|
+
result = console.prompt "No choices are available. To end press Ctrl-c:"
|
20
|
+
rescue SystemExit => e
|
21
|
+
assert e.status == 0
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'shoulda'
|
3
|
+
require_relative '../lib/inspector/options'
|
4
|
+
require_relative '../lib/inspector/pattern'
|
5
|
+
|
6
|
+
# Test of the Options class
|
7
|
+
class TestOptions < Test::Unit::TestCase
|
8
|
+
|
9
|
+
context "specifying an inputfile that does not exist" do
|
10
|
+
should "exit with -1" do
|
11
|
+
begin
|
12
|
+
opts = Inspector::Options.new(["inputfile"])
|
13
|
+
rescue SystemExit => e
|
14
|
+
assert e.status == -1
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "specifying no input file" do
|
20
|
+
should "exit with -1" do
|
21
|
+
begin
|
22
|
+
opts = Inspector::Options.new([])
|
23
|
+
rescue SystemExit => e
|
24
|
+
assert e.status == 0
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "specifying an inputfile that exists" do
|
30
|
+
|
31
|
+
# Intializes the input, valid, invalid and history file
|
32
|
+
def setup
|
33
|
+
puts "in startup"
|
34
|
+
File.open('existing', 'w') do |file|
|
35
|
+
file.puts "pierre@thesugars.de"
|
36
|
+
file.puts "amanda@thesugars.de und pierre@thesugars.de"
|
37
|
+
end
|
38
|
+
File.open('.sycspector.data', 'w') do |file|
|
39
|
+
file.puts "20130113-121212_valid_values"
|
40
|
+
file.puts "20130113-121212_invalid_values"
|
41
|
+
file.puts "(?-mix:\A[\w!#\$%&'*+\/=?`{|}~^-]+" +
|
42
|
+
"(?:\.[\w!#\$%&'*+\/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\.)+" +
|
43
|
+
"[a-zA-Z]{2,6}\Z)"
|
44
|
+
file.puts "(?-mix:[\w!#\$%&'*+\/=?`{|}~^-]+" +
|
45
|
+
"(?:\.[\w!#\$%&'*+\/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\.)+" +
|
46
|
+
"[a-zA-Z]{2,6})"
|
47
|
+
end
|
48
|
+
File.open('20130113-121212_valid_values', 'w') do |file|
|
49
|
+
file.puts "pierre@thesugars.de"
|
50
|
+
file.puts "amanda@thesugars.de"
|
51
|
+
file.puts "pierre@thesugars.de"
|
52
|
+
end
|
53
|
+
File.open('20130113-121212_invalid_values', 'w') do |file|
|
54
|
+
file.puts "amanda@thesugars und pierre@thesugars"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Cleans up the test directory by deleting the files created in setup
|
59
|
+
def teardown
|
60
|
+
puts "in shutdown"
|
61
|
+
`rm existing`
|
62
|
+
`rm 20130113-*`
|
63
|
+
`rm .sycspector.data`
|
64
|
+
end
|
65
|
+
|
66
|
+
should "return inputfile" do
|
67
|
+
opts = Inspector::Options.new(["existing"])
|
68
|
+
assert_equal "existing", opts.options[:infile]
|
69
|
+
end
|
70
|
+
|
71
|
+
should "return email pattern" do
|
72
|
+
opts = Inspector::Options.new(["-p", "email", "existing"])
|
73
|
+
assert_equal EMAIL_PATTERN, opts.options[:pattern]
|
74
|
+
assert_equal ANY_EMAIL_PATTERN, opts.options[:scan_pattern]
|
75
|
+
end
|
76
|
+
|
77
|
+
should "return pattern and scan pattern" do
|
78
|
+
opts = Inspector::Options.new(["-p", "\\A\\w+.*\\d\\Z", "existing"])
|
79
|
+
assert_equal /\A\w+.*\d\Z/, opts.options[:pattern]
|
80
|
+
assert_equal /\w+.*\d/, opts.options[:scan_pattern]
|
81
|
+
end
|
82
|
+
|
83
|
+
should "return sort switch" do
|
84
|
+
opts = Inspector::Options.new(["-s", "existing"])
|
85
|
+
assert_equal true, opts.options[:sort]
|
86
|
+
end
|
87
|
+
|
88
|
+
should "return individualize switch" do
|
89
|
+
opts = Inspector::Options.new(["-i", "existing"])
|
90
|
+
assert_equal true, opts.options[:individualize]
|
91
|
+
end
|
92
|
+
|
93
|
+
should "return show :valid and infile nil" do
|
94
|
+
opts = Inspector::Options.new(["--show"])
|
95
|
+
assert_equal :valid, opts.options[:show]
|
96
|
+
assert_equal nil, opts.options[:infile]
|
97
|
+
opts = Inspector::Options.new(["--show", "valid"])
|
98
|
+
assert_equal nil, opts.options[:infile]
|
99
|
+
end
|
100
|
+
|
101
|
+
should "return show :invalid and infile nil" do
|
102
|
+
opts = Inspector::Options.new(["--show", "invalid"])
|
103
|
+
assert_equal :invalid, opts.options[:show]
|
104
|
+
assert_equal nil, opts.options[:infile]
|
105
|
+
end
|
106
|
+
|
107
|
+
should "return fix and invalid file as input file from last invokation" do
|
108
|
+
opts = Inspector::Options.new(["-f"])
|
109
|
+
assert_equal true, opts.options[:fix]
|
110
|
+
assert_equal "20130113-121212_invalid_values", opts.options[:infile]
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|