vuzitruby 1.2.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +3 -1
- data/bin/vuzitcl +65 -2
- data/lib/vuzitruby/base.rb +24 -7
- data/lib/vuzitruby/document.rb +71 -15
- data/lib/vuzitruby/service.rb +10 -3
- metadata +10 -5
data/README
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
This is a library that allows developers to directly access the Vuzit Web
|
6
6
|
Service API through a simple Ruby script:
|
7
7
|
|
8
|
-
http://vuzit.com/developer/
|
8
|
+
http://vuzit.com/developer/web_service_api
|
9
9
|
|
10
10
|
Below is a basic upload example:
|
11
11
|
|
@@ -95,6 +95,8 @@ Upload and View with the JavaScript API Example for a Rails RHTML file:
|
|
95
95
|
|
96
96
|
== LICENSE
|
97
97
|
|
98
|
+
Copyright (c) 2009-2010 Brent Matzelle, Vuzit LLC
|
99
|
+
|
98
100
|
Released under the MIT license:
|
99
101
|
|
100
102
|
http://www.opensource.org/licenses/mit-license.php
|
data/bin/vuzitcl
CHANGED
@@ -83,6 +83,8 @@ def help_command(args)
|
|
83
83
|
print_usage_delete
|
84
84
|
when "upload"
|
85
85
|
print_usage_upload
|
86
|
+
when "search"
|
87
|
+
print_usage_search
|
86
88
|
else
|
87
89
|
error("Unknown option: [#{command}]")
|
88
90
|
end
|
@@ -109,6 +111,51 @@ def load_command(args)
|
|
109
111
|
end
|
110
112
|
end
|
111
113
|
|
114
|
+
# Performs the search command.
|
115
|
+
def search_command(args)
|
116
|
+
return if !global_parameters_load(args)
|
117
|
+
|
118
|
+
options = Hash.new
|
119
|
+
opts = OptionParser.new do |opts|
|
120
|
+
opts.on("-q", "--query [QUERY]", "") do |value|
|
121
|
+
options[:query] = value
|
122
|
+
end
|
123
|
+
|
124
|
+
opts.on("-l", "--limit [LIMIT]", "") do |value|
|
125
|
+
options[:limit] = value
|
126
|
+
end
|
127
|
+
|
128
|
+
opts.on("-o", "--offset [OFFSET]", "") do |value|
|
129
|
+
options[:offset] = value
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
begin
|
134
|
+
opts.parse!(args)
|
135
|
+
rescue OptionParser::InvalidOption => e
|
136
|
+
e.recover(args)
|
137
|
+
end
|
138
|
+
|
139
|
+
begin
|
140
|
+
docs = Vuzit::Document.find_all(options)
|
141
|
+
|
142
|
+
docs.each do |doc|
|
143
|
+
puts "LOADED: #{doc.id}"
|
144
|
+
puts "title: #{doc.title}"
|
145
|
+
puts "subject: #{doc.subject}"
|
146
|
+
puts "pages: #{doc.page_count}"
|
147
|
+
puts "width: #{doc.page_width}"
|
148
|
+
puts "height: #{doc.page_height}"
|
149
|
+
puts "size: #{doc.file_size}"
|
150
|
+
puts "status: #{doc.status}"
|
151
|
+
puts "excerpt: #{doc.excerpt}"
|
152
|
+
puts ''
|
153
|
+
end
|
154
|
+
rescue Vuzit::ClientException => ex
|
155
|
+
puts "Error occurred: #{ex.code}, #{ex.message}"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
112
159
|
# Performs the load command.
|
113
160
|
def upload_command(args)
|
114
161
|
path = args.pop
|
@@ -166,9 +213,10 @@ def print_usage_general
|
|
166
213
|
puts ""
|
167
214
|
puts "Available commands:"
|
168
215
|
puts ""
|
169
|
-
puts " upload"
|
170
216
|
puts " delete"
|
171
217
|
puts " load"
|
218
|
+
puts " upload"
|
219
|
+
puts " search"
|
172
220
|
puts " help"
|
173
221
|
end
|
174
222
|
|
@@ -190,9 +238,22 @@ def print_usage_load
|
|
190
238
|
print_usage_global
|
191
239
|
end
|
192
240
|
|
241
|
+
# Prints the search options
|
242
|
+
def print_usage_search
|
243
|
+
puts "search: Searches for documents within Vuzit."
|
244
|
+
puts "usage: search [OPTIONS]"
|
245
|
+
puts ""
|
246
|
+
puts "Valid options:"
|
247
|
+
puts " -q, --query Query keywords"
|
248
|
+
puts " -l, --limit Limits the results to a number"
|
249
|
+
puts " -o, --offset Offsets the results at this number"
|
250
|
+
puts ""
|
251
|
+
print_usage_global
|
252
|
+
end
|
253
|
+
|
193
254
|
# Prints the upload options
|
194
255
|
def print_usage_upload
|
195
|
-
puts "upload: Upload a
|
256
|
+
puts "upload: Upload a document to Vuzit."
|
196
257
|
puts "usage: upload [OPTIONS] PATH"
|
197
258
|
puts ""
|
198
259
|
puts "Valid options:"
|
@@ -212,6 +273,8 @@ case command
|
|
212
273
|
load_command(ARGV)
|
213
274
|
when "delete"
|
214
275
|
delete_command(ARGV)
|
276
|
+
when "search"
|
277
|
+
search_command(ARGV)
|
215
278
|
when "upload"
|
216
279
|
upload_command(ARGV)
|
217
280
|
when "help"
|
data/lib/vuzitruby/base.rb
CHANGED
@@ -33,6 +33,23 @@ module Vuzit
|
|
33
33
|
return result
|
34
34
|
end
|
35
35
|
|
36
|
+
# Returns the value of a child node.
|
37
|
+
def self.node_value(node, key)
|
38
|
+
result = nil
|
39
|
+
|
40
|
+
if node.elements[key] != nil
|
41
|
+
result = node.elements[key].text
|
42
|
+
end
|
43
|
+
|
44
|
+
return result
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns the integer value of a child node or -1 if none.
|
48
|
+
def self.node_value_int(node, key)
|
49
|
+
text = node_value(node, key)
|
50
|
+
return (text == nil) ? -1 : text.to_i
|
51
|
+
end
|
52
|
+
|
36
53
|
# Returns a clean version of the parameters hash table.
|
37
54
|
def self.parameters_clean(params)
|
38
55
|
result = Hash.new
|
@@ -80,13 +97,7 @@ module Vuzit
|
|
80
97
|
timestamp = Time.now
|
81
98
|
params[:timestamp] = timestamp.to_i # time since epoch
|
82
99
|
|
83
|
-
|
84
|
-
if params.has_key?(:included_pages)
|
85
|
-
pages = params[:included_pages]
|
86
|
-
end
|
87
|
-
label = ''
|
88
|
-
|
89
|
-
signature = Vuzit::Service::signature(method, id, timestamp, pages, label)
|
100
|
+
signature = Vuzit::Service::signature(method, id, timestamp, params)
|
90
101
|
params[:signature] = signature
|
91
102
|
|
92
103
|
return params
|
@@ -101,6 +112,12 @@ module Vuzit
|
|
101
112
|
request = Net::HTTP::Post.new('/documents', {'User-Agent' => Vuzit::Service.user_agent})
|
102
113
|
request.multipart_params = parameters_clean(fields)
|
103
114
|
|
115
|
+
# If the stream is over 3 megabytes in size
|
116
|
+
if fields[:upload].stat.size > (3 * 1048576)
|
117
|
+
# Set the timeout to 5 minutes
|
118
|
+
http.read_timeout = (5 * 60 * 1000)
|
119
|
+
end
|
120
|
+
|
104
121
|
tries = 3
|
105
122
|
begin
|
106
123
|
tries -= 1
|
data/lib/vuzitruby/document.rb
CHANGED
@@ -13,11 +13,12 @@ module Vuzit
|
|
13
13
|
attr_reader :page_height # Page height of the document in pixels
|
14
14
|
attr_reader :file_size # File size of the original document bytes
|
15
15
|
attr_reader :status # Status of the document
|
16
|
+
attr_reader :excerpt # Text excerpt of the document
|
16
17
|
|
17
18
|
# Constructor.
|
18
19
|
def initialize #:nodoc:
|
19
20
|
# Set the defaults
|
20
|
-
@id = @title = @subject = nil
|
21
|
+
@id = @title = @subject = @excerpt = nil
|
21
22
|
@page_count = @page_width = @page_height = @file_size = @status = -1
|
22
23
|
end
|
23
24
|
|
@@ -89,18 +90,47 @@ module Vuzit
|
|
89
90
|
|
90
91
|
id = doc.root.elements['web_id']
|
91
92
|
if id == nil
|
92
|
-
raise Vuzit::ClientException.new("
|
93
|
+
raise Vuzit::ClientException.new("The web_id element missing - unknown error occurred");
|
93
94
|
end
|
94
95
|
|
95
|
-
result =
|
96
|
-
|
97
|
-
result
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
96
|
+
result = xml_to_document(doc.root)
|
97
|
+
|
98
|
+
return result
|
99
|
+
end
|
100
|
+
|
101
|
+
# Performs a search to return all documents as defined by the options.
|
102
|
+
def self.find_all(options = {})
|
103
|
+
raise ArgumentError, "Options must be a hash" unless options.kind_of? Hash
|
104
|
+
|
105
|
+
result = Array.new
|
106
|
+
options[:output] = "summary"
|
107
|
+
params = post_parameters("index", options)
|
108
|
+
url = parameters_to_url("documents", params)
|
109
|
+
http = http_connection
|
110
|
+
|
111
|
+
request = Net::HTTP::Get.new(url, {'User-Agent' => Vuzit::Service.user_agent})
|
112
|
+
response = http.start { http.request(request) }
|
113
|
+
|
114
|
+
# TODO: Check if response.code.to_i != 200
|
115
|
+
|
116
|
+
begin
|
117
|
+
doc = REXML::Document.new(response.body)
|
118
|
+
rescue Exception => ex
|
119
|
+
raise Vuzit::ClientException.new("XML error: #{ex.message}")
|
120
|
+
end
|
121
|
+
|
122
|
+
if doc.root == nil
|
123
|
+
raise Vuzit::ClientException.new("No response from server");
|
124
|
+
end
|
125
|
+
|
126
|
+
code = doc.root.elements['code']
|
127
|
+
if code != nil
|
128
|
+
raise Vuzit::ClientException.new(doc.root.elements['msg'].text, code.text.to_i);
|
129
|
+
end
|
130
|
+
|
131
|
+
doc.root.elements.each("document") do |node|
|
132
|
+
result << xml_to_document(node)
|
133
|
+
end
|
104
134
|
|
105
135
|
return result
|
106
136
|
end
|
@@ -115,12 +145,20 @@ module Vuzit
|
|
115
145
|
|
116
146
|
params = post_parameters("create", options)
|
117
147
|
response = nil
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
148
|
+
|
149
|
+
# Determine type and set to IO for data such as that from a database
|
150
|
+
case file
|
151
|
+
when IO
|
152
|
+
f = file
|
153
|
+
when String
|
154
|
+
f = File.open(file, 'rb')
|
155
|
+
else
|
156
|
+
raise ArgumentError, 'Expects String or IO argument'
|
122
157
|
end
|
123
158
|
|
159
|
+
params[:upload] = f
|
160
|
+
response = send_request 'create', params
|
161
|
+
|
124
162
|
# TODO: check the response.code.to_i to make sure it's 201
|
125
163
|
|
126
164
|
begin
|
@@ -151,6 +189,23 @@ module Vuzit
|
|
151
189
|
|
152
190
|
private
|
153
191
|
|
192
|
+
# Converts an XML object to a Document instance.
|
193
|
+
def self.xml_to_document(node)
|
194
|
+
result = Vuzit::Document.new
|
195
|
+
|
196
|
+
result.send(:set_id, node_value(node, 'web_id'))
|
197
|
+
result.send(:set_title, node_value(node, 'title'))
|
198
|
+
result.send(:set_subject, node_value(node, 'subject'))
|
199
|
+
result.send(:set_page_count, node_value_int(node, 'page_count'))
|
200
|
+
result.send(:set_page_width, node_value_int(node, 'width'))
|
201
|
+
result.send(:set_page_height, node_value_int(node, 'height'))
|
202
|
+
result.send(:set_file_size, node_value_int(node, 'file_size'))
|
203
|
+
result.send(:set_status, node_value_int(node, 'status'))
|
204
|
+
result.send(:set_excerpt, node_value(node, 'excerpt'))
|
205
|
+
|
206
|
+
return result
|
207
|
+
end
|
208
|
+
|
154
209
|
# Private setter methods so that you can set the internal variables but
|
155
210
|
# not allow the setting of the public methods.
|
156
211
|
def set_id(value) @id = value; end
|
@@ -161,5 +216,6 @@ module Vuzit
|
|
161
216
|
def set_page_width(value) @page_width = value; end
|
162
217
|
def set_page_height(value) @page_height = value; end
|
163
218
|
def set_file_size(value) @file_size = value; end
|
219
|
+
def set_excerpt(value) @excerpt = value; end
|
164
220
|
end
|
165
221
|
end
|
data/lib/vuzitruby/service.rb
CHANGED
@@ -47,7 +47,7 @@ module Vuzit
|
|
47
47
|
@@public_key = nil
|
48
48
|
@@private_key = nil
|
49
49
|
@@service_url = 'http://vuzit.com'
|
50
|
-
@@product_name = 'VuzitRuby Library
|
50
|
+
@@product_name = 'VuzitRuby Library 2.0.0'
|
51
51
|
@@user_agent = @@product_name
|
52
52
|
|
53
53
|
# TODO: For all of the set variables do not allow nil values
|
@@ -103,7 +103,7 @@ module Vuzit
|
|
103
103
|
# Returns The signature string. NOTE: If you are going to use this
|
104
104
|
# with the Vuzit Javascript API then the value must be encoded with the
|
105
105
|
# CGI.escape function. See the Wiki example for more information.
|
106
|
-
def self.signature(service, id = '', time = nil,
|
106
|
+
def self.signature(service, id = '', time = nil, options = {})
|
107
107
|
if Vuzit::Service.public_key == nil || Vuzit::Service.private_key == nil
|
108
108
|
raise Vuzit::ClientException.new("The public_key or private_key variables are nil")
|
109
109
|
end
|
@@ -117,7 +117,14 @@ module Vuzit
|
|
117
117
|
raise Vuzit::ClientException.new("Vuzit::Service.private_key not set")
|
118
118
|
end
|
119
119
|
|
120
|
-
msg = "#{service}#{id}#{@@public_key}#{time}
|
120
|
+
msg = "#{service}#{id}#{@@public_key}#{time}"
|
121
|
+
|
122
|
+
['included_pages', 'watermark', 'query'].each do |item|
|
123
|
+
if options.include?(item.to_sym)
|
124
|
+
msg << options[item.to_sym].to_s
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
121
128
|
hmac = hmac_sha1(@@private_key, msg)
|
122
129
|
result = Base64::encode64(hmac).chomp
|
123
130
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vuzitruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brent Matzelle
|
@@ -9,11 +9,14 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-02-08 00:00:00 -05:00
|
13
13
|
default_executable: vuzitcl
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description:
|
16
|
+
description: |-
|
17
|
+
This is a library for the Vuzit Web Services API. For
|
18
|
+
more information on the platform, visit
|
19
|
+
http://vuzit.com/developer
|
17
20
|
email: support@vuzit.com
|
18
21
|
executables:
|
19
22
|
- vuzitcl
|
@@ -31,6 +34,8 @@ files:
|
|
31
34
|
- lib/vuzitruby/service.rb
|
32
35
|
has_rdoc: true
|
33
36
|
homepage: http://vuzit.com/
|
37
|
+
licenses: []
|
38
|
+
|
34
39
|
post_install_message:
|
35
40
|
rdoc_options:
|
36
41
|
- --main
|
@@ -52,9 +57,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
57
|
requirements: []
|
53
58
|
|
54
59
|
rubyforge_project: vuzitruby
|
55
|
-
rubygems_version: 1.3.
|
60
|
+
rubygems_version: 1.3.5
|
56
61
|
signing_key:
|
57
|
-
specification_version:
|
62
|
+
specification_version: 3
|
58
63
|
summary: Ruby client library for the Vuzit Web Services API
|
59
64
|
test_files: []
|
60
65
|
|