editable-image 0.22

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 ADDED
@@ -0,0 +1,7 @@
1
+ This is currently alpha software.
2
+
3
+ A gem for interacting with online image editors. Currently, only Picnik is
4
+ supported. This is not a straight API wrapper.
5
+
6
+ See http://github.com/haikuwebdev/editable_image_sample/ for a sample Rails app
7
+ using attachment_fu and this gem to edit images.
@@ -0,0 +1,15 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "editable-image"
3
+ s.version = "0.22"
4
+ s.date = "2008-06-12"
5
+ s.summary = "Simplified interface to web-based image editors."
6
+ s.email = "tj@haikuwebdev.com"
7
+ s.homepage = "http://github.com/haikuwebdev/editable-image/"
8
+ s.description = "Simplified interface to web-based image editors."
9
+ s.has_rdoc = false
10
+ s.authors = ["TJ Stankus"]
11
+ s.files = ["README", "editable-image.gemspec", "lib/multipart.rb", "lib/picnik.rb"]
12
+ s.test_files = ["test/picnik_test.rb", "test/files/logo.gif"]
13
+ s.add_dependency("mime-types", [">= 1.15"])
14
+ s.add_dependency("Shoulda", [">= 1.1.1"])
15
+ end
data/lib/multipart.rb ADDED
@@ -0,0 +1,37 @@
1
+ # See http://pivots.pivotallabs.com/users/damon/blog/articles/227-standup-04-27-07-testing-file-uploads
2
+
3
+ require 'net/http'
4
+ require 'mime/types'
5
+
6
+ class Net::HTTP::Post
7
+
8
+ def multipart_params=(params = {})
9
+ boundary_token = [Array.new(8) {rand(256)}].join
10
+ self.content_type = "multipart/form-data; boundary=#{boundary_token}"
11
+ boundary_marker = "--#{boundary_token}\r\n"
12
+ self.body = params.map { |param_name, param_value|
13
+ boundary_marker + case param_value
14
+ when String
15
+ text_to_multipart(param_name, param_value)
16
+ when File
17
+ file_to_multipart(param_name, param_value)
18
+ end
19
+ }.join('') + "--#{boundary_token}--\r\n"
20
+ end
21
+
22
+ protected
23
+
24
+ def file_to_multipart(key, file)
25
+ filename = File.basename(file.path)
26
+ mime_types = MIME::Types.of(filename)
27
+ mime_type = mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
28
+ part = "Content-Disposition: form-data; name=#{key}; filename=#{filename}\r\n"
29
+ part += "Content-Transfer-Encoding: binary\r\n"
30
+ part += "Content-Type: #{mime_type}\r\n\r\n#{file.read}\r\n"
31
+ end
32
+
33
+ def text_to_multipart(key,value)
34
+ "Content-Disposition: form-data; name=\"#{key}\"\r\n\r\n#{value}\r\n"
35
+ end
36
+
37
+ end
data/lib/picnik.rb ADDED
@@ -0,0 +1,57 @@
1
+ require 'rubygems'
2
+ require 'multipart'
3
+
4
+ class Picnik
5
+
6
+ PICNIK_API_PARAMETERS = %w(
7
+ apikey import returntype title export export_agent export_field
8
+ export_method export_title imageid original_thumb redirect replace exclude
9
+ host_name default_in default_out page close_target expand_button
10
+ )
11
+
12
+ class << self
13
+
14
+ def url(full_filename, parameters)
15
+ url = ''
16
+ File.open(full_filename) do |file|
17
+ http = Net::HTTP.new('www.picnik.com')
18
+ http.start do |http|
19
+ request = Net::HTTP::Post.new('/service/')
20
+ request.multipart_params = request_parameters(file, parameters)
21
+ response = http.request(request)
22
+ url = parse_image_url_from(response)
23
+ end
24
+ end
25
+ url
26
+ end
27
+
28
+ private
29
+
30
+ def request_parameters(file, parameters)
31
+ import_parameters = { :import => 'image_data', :image_data => file }
32
+ scrub_parameters(import_parameters.merge(parameters))
33
+ end
34
+
35
+ def scrub_parameters(parameters)
36
+ scrubbed_parameters = {}
37
+ parameters.each do |key, value|
38
+ scrubbed_parameters[parameter_key(key)] = value
39
+ end
40
+ scrubbed_parameters
41
+ end
42
+
43
+ def parameter_key(key)
44
+ key = key.to_s
45
+ PICNIK_API_PARAMETERS.include?(key) ? '_' + key : key
46
+ end
47
+
48
+ def parse_image_url_from(response)
49
+ body = response.body
50
+ start_index = body.index('>') + 1
51
+ end_index = body.index('<', start_index)
52
+ body.slice((start_index...end_index))
53
+ end
54
+
55
+ end
56
+
57
+ end
Binary file
@@ -0,0 +1,71 @@
1
+ require File.dirname(__FILE__) + '/../lib/picnik'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ class PicnikTest < Test::Unit::TestCase
6
+
7
+ # TODO: test response
8
+ # TODO: test bad filename passed to url
9
+ # TODO: test non-image filename passed to url
10
+ # TODO: exception for not passing apikey to parameters?
11
+
12
+ context "Request parameters" do
13
+ setup do
14
+ def Picnik.public_request_parameters(*args)
15
+ request_parameters(*args)
16
+ end
17
+ @file = File.open("files/logo.gif")
18
+ parameters = {:apikey => 'this_is_a_test_picnik_apikey'}
19
+ @request_parameters = Picnik.public_request_parameters(@file, parameters)
20
+ end
21
+
22
+ teardown do
23
+ @file.close
24
+ end
25
+
26
+ should "include _import with correct value" do
27
+ assert @request_parameters.keys.include?('_import')
28
+ end
29
+
30
+ should "have correct value for _import" do
31
+ assert_equal 'image_data', @request_parameters['_import']
32
+ end
33
+
34
+ should "include image_data" do
35
+ assert @request_parameters.keys.include?('image_data')
36
+ end
37
+
38
+ should "not have nil image_data" do
39
+ assert_not_nil @request_parameters['image_data']
40
+ end
41
+ end
42
+
43
+ context "Parameter key" do
44
+ setup do
45
+ def Picnik.public_parameter_key(*args)
46
+ parameter_key(*args)
47
+ end
48
+ end
49
+
50
+ should "be stringified" do
51
+ assert_equal 'foo', Picnik.public_parameter_key(:foo)
52
+ end
53
+
54
+ should "add underscore for Picnik API parameter" do
55
+ assert_equal '_apikey', Picnik.public_parameter_key(:apikey)
56
+ end
57
+
58
+ should "not add underscore for non-Picnik API parameter" do
59
+ assert_equal 'foo', Picnik.public_parameter_key('foo')
60
+ end
61
+
62
+ should "not add underscore for Picnik API parameter that already has one" do
63
+ assert_equal '_apikey', Picnik.public_parameter_key('_apikey')
64
+ end
65
+
66
+ should "keep underscore for non Picnik API parameter" do
67
+ assert_equal '_method', Picnik.public_parameter_key('_method')
68
+ end
69
+ end
70
+
71
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: editable-image
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.22"
5
+ platform: ruby
6
+ authors:
7
+ - TJ Stankus
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-06-12 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: mime-types
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "1.15"
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: Shoulda
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 1.1.1
32
+ version:
33
+ description: Simplified interface to web-based image editors.
34
+ email: tj@haikuwebdev.com
35
+ executables: []
36
+
37
+ extensions: []
38
+
39
+ extra_rdoc_files: []
40
+
41
+ files:
42
+ - README
43
+ - editable-image.gemspec
44
+ - lib/multipart.rb
45
+ - lib/picnik.rb
46
+ has_rdoc: false
47
+ homepage: http://github.com/haikuwebdev/editable-image/
48
+ post_install_message:
49
+ rdoc_options: []
50
+
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ version:
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ version:
65
+ requirements: []
66
+
67
+ rubyforge_project:
68
+ rubygems_version: 1.1.1
69
+ signing_key:
70
+ specification_version: 2
71
+ summary: Simplified interface to web-based image editors.
72
+ test_files:
73
+ - test/picnik_test.rb
74
+ - test/files/logo.gif