editable-image 0.23 → 0.25

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -1,8 +1,10 @@
1
1
  This is currently alpha software.
2
2
 
3
3
  A gem for interacting with online image editors. Currently, only Picnik is
4
- supported. This is not a straight API wrapper.See
4
+ supported. This is not a straight API wrapper. See
5
5
  http://github.com/haikuwebdev/editable_image_sample/ for a sample Rails app
6
6
  using attachment_fu and this gem to edit images.
7
7
 
8
+ You'll need the shoulda gem to run the tests.
9
+
8
10
  The gem is served from rubyforge. http://rubyforge.org/projects/editable-image/
@@ -1,15 +1,15 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "editable-image"
3
- s.version = "0.23"
4
- s.date = "2008-07-01"
3
+ s.version = "0.25"
4
+ s.date = "2008-09-02"
5
5
  s.summary = "Simplified interface to web-based image editors."
6
6
  s.email = "tj@haikuwebdev.com"
7
- s.homepage = "http://github.com/haikuwebdev/editable-image/"
7
+ s.homepage = ""
8
8
  s.description = "Simplified interface to web-based image editors."
9
9
  s.has_rdoc = false
10
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"]
11
+ s.files = ["editable-image.gemspec", "README", "lib/multipart.rb", "lib/editable-image.rb", "lib/editable-image/exceptions.rb", "lib/picnik/picnik.rb"]
12
+ s.test_files = ["test/picnik_test.rb", "test/files/logo.gif", "test/files/test.txt"]
13
13
  s.add_dependency("mime-types", [">= 1.15"])
14
14
  s.add_dependency("Shoulda", [">= 1.1.1"])
15
15
  end
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'mime/types'
3
+ require 'multipart'
4
+ require 'editable-image/exceptions'
5
+ require 'picnik/picnik'
@@ -0,0 +1,6 @@
1
+ module EditableImage
2
+ class EditableImageError < StandardError; end;
3
+ class InvalidParametersError < EditableImageError; end
4
+ class InvalidFileTypeError < EditableImageError; end
5
+ class InvalidFilenameError < EditableImageError; end
6
+ end
@@ -0,0 +1,63 @@
1
+ module EditableImage
2
+ class Picnik
3
+
4
+ PICNIK_API_PARAMETERS = %w(
5
+ apikey sig expires locale import returntype title export export_agent
6
+ export_field export_method export_title redirect imageid original_thumb
7
+ replace thumbs out_format out_quality out_maxsize out_maxwidth out_maxheight
8
+ exclude host_name default_in default_out page close_target expand_button
9
+ )
10
+
11
+ def self.url(full_filename, parameters)
12
+ raise EditableImage::InvalidParametersError unless api_key_in?(parameters)
13
+ url = ''
14
+ File.open(full_filename) do |file|
15
+ raise EditableImage::InvalidFileTypeError unless image?(full_filename)
16
+ http = Net::HTTP.new('www.picnik.com')
17
+ http.start do |http|
18
+ request = Net::HTTP::Post.new('/service/')
19
+ request.multipart_params = request_parameters(file, parameters)
20
+ response = http.request(request)
21
+ url = response.body
22
+ end
23
+ end
24
+ url
25
+ rescue EditableImage::InvalidFileTypeError => e
26
+ raise e, "File must be an image."
27
+ rescue EditableImage::InvalidParametersError => e
28
+ raise e, "Parameters must include the apikey."
29
+ rescue Errno::ENOENT => e
30
+ raise EditableImage::InvalidFilenameError.new, e.message
31
+ end
32
+
33
+ private
34
+
35
+ def self.request_parameters(file, parameters)
36
+ required_parameters = { :import => 'image_data', :image_data => file, :returntype => 'text' }
37
+ scrub_parameters(required_parameters.merge(parameters))
38
+ end
39
+
40
+ def self.scrub_parameters(parameters)
41
+ scrubbed_parameters = {}
42
+ parameters.each do |key, value|
43
+ scrubbed_parameters[parameter_key(key)] = value
44
+ end
45
+ scrubbed_parameters
46
+ end
47
+
48
+ def self.parameter_key(key)
49
+ key = key.to_s
50
+ PICNIK_API_PARAMETERS.include?(key) ? '_' + key : key
51
+ end
52
+
53
+ def self.image?(filename)
54
+ MIME::Types.of(filename).first.media_type == 'image'
55
+ end
56
+
57
+ # NOTE: Generalize, DRY up if needed. For now YAGNI.
58
+ def self.api_key_in?(parameters)
59
+ scrub_parameters(parameters).has_key?('_apikey')
60
+ end
61
+
62
+ end
63
+ end
File without changes
data/test/picnik_test.rb CHANGED
@@ -1,32 +1,30 @@
1
- require File.dirname(__FILE__) + '/../lib/picnik'
1
+ require File.dirname(__FILE__) + '/../lib/editable-image'
2
2
  require 'test/unit'
