dewey 0.1.3 → 0.1.4

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.
@@ -1,3 +1,9 @@
1
+ ## 0.1.3 (June 29, 2010)
2
+
3
+ Bugfixes:
4
+
5
+ - Handle mime type changes for files with no extension
6
+
1
7
  ## 0.1.2 (June 28, 2010)
2
8
 
3
9
  Features:
data/README.md CHANGED
@@ -1,11 +1,21 @@
1
+ ::::::::: :::::::::: ::: ::: :::::::::: ::: :::
2
+ :+: :+: :+: :+: :+: :+: :+: :+:
3
+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+
4
+ +#+ +:+ +#++:++# +#+ +:+ +#+ +#++:++# +#++:
5
+ +#+ +#+ +#+ +#+ +#+#+ +#+ +#+ +#+
6
+ #+# #+# #+# #+#+# #+#+# #+# #+#
7
+ ######### ########## ### ### ########## ###
8
+
1
9
  Dewey allows you to simply upload, download and delete files from your Google
2
- Docs account. Let Google do all of the hard work of converting your documents!
10
+ Docs account.
11
+
12
+ Let Google do all of the hard work of converting your documents!
3
13
 
4
- # Note
14
+ ## Note
5
15
 
6
16
  Dewey is in alpha. It is not recommended you use this in production code.
7
17
 
8
- ## Usage
18
+ ## Getting Started
9
19
 
10
20
  First, create a new Dewey::Document instance using your google docs account and
11
21
  password.
data/TODO.md CHANGED
@@ -1,4 +1,5 @@
1
1
  ## Dewey TODO List
2
- - Enable proper feed / service synchronization
3
- - Correct spreadsheet support
4
- - Add presentation support
2
+ - Implement the OAuth gem to manage service switching
3
+ - Add presentation support
4
+ - Documents: list
5
+ - Add support for folders
@@ -6,23 +6,17 @@ require 'tempfile'
6
6
  require 'dewey/https'
7
7
  require 'dewey/mime'
8
8
  require 'dewey/utils'
9
+ require 'dewey/validation'
9
10
 
10
11
  module Dewey
11
- GOOGLE_BASE_URL = "https://www.google.com"
12
12
  GOOGLE_DOCS_URL = "https://docs.google.com"
13
13
  GOOGLE_SPRD_URL = "https://spreadsheets.google.com"
14
- GOOGLE_LOGIN_URL = GOOGLE_BASE_URL + "/accounts/ClientLogin"
15
- GOOGLE_FEED_URL = GOOGLE_DOCS_URL + "/feeds/default/private/full"
14
+ GOOGLE_LOGIN_URL = "https://www.google.com/accounts/ClientLogin"
16
15
 
16
+ GOOGLE_FEED_URL = GOOGLE_DOCS_URL + "/feeds/default/private/full"
17
17
  GOOGLE_DOCUMENT_URL = GOOGLE_DOCS_URL + "/feeds/download/documents/Export"
18
18
  GOOGLE_SPREADSHEET_URL = GOOGLE_SPRD_URL + "/feeds/download/spreadsheets/Export"
19
19
 
20
- GOOGLE_SERVICES = { :document => 'writely', :spreadsheet => 'wise' }
21
-
22
- DOCUMENT_EXPORT_FORMATS = %w(txt odt pdf html rtf doc png zip)
23
- PRESENTATION_EXPORT_FORMATS = %w(swf pdf png ppt)
24
- SPREADSHEET_EXPORT_FORMATS = %W(xls csv pdf ods tsv html)
25
-
26
20
  class DeweyException < Exception
27
21
  end
28
22
 
@@ -30,37 +24,7 @@ module Dewey
30
24
  # This base class handles authentication and requests
31
25
  #
32
26
  class Document
