dewey 0.2.8 → 0.2.9

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/.gitignore CHANGED
@@ -1,6 +1,7 @@
1
1
  Gemfile.lock
2
2
  *.gem
3
3
  .bundle
4
+ vendor/*
4
5
  .yardoc/*
5
6
  doc/*
6
7
  TODO
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 0.2.9 (October 2, 2011)
2
+
3
+ * Better support for files without an extension (Cory Schires)
4
+ * Don't fail when `docx` has a mime type of `application/zip` (Cory Schires)
5
+
6
+ ## 0.2.8 (April 19, 2011)
7
+
8
+ * Remove x-www-form-urlencoded header for compatiblity with latest API
9
+
1
10
  ## 0.2.7 (December 12, 2010)
2
11
 
3
12
  * Documents, Drawings and Presentations are actually downloadable again. The
@@ -6,19 +15,19 @@
6
15
  * Minor internal improvements
7
16
 
8
17
  ## 0.2.6 (November 3, 2010)
9
-
18
+
10
19
  * Downloaded files are automatically rewound
11
20
 
12
21
  ## 0.2.5 (November 3, 2010)
13
-
22
+
14
23
  * Sheet (gid) support for spreadsheets
15
24
  * Delegate authentication, more reliable and no need for eval + alias_method
16
25
  * Fix spreadsheet calls not authenticating
17
26
 
18
27
  ## 0.2.4 (November 2, 2010)
19
-
28
+
20
29
  Additions:
21
-
30
+
22
31
  - Support downloading drawings
23
32
  - Support downloading presentations
24
33
  - Drawing mime support and validation
@@ -29,7 +38,7 @@
29
38
  - Add support for new style export options (exportFormat & format)
30
39
 
31
40
  Bugfixes:
32
-
41
+
33
42
  - Fix search results pulling the feed id and not just the entry id
34
43
  - Fix entries pulling the feed along with the resource id
35
44
  - Remove calls to blank?
@@ -37,13 +46,13 @@
37
46
  ## 0.2.3 (October 30, 2010)
38
47
 
39
48
  Additions:
40
-
49
+
41
50
  - #delete and #delete! accept an optional :trash option to send a resource
42
51
  to the trash, rather than being fully deleted.
43
52
  - #get and #elete by title. Handles exact matches only.
44
-
53
+
45
54
  Bugfixes:
46
-
55
+
47
56
  - Not setting the :format option on #get no longers raises
48
57
 
49
58
  ## 0.2.2 (October 27, 2010)
@@ -70,28 +79,28 @@ Bugfixes:
70
79
  ## 0.2.0 (October 20, 2010)
71
80
 
72
81
  Additions:
73
-
82
+
74
83
  - Class-wide authentication. You only have to set up authentication once and
75
84
  then utilize that in all successive calls.
76
85
  - All file operations are stateless (Dewey.put, Dewey.get, etc)
77
86
  - Store multiple authorizations simultaneously.
78
-
87
+
79
88
  Changes:
80
89
 
81
90
  - Convert API change. Format is required, not an option.
82
91
  - No longer supports upload or download, instead use put or get.
83
92
 
84
93
  ## 0.1.4 (October 19, 2010)
85
-
94
+
86
95
  Additions:
87
-
96
+
88
97
  - Handle bad mimetypes.
89
98
  - Modular validation
90
99
  - Removed service option, needless.
91
100
  - Automatic implicit authorization, removes need to call authorize! manually.
92
101
 
93
102
  Bugfixes:
94
-
103
+
95
104
  - Prevent peer certificate warnings in 1.9
96
105
  - Fixed id extraction regex that prevented resources with dashes or underscores
97
106
  from being pulled.
@@ -111,7 +120,7 @@ Features:
111
120
  Bugfixes:
112
121
 
113
122
  - Handle files with no extension
114
-
123
+
115
124
  ---
116
125
  ## 0.1.1 (June 28, 2010)
117
126
 
data/dewey.gemspec CHANGED
@@ -15,9 +15,9 @@ Gem::Specification.new do |s|
15
15
  s.rubyforge_project = 'dewey'
16
16
 
17
17
  s.add_development_dependency 'rake', '~> 0.8.7'
18
- s.add_development_dependency 'rspec', '~> 2.3.0'
19
- s.add_development_dependency 'webmock', '~> 1.4.0'
20
- s.add_development_dependency 'yard', '~> 0.6.8'
18
+ s.add_development_dependency 'rspec', '~> 2.6.0'
19
+ s.add_development_dependency 'webmock', '~> 1.7.6'
20
+ s.add_development_dependency 'yard', '~> 0.7.2'
21
21
 
22
22
  s.files = `git ls-files`.split("\n")
23
23
  s.test_files = `git ls-files -- {spec}/*`.split("\n")
data/lib/dewey.rb CHANGED
@@ -2,13 +2,13 @@ module Dewey
2
2
  GOOGLE_DOCS_URL = "https://docs.google.com"
3
3
  GOOGLE_SPRD_URL = "https://spreadsheets.google.com"
4
4
  GOOGLE_LOGIN_URL = "https://www.google.com/accounts/ClientLogin"
5
-
5
+
6
6
  GOOGLE_FEED_URL = GOOGLE_DOCS_URL + "/feeds/default/private/full"
7
7
  GOOGLE_DOCUMENT_URL = GOOGLE_DOCS_URL + "/feeds/download/documents/Export"
8
8
  GOOGLE_DRAWING_URL = GOOGLE_DOCS_URL + "/feeds/download/drawings/Export"
9
9
  GOOGLE_PRESENTATION_URL = GOOGLE_DOCS_URL + "/feeds/download/presentations/Export"
10
10
  GOOGLE_SPREADSHEET_URL = GOOGLE_SPRD_URL + "/feeds/download/spreadsheets/Export"
11
-
11
+
12
12
  class DeweyError < StandardError; end
13
13
  class DeweyAuthorizationError < StandardError; end
14
14
  end
@@ -2,7 +2,7 @@ module Dewey
2
2
  class ClientAuth
3
3
  attr_reader :authentications
4
4
 
5
- def initialize(email, password)
5
+ def initialize(email, password)
6
6
  @email = email
7
7
  @password = password
8
8
  @authentications = {}
@@ -12,10 +12,10 @@ module Dewey
12
12
  if service
13
13
  @authentications.has_key?(service)
14
14
  else
15
- @authentications.any?
15
+ @authentications.any?
16
16
  end
17
17
  end
18
-
18
+
19
19
  def authenticate!(service = nil)
20
20
  service ||= :writely
21
21
 
@@ -39,7 +39,7 @@ module Dewey
39
39
  raise DeweyError, "Unexpected response: #{response}"
40
40
  end
41
41
  end
42
-
42
+
43
43
  def token(service = nil)
44
44
  service = guard(service)
45
45
  authenticate!(service) unless authenticated?(service)
data/lib/dewey/core.rb CHANGED
@@ -5,7 +5,7 @@ require 'tempfile'
5
5
 
6
6
  module Dewey
7
7
  class << self
8
-
8
+
9
9
  # Set the authentication strategy. You can currently only use ClientAuth,
10
10
  # but you must provide +email+ and +password+ options. You must set up
11
11
  # authentication before using any file operations.
@@ -16,14 +16,14 @@ module Dewey
16
16
  @@authenticator = Dewey::ClientAuth.new(options[:email], options[:password])
17
17
  end
18
18
  end
19
-
19
+
20
20
  # Report whether Dewey has both an authentication strategy selected, and has
21
21
  # been authenticated. Delegates to the chosen authenticator.
22
22
  #
23
23
  def authenticated?
24
24
  !@@authenticator.nil? && @@authenticator.authenticated?
25
25
  end
26
-
26
+
27
27
  # Tell the authentication strategy to authenticate. Not necessary though, as
28
28
  # any file operation will authenticate automatically.
29
29
  #
@@ -31,7 +31,7 @@ module Dewey
31
31
  @@authenticator.authenticate!
32
32
  end
33
33
 
34
- # Queries the document list for a particular title. Titles can be either
34
+ # Queries the document list for a particular title. Titles can be either
35
35
  # full or partial matches. Matches are returned as an array of ids.
36
36
  #
37
37
  # @param [String] query The title to be matched
@@ -46,7 +46,7 @@ module Dewey
46
46
  url = "#{GOOGLE_FEED_URL}?title=#{title}"
47
47
  url << "&title-exact=true" if options[:exact]
48
48
  response = http_request(:get, url, headers)
49
-
49
+
50
50
  response.kind_of?(Net::HTTPOK) ? extract_ids(response.body) : []
51
51
  end
52
52
 
@@ -57,27 +57,27 @@ module Dewey
57
57
  # @param [Hash] options Options for uploading the file
58
58
  # @option options [Symbol] :title An alternative title, to be used instead
59
59
  # of the filename
60
- #
60
+ #
61
61
  # @return [String, nil] The id if upload was successful, nil otherwise
62
62
  def put(file, options = {})
63
- extension = File.extname(file.path).sub('.', '')
63
+ extension = Dewey::Mime.extension(file)
64
64
  basename = File.basename(file.path, ".#{extension}")
65
65
  mimetype = Dewey::Mime.mime_type(file)
66
66
  service = Dewey::Mime.guess_service(mimetype)
67
67
  title = options[:title] || basename
68
-
68
+
69
69
  raise DeweyError, "Invalid file type: #{extension}" unless Dewey::Validation.valid_upload_format?(extension, service)
70
-
70
+
71
71
  headers = base_headers
72
72
  headers['Content-Length'] = File.size?(file).to_s
73
73
  headers['Slug'] = Dewey::Utils.slug(title)
74
74
  headers['Content-Type'] = mimetype unless mimetype =~ /Can't expand summary_info/
75
-
75
+
76
76
  # Rewind the file in the case of multiple uploads, or conversions
77
77
  file.rewind
78
-
78
+
79
79
  response = http_request(:post, GOOGLE_FEED_URL, headers, file.read.to_s)
80
-
80
+
81
81
  if response.kind_of?(Net::HTTPCreated)
82
82
  extract_ids(response.body).first
83
83
  else
@@ -98,7 +98,7 @@ module Dewey
98
98
  # `My Document` for example
99
99
  # @param [Hash] options Options for downloading the document
100
100
  # @option options [Symbol] :format The output format
101
- #
101
+ #
102
102
  # @return [Tempfile, nil] The downloaded file, otherwise `nil` if the file
103
103
  # couldn't be found.
104
104
  #
@@ -137,12 +137,12 @@ module Dewey
137
137
  url << "&format=#{format}" if service == 'document'
138
138
  url << "&gid=#{options[:sheet]}" if service == 'spreadsheet' && options[:sheet]
139
139
  else
140
- raise DeweyError, "Invalid format: #{format}"
140
+ raise DeweyError, "Invalid format: #{format}"
141
141
  end
142
142
  end
143
143
 
144
144
  response = http_request(:get, url, base_headers(service))
145
-
145
+
146
146
  if response.kind_of?(Net::HTTPOK)
147
147
  file = Tempfile.new([id, format].join('.')).binmode
148
148
  file.write(response.body)
@@ -154,7 +154,7 @@ module Dewey
154
154
  end
155
155
 
156
156
  # Deletes a document. The default behavior is to delete the document
157
- # permanently, rather than trashing it.
157
+ # permanently, rather than trashing it.
158
158
  #
159
159
  # @param [String] query A resource id or title. If a title is provided
160
160
  # a search will be performed automatically.
@@ -166,23 +166,23 @@ module Dewey
166
166
  def delete(query, options = {})
167
167
 
168
168
  # We use 'If-Match' => '*' to make sure we delete regardless of others
169
- headers = base_headers.merge({'If-Match' => '*'})
169
+ headers = base_headers.merge({'If-Match' => '*'})
170
170
  trash = options.delete(:trash) || false
171
171
  id = (is_id?(query)) ? query : search(query, :exact => true).first
172
-
172
+
173
173
  return false if id.nil?
174
174
 
175
175
  url = "#{GOOGLE_FEED_URL}/#{URI.escape(id)}"
176
176
  url << "?delete=true" unless trash
177
177
 
178
178
  response = http_request(:delete, url, headers)
179
-
179
+
180
180
  response.kind_of?(Net::HTTPOK)
181
181
  end
182
-
182
+
183
183
  # The same as delete, except that it will raise `Dewey::DeweyError` if
184
184
  # the request fails.
185
- #
185
+ #
186
186
  # @see #delete
187
187
  def delete!(query, options = {})
188
188
  delete(query, options) || raise(DeweyError, "Unable to delete document")
@@ -204,9 +204,9 @@ module Dewey
204
204
  def convert(file, options = {})
205
205
  id = put(file, options[:title])
206
206
  converted = get(id, options[:format])
207
-
207
+
208
208
  delete(id)
209
-
209
+
210
210
  converted
211
211
  end
212
212
 
@@ -218,7 +218,7 @@ module Dewey
218
218
  end
219
219
 
220
220
  # Perform the actual request heavy lifting
221
- def http_request(method, url, headers, data = nil) #:nodoc:
221
+ def http_request(method, url, headers, data = nil) #:nodoc:
222
222
  url = URI.parse(url) if url.kind_of? String
223
223
 
224
224
  connection = (url.scheme == 'https') ? Net::HTTPS.new(url.host, url.port) : Net::HTTP.new(url.host, url.port)
@@ -243,7 +243,7 @@ module Dewey
243
243
  base = {}
244
244
  base['GData-Version'] = '3.0'
245
245
  base['Authorization'] = "GoogleLogin auth=#{authenticator.token(service)}"
246
-
246
+
247
247
  base
248
248
  end
249
249
 
data/lib/dewey/mime.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Dewey
2
-
2
+
3
3
  DOCUMENT_MIMETYPES = {
4
- :doc => 'application/msword',
5
- :docx => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
4
+ :doc => ['application/msword', 'application/vnd.ms-office'],
5
+ :docx => ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/x-docx', 'application/zip'],
6
6
  :htm => 'text/html',
7
7
  :html => 'text/html',
8
8
  :odt => 'application/vnd.oasis.opendocument.text',
@@ -17,12 +17,12 @@ module Dewey
17
17
  :png => 'image/png',
18
18
  :svg => 'image/svg+xml'
19
19
  }
20
-
20
+
21
21
  PRESENTATION_MIMETYPES = {
22
22
  :pps => 'application/vnd.ms-powerpoint',
23
23
  :ppt => 'application/vnd.ms-powerpoint'
24
24
  }
25
-
25
+
26
26
  SPREADSHEET_MIMETYPES = {
27
27
  :csv => 'text/csv',
28
28
  :ods => 'application/x-vnd.oasis.opendocument.spreadsheet',
@@ -31,14 +31,24 @@ module Dewey
31
31
  :xls => 'application/vnd.ms-excel',
32
32
  :xlsx => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
33
33
  }
34
-
34
+
35
35
  class Mime
36
+ # Determine file extension by parsing the filename. When the filename has no extension,
37
+ # then instead examine the file's mime type and intuit the extension.
38
+ def self.extension(file)
39
+ extension = File.extname(file.path).sub('.', '')
40
+ if extension.nil? || extension == ''
41
+ mime_type = (`file --mime-type #{file.path}`).split(':').last.strip
42
+ extension = mime_type_to_extension_mapping[mime_type]
43
+ end
44
+ extension.to_s.downcase
45
+ end
46
+
36
47
  # Attempts to provide a mime_type that Google Docs finds acceptable. Certain
37
48
  # types, when gathered from +file+ require extra coercion and will be handled
38
49
  # automatically.
39
50
  def self.mime_type(file)
40
- type = (file.path.match(/\.(\w+)/)[1] rescue '').downcase
41
- case type
51
+ type = case extension(file)
42
52
  when /csv/ then SPREADSHEET_MIMETYPES[:csv]
43
53
  when /doc$/ then DOCUMENT_MIMETYPES[:doc]
44
54
  when /docx/ then DOCUMENT_MIMETYPES[:docx]
@@ -58,31 +68,49 @@ module Dewey
58
68
  when /txt/ then DOCUMENT_MIMETYPES[:txt]
59
69
  when /xls$/ then SPREADSHEET_MIMETYPES[:xls]
60
70
  when /xlsx/ then SPREADSHEET_MIMETYPES[:xlsx]
61
- else
62
- Mime.coerce((`file --mime-type #{file.path}`).split(':').last.strip) rescue "application/#{type}"
63
71
  end
72
+ type.is_a?(Array) ? type.first : type
64
73
  end
65
74
 
66
- # Attempt to take mime types that are known to be guessed incorrectly and
67
- # cast them to one that Google Docs will accept.
68
- def self.coerce(mime_type)
69
- case mime_type
70
- when /vnd.ms-office/ then 'application/msword'
71
- when /x-docx/ then 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
72
- else mime_type
75
+ # Merges then inverts all the mime type constants to make a new hash with mime types as keys
76
+ # and the corresponding file extensions as values. For example this:
77
+ #
78
+ # :doc => ['application/msword', 'application/vnd.ms-office'],
79
+ #
80
+ # Becomes:
81
+ #
82
+ # 'application/msword' => :doc,
83
+ # 'application/vnd.ms-office' => :doc
84
+ #
85
+ # This is useful for intuiting file extensions based on mime types, which is handy when the
86
+ # filename doesn't have an extension (e.g. when doing post-processing with paperclip).
87
+ #
88
+ def self.mime_type_to_extension_mapping
89
+ doc_types = [DOCUMENT_MIMETYPES, DRAWING_MIMETYPES, PRESENTATION_MIMETYPES, SPREADSHEET_MIMETYPES]
90
+ extensions = {}
91
+ mime_types = {}
92
+ doc_types.each { |doc_type| extensions.merge!(doc_type) }
93
+
94
+ extensions.each do |extension, mime|
95
+ if mime.is_a?(Array)
96
+ mime.each { |m| mime_types[m] = extension }
97
+ else
98
+ mime_types[mime] = extension
99
+ end
73
100
  end
101
+ mime_types
74
102
  end
75
-
103
+
76
104
  def self.guess_service(mime_type)
77
105
  services = { :document => DOCUMENT_MIMETYPES,
78
106
  :drawing => DRAWING_MIMETYPES,
79
107
  :presentation => PRESENTATION_MIMETYPES,
80
108
  :spreadsheet => SPREADSHEET_MIMETYPES }
81
-
109
+
82
110
  services.each_key do |service|
83
- return service if services[service].has_value?(mime_type)
111
+ return service if services[service].values.flatten.include?(mime_type)
84
112
  end
85
-
113
+
86
114
  nil
87
115
  end
88
116
  end
@@ -1,14 +1,14 @@
1
1
  module Dewey
2
-
2
+
3
3
  DOCUMENT_EXPORT_FORMATS = [:txt, :odt, :pdf, :html, :rtf, :doc, :png, :zip]
4
4
  DRAWING_EXPORT_FORMATS = [:jpeg, :pdf, :png, :svg]
5
5
  PRESENTATION_EXPORT_FORMATS = [:swf, :pdf, :png, :ppt]
6
6
  SPREADSHEET_EXPORT_FORMATS = [:xls, :csv, :pdf, :ods, :tsv, :html]
7
-
7
+
8
8
  # Utility methods to check that a format is accepted for a particular service
9
9
  #
10
10
  class Validation
11
-
11
+
12
12
  class << self
13
13
  # Determine wether or not a format is available for download.
14
14
  #
@@ -44,7 +44,7 @@ module Dewey
44
44
  # @raise [DeweyError] Raised when an unknown service is given
45
45
  def valid_export_format?(format, service = nil)
46
46
  format = format.to_sym
47
- service = default_service(service)
47
+ service = default_service(service)
48
48
 
49
49
  case service
50
50
  when :document then Dewey::DOCUMENT_EXPORT_FORMATS.include?(format)
data/lib/dewey/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dewey
2
- VERSION = '0.2.8'
2
+ VERSION = '0.2.9'
3
3
  end
@@ -12,24 +12,24 @@ describe Dewey::ClientAuth do
12
12
  stub_http_request(:post, Dewey::GOOGLE_LOGIN_URL).
13
13
  with(:body => 'accountType=HOSTED_OR_GOOGLE&Email=example&Passwd=password&service=writely').
14
14
  to_return(:body => '=12345')
15
-
15
+
16
16
  subject.authenticate!.should be_true
17
17
  subject.authentications.should have_key(:writely)
18
18
 
19
19
  WebMock.should have_requested(:post, Dewey::GOOGLE_LOGIN_URL).with(:body => /.*service=writely.*/)