3
3
  require 'shoulda'
4
4
 
5
+
5
6
  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
-
7
+
12
8
  context "Request parameters" do
13
9
  setup do
14
- def Picnik.public_request_parameters(*args)
15
- request_parameters(*args)
10
+ EditableImage::Picnik.class_eval do
11
+ def self.public_request_parameters(*args)
12
+ request_parameters(*args)
13
+ end
16
14
  end
17
15
  @file = File.open("files/logo.gif")
18
- parameters = {:apikey => 'this_is_a_test_picnik_apikey'}
19
- @request_parameters = Picnik.public_request_parameters(@file, parameters)
16
+ parameters = {:apikey => 'test_picnik_apikey'}
17
+ @request_parameters = EditableImage::Picnik.public_request_parameters(@file, parameters)
20
18
  end
21
19
 
22
20
  teardown do
23
21
  @file.close
24
22
  end
25
23
 
26
- should "include _import with correct value" do
24
+ should "include _import" do
27
25
  assert @request_parameters.keys.include?('_import')
28
26
  end
29
-
27
+
30
28
  should "have correct value for _import" do
31
29
  assert_equal 'image_data', @request_parameters['_import']
32
30
  end
@@ -37,35 +35,106 @@ class PicnikTest < Test::Unit::TestCase
37
35
 
38
36
  should "not have nil image_data" do
39
37
  assert_not_nil @request_parameters['image_data']
40
- end
38
+ end
39
+
40
+ should "include _returntype" do
41
+ assert @request_parameters.keys.include?('_returntype')
42
+ end
43
+
44
+ should "have returntype of text" do
45
+ assert_equal 'text', @request_parameters['_returntype']
46
+ end
47
+
41
48
  end
42
49
 
43
50
  context "Parameter key" do
44
51
  setup do
45
- def Picnik.public_parameter_key(*args)
46
- parameter_key(*args)
52
+ EditableImage::Picnik.class_eval do
53
+ def self.public_parameter_key(*args)
54
+ parameter_key(*args)
55
+ end
47
56
  end
48
57
  end
49
-
58
+
50
59
  should "be stringified" do
51
- assert_equal 'foo', Picnik.public_parameter_key(:foo)
60
+ assert_equal 'foo', EditableImage::Picnik.public_parameter_key(:foo)
52
61
  end
53
-
62
+
54
63
  should "add underscore for Picnik API parameter" do
55
- assert_equal '_apikey', Picnik.public_parameter_key(:apikey)
64
+ assert_equal '_apikey', EditableImage::Picnik.public_parameter_key(:apikey)
56
65
  end
57
-
66
+
58
67
  should "not add underscore for non-Picnik API parameter" do
59
- assert_equal 'foo', Picnik.public_parameter_key('foo')
68
+ assert_equal 'foo', EditableImage::Picnik.public_parameter_key('foo')
60
69
  end
61
-
70
+
62
71
  should "not add underscore for Picnik API parameter that already has one" do
63
- assert_equal '_apikey', Picnik.public_parameter_key('_apikey')
72
+ assert_equal '_apikey', EditableImage::Picnik.public_parameter_key('_apikey')
64
73
  end
65
-
74
+
66
75
  should "keep underscore for non Picnik API parameter" do
67
- assert_equal '_method', Picnik.public_parameter_key('_method')
76
+ assert_equal '_method', EditableImage::Picnik.public_parameter_key('_method')
77
+ end
78
+ end
79
+
80
+ context "A bad filename" do
81
+ setup do
82
+ @filename = 'bad_filename'
83
+ @parameters = {:apikey => 'test'}
84
+ end
85
+
86
+ should "raise EditableImage::InvalidFilenameError exception" do
87
+ assert_raise(EditableImage::InvalidFilenameError) do
88
+ EditableImage::Picnik.url(@filename, @parameters)
89
+ end
90
+ end
91
+
92
+ should "have exception message containing 'no such file'" do
93
+ begin
94
+ EditableImage::Picnik.url(@filename, @parameters)
95
+ rescue EditableImage::InvalidFilenameError => e
96
+ assert_match /no such file/i, e.message
97
+ end
68
98
  end