33
- attr_accessor :account, :password, :service, :token, :cached
34
-
35
- # Determine wether or not a format is available for download.
36
- #
37
- # * format - The file format to check, i.e. 'txt', 'doc', 'pdf'
38
- # * service - The service that would be used. Must be document, presentation,
39
- # or spreadsheet.
40
- def self.valid_upload_format?(format, service = :document)
41
- case service
42
- when :document then Dewey::DOCUMENT_MIMETYPES.has_key?(format.to_sym)
43
- when :presentation then Dewey::PRESENTATION_MIMETYPES.has_key?(format.to_sym)
44
- when :spreadsheet then Dewey::SPREADSHEET_MIMETYPES.has_key?(format.to_sym)
45
- else
46
- raise DeweyException, "Unknown service: #{service}"
47
- end
48
- end
49
-
50
- # Determine whether or not a format is available for export.
51
- #
52
- # * format - The file format to check, i.e. 'txt', 'doc', 'pdf'
53
- # * service - The service that would be used. Must be document, presentation,
54
- # or spreadsheet.
55
- def self.valid_export_format?(format, service = :document)
56
- case service
57
- when :document then DOCUMENT_EXPORT_FORMATS.include?(format)
58
- when :presentation then PRESENTATION_EXPORT_FORMATS.include?(format)
59
- when :spreadsheet then SPREADSHEET_EXPORT_FORMATS.include?(format)
60
- else
61
- raise DeweyException, "Unknown service: #{service}"
62
- end
63
- end
27
+ attr_accessor :account, :password, :token
64
28
 
65
29
  # Create a new Doc object
66
30
  # Options specified in +opts+ consist of:
@@ -68,12 +32,9 @@ module Dewey
68
32
  # * :account - The Google Doc's account that will be used for authentication.
69
33
  # This will most typically be a gmail account, i.e. +example@gmail.com+
70
34
  # * :password - The password for the Google Doc's account.
71
- # * :service - The default service to connect to, either :document or :spreadsheet
72
35
  def initialize(options = {})
73
36
  @account = options[:account]
74
37
  @password = options[:password]
75
- @service = options[:service] || :document
76
- @cached = {}
77
38
  end
78
39
 
79
40
  # Returns true if this instance has been authorized
@@ -91,7 +52,7 @@ module Dewey
91
52
 
92
53
  url = URI.parse(GOOGLE_LOGIN_URL)
93
54
  params = { 'accountType' => 'HOSTED_OR_GOOGLE', 'Email' => @account,
94
- 'Passwd' => @password, 'service'=> GOOGLE_SERVICES[@service] }
55
+ 'Passwd' => @password, 'service'=> 'writely' }
95
56
 
96
57
  response = Net::HTTPS.post_form(url, params)
97
58
 
@@ -105,8 +66,14 @@ module Dewey
105
66
  raise DeweyException, "Unexpected response: #{response}"
106
67
  end
107
68
  end
108
-
109
- def upload(file, title = nil)
69
+
70
+ # Upload a file to the account. A successful upload will return the resource
71
+ # id, which is useful for downloading the file without doing a title search.
72
+ # * file - A File reference
73
+ # * title - An alternative title, to be used instead of the filename
74
+ def put(file, title = nil)
75
+ authorize! unless authorized?
76
+
110
77
  extension = File.extname(file.path).sub('.', '')
111
78
  basename = File.basename(file.path, ".#{extension}")
112
79
  mimetype = Dewey::Mime.mime_type(file)
@@ -114,12 +81,12 @@ module Dewey
114
81
 
115
82
  title ||= basename
116
83
 
117
- raise DeweyException, "Invalid file type: #{extension}" unless Dewey::Document.valid_upload_format?(extension, service)
84
+ raise DeweyException, "Invalid file type: #{extension}" unless Dewey::Validation.valid_upload_format?(extension, service)
118
85
 
119
86
  headers = base_headers
120
87
  headers['Content-Length'] = File.size?(file).to_s
121
- headers['Content-Type'] = mimetype
122
88
  headers['Slug'] = Dewey::Utils.escape(title)
89
+ headers['Content-Type'] = mimetype unless mimetype =~ /Can't expand summary_info/
123
90
 