20
20
  end
21
-
21
+
22
22
  it "authenticates for wise" do
23
23
  stub_http_request(:post, Dewey::GOOGLE_LOGIN_URL).
24
24
  with(:body => 'accountType=HOSTED_OR_GOOGLE&Email=example&Passwd=password&service=wise').
25
25
  to_return(:body => '=12345')
26
-
26
+
27
27
  subject.authenticate!(:wise)
28
28
  subject.authentications.should have_key(:wise)
29
-
29
+
30
30
  WebMock.should have_requested(:post, Dewey::GOOGLE_LOGIN_URL).with(:body => /.*service=wise.*/)
31
31
  end
32
-
32
+
33
33
  it "returns false if authorization fails" do
34
34
  stub_http_request(:post, Dewey::GOOGLE_LOGIN_URL).to_return(:status => 403)
35
35
 
@@ -48,11 +48,11 @@ describe Dewey::ClientAuth do
48
48
 
49
49
  subject.authenticated?.should be_true
50
50
  end
51
-
51
+
52
52
  it "can scope authentication to writely" do
53
53
  stub_http_request(:post, Dewey::GOOGLE_LOGIN_URL).to_return(:body => '=12345')
54
-
55
- subject.authenticate!(:writely)
54
+
55
+ subject.authenticate!(:writely)
56
56
  subject.authenticated?(:writely).should be_true