69
99
  end
70
100
 
101
+ context "A non-image file" do
102
+ setup do
103
+ @non_image_filename = File.expand_path("files/test.txt")
104
+ @parameters = {:apikey => 'test'}
105
+ end
106
+
107
+ should "raise EditableImage::InvalidFileTypeError exception" do
108
+ assert_raise(EditableImage::InvalidFileTypeError) do
109
+ EditableImage::Picnik.url(@non_image_filename, @parameters)
110
+ end
111
+ end
112
+
113
+ should "have exception message containing 'foo'" do
114
+ begin
115
+ EditableImage::Picnik.url(@non_image_filename, @parameters)
116
+ rescue EditableImage::InvalidFileTypeError => e
117
+ assert_match /must be an image/i, e.message
118
+ end
119
+ end
120
+ end
121
+
122
+ context "A request for url without apikey in parameters" do
123
+
124
+ should "raise EditableImage::InvalidParametersError" do
125
+ assert_raise(EditableImage::InvalidParametersError) do
126
+ EditableImage::Picnik.url('some_filename', {})
127
+ end
128
+ end
129
+
130
+ should "raise EditableImage::InvalidParametersError exception with message containing 'must include the apikey'" do
131
+ begin
132
+ EditableImage::Picnik.url('some_filename', {})
133
+ rescue EditableImage::InvalidParametersError => e
134
+ assert_match /must include the apikey/i, e.message
135
+ end
136
+ end
137
+
138
+ end
139
+
71
140
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: editable-image
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.23"
4
+ version: "0.25"
5
5
  platform: ruby
6
6
  authors:
7
7
  - TJ Stankus
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-07-01 00:00:00 -04:00
12
+ date: 2008-09-02 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -41,12 +41,14 @@ extensions: []
41
41
  extra_rdoc_files: []
42
42
 
43
43
  files:
44
- - README
45
44
  - editable-image.gemspec
45
+ - README
46
46
  - lib/multipart.rb
47
- - lib/picnik.rb
47
+ - lib/editable-image.rb
48
+ - lib/editable-image/exceptions.rb
49
+ - lib/picnik/picnik.rb
48
50
  has_rdoc: false
49
- homepage: http://github.com/haikuwebdev/editable-image/
51
+ homepage: ""
50
52
  post_install_message:
51
53
  rdoc_options: []
52
54
 
@@ -74,3 +76,4 @@ summary: Simplified interface to web-based image editors.
74
76
  test_files:
75
77
  - test/picnik_test.rb
76
78
  - test/files/logo.gif
79
+ - test/files/test.txt
data/lib/picnik.rb DELETED
@@ -1,55 +0,0 @@
1
- require 'rubygems'
2
- require 'multipart'
3
-
4
- class Picnik
5
-
6
- PICNIK_API_PARAMETERS = %w(
7
- apikey sig expires locale import returntype title export export_agent
8
- export_field export_method export_title redirect imageid original_thumb
9
- replace thumbs out_format out_quality out_maxsize out_maxwidth out_maxheight
10
- exclude host_name default_in default_out page close_target expand_button
11
- )
12
-
13
- class << self
14
-
15
- def url(full_filename, parameters)
16
- url = ''
17
- File.open(full_filename) do |file|
18
- http = Net::HTTP.new('www.picnik.com')
19
- http.start do |http|
20
- request = Net::HTTP::Post.new('/service/')
21
- request.multipart_params = request_parameters(file, parameters)
22
- response = http.request(request)
23
- url = parse_image_url_from(response)
24
- end
25
- end
26
- url
27
- end
28
-
29
- private
30
-
31
- def request_parameters(file, parameters)
32
- required_parameters = { :import => 'image_data', :image_data => file, :returntype => 'text' }
33
- scrub_parameters(required_parameters.merge(parameters))
34
- end
35
-
36
- def scrub_parameters(parameters)
37
- scrubbed_parameters = {}
38
- parameters.each do |key, value|
39
- scrubbed_parameters[parameter_key(key)] = value
40
- end
41
- scrubbed_parameters
42
- end
43
-
44
- def parameter_key(key)
45
- key = key.to_s
46
- PICNIK_API_PARAMETERS.include?(key) ? '_' + key : key
47
- end
48
-
49
- def parse_image_url_from(response)
50
- response.body
51
- end
52
-
53
- end
54
-
55
- end