124
91
  # Rewind the file in the case of multiple uploads, or conversions
125
92
  file.rewind
@@ -128,25 +95,31 @@ module Dewey
128
95
 
129
96
  case response
130
97
  when Net::HTTPCreated
131
- rid = @cached[basename] = extract_rid(response.body)
98
+ extract_rid(response.body)
132
99
  else
133
100
  nil
134
101
  end
135
102
  end
136
103
 
104
+ alias :upload :put
105
+
137
106
  # Download, or export more accurately, a file to a specified format
138
- # * id - A resource id or exact file name matching a document in the account
107
+ # * rid - A resource id, for example +document:12345+
139
108
  # * format - The output format, see *_EXPORT_FORMATS for possiblibilites
140
- def download(id, format = nil)
141
- spreadsheet = !! id.match(/spreadsheet/)
109
+ def get(rid, format = nil)
110
+ authorize! unless authorized?
142
111
 
143
- url = (spreadsheet ? GOOGLE_SPREADSHEET_URL : GOOGLE_DOCUMENT_URL)
112
+ spreadsheet = !! rid.match(/^spreadsheet/)
113
+ id = rid.sub(/[a-z]+:/, '')
114
+
115
+ url = ''
116
+ url << (spreadsheet ? GOOGLE_SPREADSHEET_URL : GOOGLE_DOCUMENT_URL)
144
117
  url << (spreadsheet ? "?key=#{id}" : "?docID=#{id}")
145
118
  url << "&exportFormat=#{format.to_s}" unless format.nil?
146
119
 
147
120
  headers = base_headers
148
121
 
149
- file = Tempfile.new([id, format].join('.'))
122
+ file = Tempfile.new([rid, format].join('.'))
150
123
  file.binmode
151
124
 
152
125
  open(url, headers) { |data| file.write data.read }
@@ -154,8 +127,13 @@ module Dewey
154
127
  file
155
128
  end
156
129
 
130
+ alias :download :get
131
+
157
132
  # Deletes a document referenced either by resource id or by name.
133
+ # * id - A resource id or exact file name matching a document in the account
158
134
  def delete(id)
135
+ authorize! unless authorized?
136
+
159
137
  headers = base_headers
160
138
  headers['If-Match'] = '*' # We don't care if others have modified
161
139
 
@@ -196,9 +174,8 @@ module Dewey
196
174
 
197
175
  def http_request(method, url, headers, data = nil) #:nodoc:
198
176
  url = URI.parse(url) if url.kind_of? String
199
-
200
- connection = Net::HTTP.new(url.host, url.port)
201
- connection.use_ssl = (url.scheme == 'https')
177
+
178
+ connection = (url.scheme == 'https') ? Net::HTTPS.new(url.host, url.port) : Net::HTTP.new(url.host, url.port)
202
179
 
203
180
  case method
204
181
  when :post
@@ -219,13 +196,13 @@ module Dewey
219
196
  base
220
197
  end
221
198
 
222
- def extract_rid(source) #:nodoc:
223
- xml = REXML::Document.new(source)
199
+ def extract_rid(response) #:nodoc:
200
+ xml = REXML::Document.new(response)
224
201
 
225
202
  begin
226
- "#{$1}:#{$2}" if xml.elements['//id'].text =~ /.+(document|spreadsheet|presentation)%3A([0-9a-zA-Z]+)/
203
+ "#{$1}:#{$2}" if xml.elements['//id'].text =~ /.+(document|spreadsheet|presentation)%3A([0-9a-zA-Z_-]+)$/
227
204
  rescue
228
- raise DeweyException, "id could not be extracted from: #{body}"
205
+ raise DeweyException, "id could not be extracted from: #{response}"
229
206
  end
230
207
  end
231
208
  end
@@ -1,11 +1,12 @@
1
1
  require 'net/http'
2
2
 
3
- # Shortcut method for using +http.use_ssl+.
4
- module Net
3
+ module Net # :nodoc:
5
4
  class HTTPS < Net::HTTP