57
57
  end
58
58
 
@@ -61,11 +61,11 @@ describe Dewey::ClientAuth do
61
61
  subject.authenticate!(:wise)
62
62
  subject.authenticated?(:wise).should be_true
63
63
  end
64
-
64
+
65
65
  it "provides authentication tokens" do
66
66
  stub_http_request(:post, Dewey::GOOGLE_LOGIN_URL).to_return(:body => '=12345')
67
67
  subject.authenticate!(:writely)
68
-
68
+
69
69
  subject.token(:writely).should eq('12345')
70
70
  end
71
71
 
@@ -81,6 +81,6 @@ describe Dewey::ClientAuth do
81
81
 
82
82
  it "will correctly map spreadsheets to wise" do
83
83
  stub_http_request(:post, Dewey::GOOGLE_LOGIN_URL).to_return(:body => '=12345')
84
- subject.token('spreadsheets').should eq('12345')
84
+ subject.token('spreadsheets').should eq('12345')
85
85
  end
86
86
  end
@@ -7,7 +7,7 @@ describe "Dewey.convert" do
7
7
  @txt = sample_file 'sample_document.txt'
8
8
  @doc = sample_file 'sample_document.doc'
9
9
  end
10
-
10
+
11
11
  it "should put, get, and delete" do
12
12
  Dewey.should_receive(:put).with(@txt, 'sample').and_return('document:12345')
