bulksearch 0.1.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/README.md +4 -0
- data/bin/bulksearch +51 -0
- data/lib/bulksearch.rb +7 -0
- data/lib/bulksearch/processor.rb +110 -0
- data/lib/bulksearch/version.rb +3 -0
- data/test/test_helper.rb +14 -0
- metadata +197 -0
data/README.md
ADDED
data/bin/bulksearch
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), '..', 'lib'))
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'bulksearch'
|
7
|
+
require 'yaml'
|
8
|
+
require 'commander/import'
|
9
|
+
require 'bossman'
|
10
|
+
require 'binged'
|
11
|
+
|
12
|
+
program :name, 'Bulk Search'
|
13
|
+
program :version, BulkSearch::VERSION
|
14
|
+
program :description, 'Bulk search via spreadsheet.'
|
15
|
+
|
16
|
+
default_command :process
|
17
|
+
|
18
|
+
|
19
|
+
################################################################################
|
20
|
+
# Processing
|
21
|
+
################################################################################
|
22
|
+
|
23
|
+
command :process do |c|
|
24
|
+
c.syntax = 'bulksearch process FILE'
|
25
|
+
c.description = 'Performs searches via Bing and/or Yahoo on cells in the spreadsheet.'
|
26
|
+
c.option('--bing', 'Uses the Bing API.')
|
27
|
+
c.option('--boss', 'Uses the Yahoo BOSS API.')
|
28
|
+
c.when_called do|args, options|
|
29
|
+
# Make sure a file is passed in.
|
30
|
+
file = args.first
|
31
|
+
abort('File required.') if file.nil?
|
32
|
+
|
33
|
+
# Make sure a provider is set.
|
34
|
+
abort("You must set either --bing or --boss.") if !options.bing && !options.boss
|
35
|
+
|
36
|
+
# Load configuration.
|
37
|
+
config_file = File.expand_path('~/.bulksearch')
|
38
|
+
abort('Missing config file (~/.bulksearch).') unless File.exists?(config_file)
|
39
|
+
config = YAML.load_file(config_file)
|
40
|
+
|
41
|
+
# Setup service keys.
|
42
|
+
Binged.account_key = config['bing_account_key']
|
43
|
+
BOSSMan.application_id = config['boss_app_id']
|
44
|
+
|
45
|
+
# Run processor.
|
46
|
+
processor = BulkSearch::Processor.new()
|
47
|
+
processor.providers << :bing if options.bing
|
48
|
+
processor.providers << :boss if options.boss
|
49
|
+
processor.process(file)
|
50
|
+
end
|
51
|
+
end
|
data/lib/bulksearch.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
class BulkSearch
|
2
|
+
# The processor fills in empty spreadsheet cells with results from Bing
|
3
|
+
# and/or Yahoo BOSS searches.
|
4
|
+
class Processor
|
5
|
+
############################################################################
|
6
|
+
#
|
7
|
+
# Constructor
|
8
|
+
#
|
9
|
+
############################################################################
|
10
|
+
|
11
|
+
def initialize(options={})
|
12
|
+
self.providers = options[:providers] || []
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
############################################################################
|
17
|
+
#
|
18
|
+
# Attributes
|
19
|
+
#
|
20
|
+
############################################################################
|
21
|
+
|
22
|
+
# A list of search providers to use with the processor (:bing, :boss).
|
23
|
+
attr_accessor :providers
|
24
|
+
|
25
|
+
|
26
|
+
############################################################################
|
27
|
+
#
|
28
|
+
# Methods
|
29
|
+
#
|
30
|
+
############################################################################
|
31
|
+
|
32
|
+
# Processes the file using the appropriate search services.
|
33
|
+
#
|
34
|
+
# @param [String] file The path to the spreadsheet to open.
|
35
|
+
def process(file)
|
36
|
+
file = File.expand_path(file)
|
37
|
+
|
38
|
+
# Setup clients.
|
39
|
+
bing_client = Binged::Client.new()
|
40
|
+
|
41
|
+
# Open the spreadsheet.
|
42
|
+
book = Spreadsheet.open(file)
|
43
|
+
sheet = book.worksheet(0)
|
44
|
+
|
45
|
+
# Read the headers.
|
46
|
+
headers = sheet.row(0).map { |cell| cell.to_s }
|
47
|
+
|
48
|
+
begin
|
49
|
+
# Loop over the remaining rows and
|
50
|
+
sheet.each(1) do |row|
|
51
|
+
# Determine base options.
|
52
|
+
options = {}
|
53
|
+
headers.each_with_index do |header, index|
|
54
|
+
case header
|
55
|
+
when 'TERMS' then options[:terms] = row[index].to_s
|
56
|
+
when 'SITE' then options[:site] = row[index].to_s
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Perform searches on the rest of the columns.
|
61
|
+
headers.each_with_index do |header, index|
|
62
|
+
next unless header.index(/^[A-Z]+$/).nil?
|
63
|
+
|
64
|
+
# Combine search terms.
|
65
|
+
terms = "#{options[:terms].to_s} #{header}"
|
66
|
+
|
67
|
+
# Only update the field if it's blank.
|
68
|
+
if row[index].to_s =~ /^\s*$/
|
69
|
+
# Process using Bing.
|
70
|
+
if providers.index(:bing)
|
71
|
+
puts "? #{terms} (#{options[:site]})"
|
72
|
+
search = bing_client.web.containing(terms)
|
73
|
+
search.from_site(options[:site]) unless options[:site].nil?
|
74
|
+
result = search.fetch.results[0..2].select {|result| URI.parse(result.url).path != '/' rescue false}.first
|
75
|
+
|
76
|
+
if !result.nil?
|
77
|
+
puts "#{result.url}\n\n"
|
78
|
+
row[index] = result.url
|
79
|
+
else
|
80
|
+
puts ""
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Process using Yahoo BOSS.
|
85
|
+
if providers.index(:boss)
|
86
|
+
puts "BOSS: #{terms}"
|
87
|
+
BOSSMan::Search.web(terms, :count => 1)
|
88
|
+
search = boss_client.web.containing(terms)
|
89
|
+
result = search.results.first
|
90
|
+
|
91
|
+
if !result.nil?
|
92
|
+
puts "#{result.url}\n\n"
|
93
|
+
row[index] = result.url
|
94
|
+
else
|
95
|
+
puts ""
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# If an error occurs, save off the file before exiting.
|
103
|
+
ensure
|
104
|
+
# Backup original file & write over original file.
|
105
|
+
FileUtils.mv(file, "#{File.dirname(file)}/.#{File.basename(file)}")
|
106
|
+
book.write(file)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'mocha'
|
4
|
+
require 'unindentable'
|
5
|
+
require 'bulksearch'
|
6
|
+
|
7
|
+
class MiniTest::Unit::TestCase
|
8
|
+
def assert_bytes exp, act, msg = nil
|
9
|
+
exp = exp.to_hex
|
10
|
+
act = act.string.to_hex
|
11
|
+
assert_equal(exp, act, msg)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
metadata
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bulksearch
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ben Johnson
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-01-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: commander
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 4.1.3
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 4.1.3
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: ruby-progressbar
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.0.2
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.0.2
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: spreadsheet
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.7.6
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.7.6
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: binged
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.1.0
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.1.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: bossman
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.4.1
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.4.1
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rake
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.9.2.2
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.9.2.2
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: minitest
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 3.5.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 3.5.0
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: mocha
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 0.12.5
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.12.5
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: unindentable
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 0.1.0
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 0.1.0
|
158
|
+
description:
|
159
|
+
email:
|
160
|
+
- benbjohnson@yahoo.com
|
161
|
+
executables:
|
162
|
+
- bulksearch
|
163
|
+
extensions: []
|
164
|
+
extra_rdoc_files: []
|
165
|
+
files:
|
166
|
+
- lib/bulksearch/processor.rb
|
167
|
+
- lib/bulksearch/version.rb
|
168
|
+
- lib/bulksearch.rb
|
169
|
+
- README.md
|
170
|
+
- test/test_helper.rb
|
171
|
+
- bin/bulksearch
|
172
|
+
homepage: http://github.com/benbjohnson/bulksearch
|
173
|
+
licenses: []
|
174
|
+
post_install_message:
|
175
|
+
rdoc_options: []
|
176
|
+
require_paths:
|
177
|
+
- lib
|
178
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
179
|
+
none: false
|
180
|
+
requirements:
|
181
|
+
- - ! '>='
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: '0'
|
184
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ! '>='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
190
|
+
requirements: []
|
191
|
+
rubyforge_project:
|
192
|
+
rubygems_version: 1.8.24
|
193
|
+
signing_key:
|
194
|
+
specification_version: 3
|
195
|
+
summary: Bulk search via spreadsheet.
|
196
|
+
test_files:
|
197
|
+
- test/test_helper.rb
|