6
5
  def initialize(address, port = 443)
7
6
  super(address, port)
8
7
  self.use_ssl = true
8
+ @ssl_context = OpenSSL::SSL::SSLContext.new
9
+ @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
9
10
  end
10
11
  end
11
12
  end
@@ -1,8 +1,3 @@
1
- # (c) Copyright 2010 Parker Selbert <parker@sorentwo.com>
2
- #
3
- # Dewey is freely distributable under the terms of an MIT-style license.
4
- # See LICENSE or http://www.opensource.org/licenses/mit-license.php
5
-
6
1
  module Dewey
7
2
 
8
3
  DOCUMENT_MIMETYPES = {
@@ -63,8 +58,8 @@ module Dewey
63
58
  # cast them to one that Google Docs will accept.
64
59
  def self.coerce(mime_type)
65
60
  case mime_type
66
- when /vnd.ms-office/ then 'application/msword'
67
- when /x-docx/ then 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
61
+ when /vnd.ms-office/ then 'application/msword'
62
+ when /x-docx/ then 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
68
63
  else mime_type
69
64
  end
70
65
  end
@@ -9,7 +9,7 @@ module Dewey
9
9
 
10
10
  module_function :escape
11
11
 
12
- # Return the bytesize of String; uses String#length under Ruby 1.8 and
12
+ # Return the bytesize of String; uses String#length under Ruby 1.8
13
13
  def bytesize(string)
14
14
  string.bytesize
15
15
  end
@@ -0,0 +1,38 @@
1
+ module Dewey
2
+
3
+ DOCUMENT_EXPORT_FORMATS = %w(txt odt pdf html rtf doc png zip)
4
+ PRESENTATION_EXPORT_FORMATS = %w(swf pdf png ppt)
5
+ SPREADSHEET_EXPORT_FORMATS = %W(xls csv pdf ods tsv html)
6
+
7
+ class Validation
8
+ # Determine wether or not a format is available for download.
9
+ #
10
+ # * format - The file format to check, i.e. 'txt', 'doc', 'pdf'
11
+ # * service - The service that would be used. Must be document, presentation,
12
+ # or spreadsheet.
13
+ def self.valid_upload_format?(format, service = :document)
14
+ case service
15
+ when :document then Dewey::DOCUMENT_MIMETYPES.has_key?(format.to_sym)
16
+ when :presentation then Dewey::PRESENTATION_MIMETYPES.has_key?(format.to_sym)
17
+ when :spreadsheet then Dewey::SPREADSHEET_MIMETYPES.has_key?(format.to_sym)
18
+ else
19
+ raise DeweyException, "Unknown service: #{service}"
20
+ end
21
+ end
22
+
23
+ # Determine whether or not a format is available for export.
24
+ #
25
+ # * format - The file format to check, i.e. 'txt', 'doc', 'pdf'
26
+ # * service - The service that would be used. Must be document, presentation,
27
+ # or spreadsheet.
28
+ def self.valid_export_format?(format, service = :document)
29
+ case service
30
+ when :document then Dewey::DOCUMENT_EXPORT_FORMATS.include?(format)
31
+ when :presentation then Dewey::PRESENTATION_EXPORT_FORMATS.include?(format)
32
+ when :spreadsheet then Dewey::SPREADSHEET_EXPORT_FORMATS.include?(format)
33
+ else
34
+ raise DeweyException, "Unknown service: #{service}"
35
+ end
36
+ end
37
+ end
38
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 3
9
- version: 0.1.3
8
+ - 4
9
+ version: 0.1.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Parker Selbert
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-29 00:00:00 -04:00
17
+ date: 2010-10-19 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -43,6 +43,7 @@ files:
43
43
  - lib/dewey/https.rb
44
44
  - lib/dewey/mime.rb
45
45
  - lib/dewey/utils.rb
46
+ - lib/dewey/validation.rb
46
47
  - lib/dewey.rb
47
48
  - README.md
48
49
  - CHANGELOG.md