13
13
  Dewey.should_receive(:get).with('document:12345', :doc).and_return(@doc)
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "Dewey.get" do
3
+ describe "Dewey.get" do
4
4
  before(:each) { stub_dewey_auth }
5
5
 
6
6
  it "raises with an invalid format" do
@@ -28,14 +28,14 @@ describe "Dewey.get" do
28
28
  it "downloads a document by id" do
29
29
  stub_request(:get, "#{Dewey::GOOGLE_DOCUMENT_URL}?id=12345").
30
30
  to_return(:body => sample_file('sample_document.txt'))
31
-
31
+
32
32
  Dewey.get('document:12345').should_not be_nil
33
33
  end
34
-
34
+
35
35
  it "sets the export format when format is provided" do
36
36
  stub_request(:get, "#{Dewey::GOOGLE_DOCUMENT_URL}?id=12345&exportFormat=doc&format=doc").
37
37
  to_return(:body => sample_file('sample_document.doc'))
38
-
38
+
39
39
  Dewey.get('document:12345', :format => :doc).should_not be_nil
40
40
  end
41
41
 
@@ -53,7 +53,7 @@ describe "Dewey.get" do
53
53
 
54
54
  Dewey.get('My Document').should_not be_nil
55
55
  end
56
-
56
+
57
57
  it "returns nil when the title can't be found" do
