hmcgowan-roo-tools 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +43 -0
- data/bin/oogrep +4 -0
- data/lib/roo-tools.rb +74 -0
- data/lib/roo-tools/grep.rb +129 -0
- metadata +79 -0
data/README
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
= OOGrep
|
2
|
+
|
3
|
+
Search multiple spreadsheets using roo. This means that you can search across Excel, Excelx, OpenOffice and Google Spreadsheets.
|
4
|
+
|
5
|
+
sage: oogrep.rb [options] searchstring targets
|
6
|
+
|
7
|
+
Options:
|
8
|
+
-l, --list-only List matching files only
|
9
|
+
-i, --case-insensitive Case insensitive search
|
10
|
+
-e, --exact-match Force exact match on cell contents
|
11
|
+
-f, --font STYLE Filter results by cell font style
|
12
|
+
--[no-]tabs Show/hide tabs in results
|
13
|
+
--[no-]cells Show/hide cells in results
|
14
|
+
-?, -h, --help Show this message.
|
15
|
+
|
16
|
+
== Options
|
17
|
+
|
18
|
+
* list-only
|
19
|
+
|
20
|
+
Only show the names of files that have a match
|
21
|
+
|
22
|
+
* case-insensitive
|
23
|
+
|
24
|
+
The searches are strict by default but you can make the search ignore case with this option
|
25
|
+
|
26
|
+
* exact-match
|
27
|
+
|
28
|
+
This option will force the search to only show results if the cell's text matches the search string verbatim
|
29
|
+
|
30
|
+
* font-style
|
31
|
+
|
32
|
+
You can filter the search results based on the font. Valid values include 'bold', 'italic', 'underline','normal' and 'ignore'. By default the results will ignore the font information. Also note
|
33
|
+
that tabs will be filtered out unless the font is 'normal' or 'ignore'.
|
34
|
+
|
35
|
+
Note that this feature requires the git version of roo if/until the patch to roo for fonts is integrated
|
36
|
+
|
37
|
+
* [no]-tabs
|
38
|
+
|
39
|
+
Show or hide tabs from the results using --tabs or --no-tabs
|
40
|
+
|
41
|
+
* [no]-cells
|
42
|
+
|
43
|
+
Show or hide cells from the results using --cells or --no-cells
|
data/bin/oogrep
ADDED
data/lib/roo-tools.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'roo'
|
2
|
+
require 'user-choices'
|
3
|
+
require 'roo-tools/grep'
|
4
|
+
|
5
|
+
module RooTools
|
6
|
+
|
7
|
+
class RooGrepRunner < UserChoices::Command
|
8
|
+
include UserChoices
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@seen = {}
|
12
|
+
@matches = 0
|
13
|
+
@matching_files = 0
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_sources(builder)
|
18
|
+
builder.add_source(CommandLineSource, :usage, "Usage: oogrep.rb [options] searchstring targets")
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_choices(builder)
|
22
|
+
builder.add_choice(:list_only, :type=>:boolean, :default=>false) do | command_line |
|
23
|
+
command_line.uses_option("-l", "--list-only", "List matching files only")
|
24
|
+
end
|
25
|
+
builder.add_choice(:case_insensitive, :type=>:boolean, :default=>false) do | command_line |
|
26
|
+
command_line.uses_option("-i", "--case-insensitive", "Case insensitive search")
|
27
|
+
end
|
28
|
+
builder.add_choice(:exact_match, :type=>:boolean, :default=>false) do | command_line |
|
29
|
+
command_line.uses_option("-e", "--exact-match", "Force exact match on cell contents")
|
30
|
+
end
|
31
|
+
builder.add_choice(:font, :type=>['bold','italic','underline','normal','ignore'], :default=>'ignore') do | command_line |
|
32
|
+
command_line.uses_option("-f", "--font STYLE", "Filter results by cell font style")
|
33
|
+
end
|
34
|
+
builder.add_choice(:tabs, :type=>:boolean, :default=>true) do | command_line |
|
35
|
+
command_line.uses_switch("--tabs", "Show/hide tabs in results")
|
36
|
+
end
|
37
|
+
builder.add_choice(:cells, :type=>:boolean, :default=>true) do | command_line |
|
38
|
+
command_line.uses_switch("--cells", "Show/hide cells in results")
|
39
|
+
end
|
40
|
+
builder.add_choice(:files) { |command_line |
|
41
|
+
command_line.uses_arglist
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def execute
|
46
|
+
if @user_choices[:help]
|
47
|
+
puts @user_choices[:usage]
|
48
|
+
exit 0
|
49
|
+
end
|
50
|
+
@user_choices[:searchstring] = @user_choices[:files].shift
|
51
|
+
puts
|
52
|
+
start_interrupt_handler
|
53
|
+
oogrep = Grep.new(@user_choices)
|
54
|
+
oogrep.process_files
|
55
|
+
unless @user_choices[:list_only]
|
56
|
+
puts "#{oogrep.matches} matches in #{oogrep.matching_files} file(s)"
|
57
|
+
end
|
58
|
+
return 0
|
59
|
+
end
|
60
|
+
|
61
|
+
def start_interrupt_handler
|
62
|
+
trap "SIGINT", proc { puts "\nUser Interrupt...exiting" ; exit 1}
|
63
|
+
end
|
64
|
+
private :start_interrupt_handler
|
65
|
+
|
66
|
+
def exit_gracefully
|
67
|
+
exit 0
|
68
|
+
end
|
69
|
+
private :exit_gracefully
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
@@ -0,0 +1,129 @@
|
|
1
|
+
module RooTools
|
2
|
+
|
3
|
+
class Grep
|
4
|
+
@@matches = 0
|
5
|
+
@@matching_files = 0
|
6
|
+
FilenameFormat = "%-76s"
|
7
|
+
MatchFormat = "%-31s %-8s %-35s "
|
8
|
+
def matches
|
9
|
+
@@matches
|
10
|
+
end
|
11
|
+
def matching_files
|
12
|
+
@@matching_files
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(opts)
|
16
|
+
@options = opts
|
17
|
+
@regex = create_regular_expression
|
18
|
+
@seen = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def process_files
|
22
|
+
@options[:files].each do |file|
|
23
|
+
if File.directory?(file)
|
24
|
+
Dir.glob(File.join(file.gsub('\\','/'),"**","*.xls")).each do |file|
|
25
|
+
execute(file)
|
26
|
+
end
|
27
|
+
else
|
28
|
+
execute(file)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def execute(file)
|
34
|
+
@file = file
|
35
|
+
@oo = open_spreadsheet(@file)
|
36
|
+
@oo.sheets.each do |sheet|
|
37
|
+
@oo.default_sheet = sheet
|
38
|
+
check_sheet_name
|
39
|
+
check_sheet_contents
|
40
|
+
return if @options[:list_only] && @seen[@file]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def open_spreadsheet(filename)
|
45
|
+
case File.extname(filename)
|
46
|
+
when '.xls'
|
47
|
+
Excel.new(filename)
|
48
|
+
when '.xlsx'
|
49
|
+
Excelx.new(filename)
|
50
|
+
when '.ods'
|
51
|
+
Openoffice.new(filename)
|
52
|
+
when ''
|
53
|
+
Google.new(filename)
|
54
|
+
else
|
55
|
+
raise ArgumentError, "Don't know how to handle spreadsheet #{filename}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def check_sheet_name
|
60
|
+
return unless @options[:tabs]
|
61
|
+
return unless @options[:font] == 'normal' || @options[:font] == 'ignore'
|
62
|
+
if @oo.default_sheet =~ @regex
|
63
|
+
report_match
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def check_sheet_contents
|
68
|
+
return unless @options[:cells]
|
69
|
+
return unless @oo.last_row && @oo.last_column
|
70
|
+
(1..@oo.last_row).each do |row|
|
71
|
+
(1..@oo.last_column).each do |col|
|
72
|
+
cell = @oo.cell(row,col)
|
73
|
+
cellname = GenericSpreadsheet.number_to_letter(col) + row.to_s
|
74
|
+
if cell =~ @regex
|
75
|
+
case @options[:font]
|
76
|
+
when 'ignore'
|
77
|
+
report_match cell, cellname
|
78
|
+
when 'normal'
|
79
|
+
if !@oo.font(row,col).bold? && !@oo.font(row,col).bold? && !@oo.font(row,col).italic?
|
80
|
+
report_match cell, cellname
|
81
|
+
end
|
82
|
+
else
|
83
|
+
if @oo.font(row,col).send "#{@options[:font]}?"
|
84
|
+
report_match cell, cellname
|
85
|
+
end
|
86
|
+
end
|
87
|
+
return if @options[:list_only] && @seen[@file]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def report_match(desc=nil, cellname=nil )
|
94
|
+
if desc && desc.length >= 35
|
95
|
+
desc = desc[0..32] + '...'
|
96
|
+
end
|
97
|
+
unless @seen[@file]
|
98
|
+
puts "\n" unless @options[:list_only]
|
99
|
+
puts sprintf(FilenameFormat, @file[0..74])
|
100
|
+
@seen[@file] = true
|
101
|
+
@@matching_files += 1
|
102
|
+
end
|
103
|
+
@@matches +=1
|
104
|
+
unless @options[:list_only]
|
105
|
+
if cellname
|
106
|
+
# This is a matching tab
|
107
|
+
puts sprintf(MatchFormat, @oo.default_sheet, cellname, desc)
|
108
|
+
else
|
109
|
+
# This is a matching tab
|
110
|
+
puts sprintf(MatchFormat, @oo.default_sheet, 'tabname', nil)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def create_regular_expression
|
116
|
+
str = @options[:searchstring]
|
117
|
+
if @options[:exact_match]
|
118
|
+
str = "\\s*\\A#{Regexp.escape(str)}\\Z\\s*"
|
119
|
+
end
|
120
|
+
if @options[:case_insensitive]
|
121
|
+
/#{str}/i
|
122
|
+
else
|
123
|
+
/#{str}/
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hmcgowan-roo-tools
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Hugh McGowan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-03-12 00:00:00 -07:00
|
13
|
+
default_executable: oogrep
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: roo
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.2.3
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: user-choices
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.1.6
|
34
|
+
version:
|
35
|
+
description: Tools using roo to performa actions on multiple spreadsheets
|
36
|
+
email: hugh_mcgowan@yahoo.com
|
37
|
+
executables:
|
38
|
+
- oogrep
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README
|
43
|
+
files:
|
44
|
+
- lib/roo-tools
|
45
|
+
- lib/roo-tools/grep.rb
|
46
|
+
- lib/roo-tools.rb
|
47
|
+
- bin/oogrep
|
48
|
+
- README
|
49
|
+
has_rdoc: true
|
50
|
+
homepage: ""
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options:
|
53
|
+
- --main
|
54
|
+
- README
|
55
|
+
- --inline-source
|
56
|
+
- --charset=UTF-8
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: "0"
|
64
|
+
version:
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: "0"
|
70
|
+
version:
|
71
|
+
requirements: []
|
72
|
+
|
73
|
+
rubyforge_project: roo-tools
|
74
|
+
rubygems_version: 1.2.0
|
75
|
+
signing_key:
|
76
|
+
specification_version: 2
|
77
|
+
summary: roo-tools
|
78
|
+
test_files: []
|
79
|
+
|