bulksearch 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ bulksearch
2
+ ==========
3
+
4
+ Bulk search via Excel.
@@ -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
@@ -0,0 +1,7 @@
1
+ require 'spreadsheet'
2
+
3
+ require 'bulksearch/processor'
4
+ require 'bulksearch/version'
5
+
6
+ class BulkSearch
7
+ end
@@ -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
@@ -0,0 +1,3 @@
1
+ class BulkSearch
2
+ VERSION = "0.1.0"
3
+ end
@@ -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