58
58
  Dewey.should_receive(:search).with('My Document', { :exact => true }).and_return([])
59
59
 
@@ -77,7 +77,7 @@ describe "Dewey.get" do
77
77
  it "is able to download a spreadsheet" do
78
78
  stub_request(:get, "#{Dewey::GOOGLE_SPREADSHEET_URL}?key=12345").
79
79
  to_return(:body => sample_file('sample_spreadsheet.csv'))
80
-
80
+
81
81
  Dewey.get('spreadsheet:12345').should_not be_nil
82
82
  end
83
83
 
@@ -91,7 +91,7 @@ describe "Dewey.get" do
91
91
  it "should not download a full spreadsheet sheet" do
92
92
  stub_request(:get, "#{Dewey::GOOGLE_SPREADSHEET_URL}?key=12345").
93
93
  to_return(:body => sample_file('sample_spreadsheet.xls'))
94
-
94
+
95
95
  Dewey.get('spreadsheet:12345', :sheet => 1).should_not be_nil
96
96
  end
97
97
 
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe 'Dewey.put' do
4
4
  before(:each) { stub_dewey_auth }
5
-
5
+
6
6
  before(:all) do
7
7
  @psd = sample_file 'sample_drawing.psd'
8
8
  @txt = sample_file 'sample_document.txt'
@@ -17,7 +17,7 @@ describe 'Dewey.put' do
17
17
  it "should raise when uploading unsupported file types" do
18
18
  lambda { Dewey.put(@psd) }.should raise_exception(Dewey::DeweyError)
19
19
  end
20
-
20
+
21
21
  it "should raise when uploading a document with a bad mimetype" do
22
22
  lambda { Dewey.put(@bad) }.should raise_exception(Dewey::DeweyError)
23
23
  end
@@ -31,14 +31,14 @@ describe 'Dewey.put' do
31
31
  it "get a resource id after putting a document" do
32
32
  stub_request(:post, Dewey::GOOGLE_FEED_URL).
33
33
  to_return(:status => 201, :body => "<feed><entry><id>https://docs.google.com/feeds/id/document:12345</id></entry></feed>")
34
-
34
+
35
35
  Dewey.put(@txt).should eq('document:12345')
36
36
  end
37
-
37
+
38
38
  it "get a resource id after putting a spreadsheet" do
39
39
  stub_request(:post, Dewey::GOOGLE_FEED_URL).
40
40
  to_return(:status => 201, :body => "<feed><entry><id>https://docs.google.com/feeds/id/spreadsheet:12345</id></entry></feed>")
41
-
41
+
42
42
  Dewey.put(@spr).should eq('spreadsheet:12345')
43
43
  end
44
44
 
@@ -6,21 +6,21 @@ describe "Dewey.search" do
6
6
  it "can exactly match a single document" do
7
7
  stub_request(:get, "#{Dewey::GOOGLE_FEED_URL}?title=HR+Handbook&title-exact=true").
8
8
  to_return(:body => '<feed><id>https://docs.google.com/feeds/default/private/full</id><entry><id>document:12345</id></entry></feed>')
9
-
9
+
10
10
  Dewey.search('HR Handbook', :exact => true).should eq(['document:12345'])
11
11
  end
12
12
 
13
13
  it "can partially match a single document" do
14
14
  stub_request(:get, "#{Dewey::GOOGLE_FEED_URL}?title=Spec+101").
15
15
  to_return(:body => '<feed><entry><id>document:12345</id></entry></feed>')
16
-
16
+
17
17
  Dewey.search('Spec 101').should eq(['document:12345'])
18
18
  end
19
-
19
+
20
20
  it "can partially match multiple document" do
21
21
  stub_request(:get, "#{Dewey::GOOGLE_FEED_URL}?title=notes").
22
22
  to_return(:body => '<feed><entry><id>document:123</id></entry><entry><id>document:456</id></entry></feed>')
23
-
23
+
24
24
  Dewey.search('notes').should eq(['document:123', 'document:456'])
25
25
  end
26
26
  end
data/spec/core_spec.rb CHANGED
@@ -4,7 +4,7 @@ describe Dewey do
4
4
  describe "Establishing Authentication" do
5
5
  it "connects lazily" do
6
6
  Dewey.authentication :client, :email => 'example', :password => 'password'
7
- Dewey.authenticated?.should be_false
7
+ Dewey.authenticated?.should be_false
8
8
  end
9
9
  end
10
10
  end
data/spec/mime_spec.rb CHANGED
@@ -1,18 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Dewey::Mime do
4
-
4
+
5
5
  describe "Interpreting mime types from files" do
6
6
  it "should provide the correct document mime type" do
7
7
  @doc = sample_file 'sample_document.doc'
8
8
  @pdf = sample_file 'sample_document.pdf'
9
9
  @rtf = sample_file 'sample_document.rtf'
10
-
10
+
11
11
  Dewey::Mime.mime_type(@doc).should eq('application/msword')
12
12
  Dewey::Mime.mime_type(@pdf).should eq('application/pdf')
13
13
  Dewey::Mime.mime_type(@rtf).should eq('application/rtf')
14
14
  end
15
-
15
+
16
16
  it "should provide the correct drawing mime type" do
17
17
  @png = sample_file 'sample_drawing.png'
18
18
 
@@ -21,38 +21,55 @@ describe Dewey::Mime do
21
21
 
22
22
  it "should provide the correct presentation mime type" do
23
23
  @ppt = sample_file 'sample_presentation.ppt'
24
-
24
+
25
25
  Dewey::Mime.mime_type(@ppt).should eq('application/vnd.ms-powerpoint')
26
26
  end
27
-
27
+
28
28
  it "should provide the correct spreadsheet mime type" do
29
29
  @xls = sample_file 'sample_spreadsheet.xls'
30
30
  @csv = sample_file 'sample_spreadsheet.csv'
31
-
31
+
32
32
  Dewey::Mime.mime_type(@xls).should eq('application/vnd.ms-excel')
33
33
  Dewey::Mime.mime_type(@csv).should eq('text/csv')
34
34
  end
35
-
35
+
36
36
  it "should coerce problematic mime types" do
37
37
  @docx = sample_file 'sample_document.docx'
38
-
38
+
39
39
  Dewey::Mime.mime_type(@docx).should eq('application/vnd.openxmlformats-officedocument.wordprocessingml.document')
40
40
  end
41
-
41
+
42
42
  it "should correctly guess from a file without an extension" do
43
43
  @noext = sample_file 'sample_document'
44
-
44
+
45
45
  Dewey::Mime.mime_type(@noext).should eq('application/msword')
46
46
  end
47
47
  end
48
-
49
- describe "Guessing the service from a mime type" do
48
+
49
+ describe "Determining file extesion from files" do
50
+ context "when the filename has an extension" do
51
+ it "should pull the extension off the filename" do
52
+ @docx = sample_file 'sample_document.docx'
53
+
54
+ Dewey::Mime.extension(@docx).should eq('docx')
55
+ end
56
+ end
57
+ context "when the filename does not have an extension" do
58
+ it "should pull the extension off the filename" do
59
+ @docx = sample_file 'sample_document'
60
+
61
+ Dewey::Mime.extension(@docx).should eq('doc')
62
+ end
63
+ end
64
+ end
65
+
66
+ describe "Guessing the service from a mime type" do
50
67
  it "should correctly guess service when given a known type" do
51
68
  Dewey::Mime.guess_service('application/msword').should eq(:document)
52
69
  Dewey::Mime.guess_service('application/vnd.ms-powerpoint').should eq(:presentation)
53
70
  Dewey::Mime.guess_service('application/x-vnd.oasis.opendocument.spreadsheet').should eq(:spreadsheet)
54
71
  end
55
-
72
+
56
73
  it "should return nil for an unknown type" do
57
74
  Dewey::Mime.guess_service('bad/example').should be_nil
58
75
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Dewey::Validation do
4
-
4
+
5
5
  it "should return true for valid upload formats" do
6
6
  Dewey::Validation.valid_upload_format?(:txt, :document).should be_true
7
7
  Dewey::Validation.valid_upload_format?(:svg, :drawing).should be_true
metadata CHANGED
@@ -1,72 +1,68 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: dewey
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.9
4
5
  prerelease:
5
- version: 0.2.8
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Parker Selbert
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-04-19 00:00:00 -05:00
12
+ date: 2011-10-02 00:00:00.000000000 -05:00
14
13
  default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
17
16
  name: rake
18
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &2156571360 !ruby/object:Gem::Requirement
19
18
  none: false
20
- requirements:
19
+ requirements:
21
20
  - - ~>
22
- - !ruby/object:Gem::Version
21
+ - !ruby/object:Gem::Version
23
22
  version: 0.8.7
24
23
  type: :development
25
24
  prerelease: false
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
25
+ version_requirements: *2156571360
26
+ - !ruby/object:Gem::Dependency
28
27
  name: rspec
29
- requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirement: &2156570320 !ruby/object:Gem::Requirement
30
29
  none: false
31
- requirements:
30
+ requirements:
32
31
  - - ~>
33
- - !ruby/object:Gem::Version
34
- version: 2.3.0
32
+ - !ruby/object:Gem::Version
33
+ version: 2.6.0
35
34
  type: :development
36
35
  prerelease: false
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
36
+ version_requirements: *2156570320
37
+ - !ruby/object:Gem::Dependency
39
38
  name: webmock
40
- requirement: &id003 !ruby/object:Gem::Requirement
39
+ requirement: &2156569560 !ruby/object:Gem::Requirement
41
40
  none: false
42
- requirements:
41
+ requirements:
43
42
  - - ~>
44
- - !ruby/object:Gem::Version
45
- version: 1.4.0
43
+ - !ruby/object:Gem::Version
44
+ version: 1.7.6
46
45
  type: :development
47
46
  prerelease: false
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
47
+ version_requirements: *2156569560
48
+ - !ruby/object:Gem::Dependency
50
49
  name: yard
51
- requirement: &id004 !ruby/object:Gem::Requirement
50
+ requirement: &2156568900 !ruby/object:Gem::Requirement
52
51
  none: false
53
- requirements:
52
+ requirements:
54
53
  - - ~>
55
- - !ruby/object:Gem::Version
56
- version: 0.6.8
54
+ - !ruby/object:Gem::Version
55
+ version: 0.7.2
57
56
  type: :development
58
57
  prerelease: false
59
- version_requirements: *id004
58
+ version_requirements: *2156568900
60
59
  description: Light, simple Google Docs library for Ruby.
61
- email:
60
+ email:
62
61
  - parker@sorentwo.com
63
62
  executables: []
64
-
65
63
  extensions: []
66
-
67
64
  extra_rdoc_files: []
68
-
69
- files:
65
+ files:
70
66
  - .gitignore
71
67
  - .rspec
72
68
  - CHANGELOG.md
@@ -111,36 +107,32 @@ files:
111
107
  has_rdoc: true
112
108
  homepage: http://github.com/sorentwo/dewey
113
109
  licenses: []
114
-
115
110
  post_install_message:
116
111
  rdoc_options: []
117
-
118
- require_paths:
112
+ require_paths:
119
113
  - lib
120
- required_ruby_version: !ruby/object:Gem::Requirement
114
+ required_ruby_version: !ruby/object:Gem::Requirement
121
115
  none: false
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- hash: 3186217541912544096
126
- segments:
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ segments:
127
121
  - 0
128
- version: "0"
129
- required_rubygems_version: !ruby/object:Gem::Requirement
122
+ hash: -1290362203853795856
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
124
  none: false
131
- requirements:
132
- - - ">="
133
- - !ruby/object:Gem::Version
134
- hash: 3186217541912544096
135
- segments:
125
+ requirements:
126
+ - - ! '>='
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ segments:
136
130
  - 0
137
- version: "0"
131
+ hash: -1290362203853795856
138
132
  requirements: []
139
-
140
133
  rubyforge_project: dewey
141
134
  rubygems_version: 1.6.2
142
135
  signing_key:
143
136
  specification_version: 3
144
137
  summary: Simple Google Docs library.
145
138
  test_files: []
146
-