httpimagestore 1.8.1 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile +7 -7
  3. data/Gemfile.lock +20 -20
  4. data/README.md +165 -37
  5. data/Rakefile +7 -2
  6. data/VERSION +1 -1
  7. data/bin/httpimagestore +74 -41
  8. data/lib/httpimagestore/configuration/file.rb +20 -11
  9. data/lib/httpimagestore/configuration/handler.rb +96 -257
  10. data/lib/httpimagestore/configuration/handler/source_store_base.rb +37 -0
  11. data/lib/httpimagestore/configuration/handler/statement.rb +114 -0
  12. data/lib/httpimagestore/configuration/identify.rb +17 -9
  13. data/lib/httpimagestore/configuration/output.rb +33 -61
  14. data/lib/httpimagestore/configuration/path.rb +2 -2
  15. data/lib/httpimagestore/configuration/request_state.rb +131 -0
  16. data/lib/httpimagestore/configuration/s3.rb +41 -29
  17. data/lib/httpimagestore/configuration/thumbnailer.rb +189 -96
  18. data/lib/httpimagestore/configuration/validate_hmac.rb +170 -0
  19. data/lib/httpimagestore/error_reporter.rb +6 -1
  20. data/lib/httpimagestore/ruby_string_template.rb +10 -19
  21. metadata +40 -102
  22. data/.rspec +0 -1
  23. data/features/cache-control.feature +0 -41
  24. data/features/compatibility.feature +0 -165
  25. data/features/data-uri.feature +0 -55
  26. data/features/encoding.feature +0 -103
  27. data/features/error-reporting.feature +0 -281
  28. data/features/flexi.feature +0 -259
  29. data/features/health-check.feature +0 -29
  30. data/features/request-matching.feature +0 -211
  31. data/features/rewrite.feature +0 -122
  32. data/features/s3-store-and-thumbnail.feature +0 -82
  33. data/features/source-failover.feature +0 -71
  34. data/features/step_definitions/httpimagestore_steps.rb +0 -203
  35. data/features/storage.feature +0 -198
  36. data/features/support/env.rb +0 -116
  37. data/features/support/test-large.jpg +0 -0
  38. data/features/support/test.empty +0 -0
  39. data/features/support/test.jpg +0 -0
  40. data/features/support/test.png +0 -0
  41. data/features/support/test.txt +0 -1
  42. data/features/support/tiny.png +0 -0
  43. data/features/xid-forwarding.feature +0 -49
  44. data/httpimagestore.gemspec +0 -145
  45. data/load_test/load_test.1k.23a022f6e.m1.small-comp.csv +0 -3
  46. data/load_test/load_test.1k.ec9bde794.m1.small.csv +0 -4
  47. data/load_test/load_test.jmx +0 -317
  48. data/load_test/thumbnail_specs.csv +0 -11
  49. data/load_test/thumbnail_specs_v2.csv +0 -10
  50. data/spec/configuration_file_spec.rb +0 -333
  51. data/spec/configuration_handler_spec.rb +0 -255
  52. data/spec/configuration_identify_spec.rb +0 -67
  53. data/spec/configuration_output_spec.rb +0 -821
  54. data/spec/configuration_path_spec.rb +0 -138
  55. data/spec/configuration_s3_spec.rb +0 -911
  56. data/spec/configuration_source_failover_spec.rb +0 -101
  57. data/spec/configuration_spec.rb +0 -90
  58. data/spec/configuration_thumbnailer_spec.rb +0 -483
  59. data/spec/ruby_string_template_spec.rb +0 -61
  60. data/spec/spec_helper.rb +0 -89
  61. data/spec/support/compute.jpg +0 -0
  62. data/spec/support/cuba_response_env.rb +0 -40
  63. data/spec/support/full.cfg +0 -183
  64. data/spec/support/utf_string.txt +0 -1
@@ -1,198 +0,0 @@
1
- Feature: Storing images under different names
2
- Storage supports UUID and SHA digest based auto generated storage as well as user provided via request or static configuration string.
3
-
4
- Background:
5
- Given httpthumbnailer server is running at http://localhost:3100/health_check
6
- Given httpimagestore server is running at http://localhost:3000/health_check with the following configuration
7
- """
8
- path "input_digest" "#{input_digest}"
9
- path "input_sha256" "#{input_sha256}"
10
- path "image_digest" "#{image_digest}"
11
- path "image_sha256" "#{image_sha256}"
12
- path "uuid" "#{uuid}"
13
- path "image_meta" "#{image_width}x#{image_height}.#{image_mime_extension}"
14
- path "input_image_meta" "#{input_image_width}x#{input_image_height}.#{input_image_mime_extension}"
15
-
16
- post "images" "input_digest" {
17
- thumbnail "input" "thumbnail" operation="crop" width="50" height="50"
18
- store_file "thumbnail" root="/tmp" path="input_digest"
19
- output_store_path "thumbnail"
20
- }
21
-
22
- post "images" "input_sha256" {
23
- thumbnail "input" "thumbnail" operation="crop" width="50" height="50"
24
- store_file "thumbnail" root="/tmp" path="input_sha256"
25
- output_store_path "thumbnail"
26
- }
27
-
28
- post "images" "image_digest" {
29
- thumbnail "input" "thumbnail" operation="crop" width="50" height="50"
30
- store_file "thumbnail" root="/tmp" path="image_digest"
31
- output_store_path "thumbnail"
32
- }
33
-
34
- post "images" "image_sha256" {
35
- thumbnail "input" "thumbnail" operation="crop" width="50" height="50"
36
- store_file "thumbnail" root="/tmp" path="image_sha256"
37
- output_store_path "thumbnail"
38
- }
39
-
40
- post "images" "uuid" {
41
- store_file "input" root="/tmp" path="uuid"
42
- output_store_path "input"
43
- }
44
-
45
- post "images" "image_meta" "identify" {
46
- identify "input"
47
- store_file "input" root="/tmp" path="image_meta"
48
- output_store_path "input"
49
- }
50
-
51
- post "images" "image_meta" "thumbnail" "input" {
52
- thumbnail "input" "thumbnail" operation="crop" width="50" height="100"
53
- store_file "input" root="/tmp" path="image_meta"
54
- output_store_path "input"
55
- }
56
-
57
- post "images" "image_meta" "thumbnails" "input" {
58
- thumbnail "input" {
59
- "thumbnail" operation="crop" width="50" height="100"
60
- }
61
-
62
- store_file "input" root="/tmp" path="image_meta"
63
- output_store_path "input"
64
- }
65
-
66
- post "images" "image_meta" "thumbnail" {
67
- thumbnail "input" "thumbnail" operation="crop" width="50" height="100"
68
- store_file "thumbnail" root="/tmp" path="image_meta"
69
- output_store_path "thumbnail"
70
- }
71
-
72
- post "images" "image_meta" "thumbnails" {
73
- thumbnail "input" {
74
- "thumbnail" operation="crop" width="50" height="100"
75
- }
76
- store_file "thumbnail" root="/tmp" path="image_meta"
77
- output_store_path "thumbnail"
78
- }
79
-
80
- post "images" "input_image_meta" "thumbnail" {
81
- thumbnail "input" "thumbnail" operation="crop" width="50" height="100"
82
- store_file "thumbnail" root="/tmp" path="input_image_meta"
83
- output_store_path "thumbnail"
84
- }
85
- """
86
-
87
- @storage @input_digest
88
- Scenario: Posting picture to file system under input data digest
89
- Given there is no file /tmp/b0fe25319ba5909a
90
- Given test.png file content as request body
91
- When I do POST request http://localhost:3000/images/input_digest
92
- Then response status will be 200
93
- And response content type will be text/plain
94
- And response body will be CRLF ended lines
95
- """
96
- b0fe25319ba5909a
97
- """
98
- Then file /tmp/b0fe25319ba5909a will contain PNG image of size 50x50
99
-
100
- @storage @input_sha256
101
- Scenario: Posting picture to file system under input data digest
102
- Given there is no file /tmp/b0fe25319ba5909aa97fded546847a96d7fdf26e18715b0cfccfcbee52dce57e
103
- Given test.png file content as request body
104
- When I do POST request http://localhost:3000/images/input_sha256
105
- Then response status will be 200
106
- And response content type will be text/plain
107
- And response body will be CRLF ended lines
108
- """
109
- b0fe25319ba5909aa97fded546847a96d7fdf26e18715b0cfccfcbee52dce57e
110
- """
111
- Then file /tmp/b0fe25319ba5909aa97fded546847a96d7fdf26e18715b0cfccfcbee52dce57e will contain PNG image of size 50x50
112
-
113
- # Following tests depend on libpng/ImageMagick version
114
- #@storage @image_digest
115
- #Scenario: Posting picture to file system under input data digest
116
- #Given there is no file /tmp/b0fe25319ba5909a
117
- #Given test.png file content as request body
118
- #When I do POST request http://localhost:3000/images/image_digest
119
- #Then response status will be 200
120
- #And response content type will be text/plain
121
- #And response body will be CRLF ended lines
122
- #"""
123
- #091000e2c0aee836
124
- #"""
125
- #Then file /tmp/091000e2c0aee836 will contain PNG image of size 50x50
126
-
127
- #@storage @image_sha256
128
- #Scenario: Posting picture to file system under input data digest
129
- #Given there is no file /tmp/b0fe25319ba5909aa97fded546847a96d7fdf26e18715b0cfccfcbee52dce57e
130
- #Given test.png file content as request body
131
- #When I do POST request http://localhost:3000/images/image_sha256
132
- #Then response status will be 200
133
- #And response content type will be text/plain
134
- #And response body will be CRLF ended lines
135
- #"""
136
- #091000e2c0aee836fff432c1151faba86d46690c900c0f6355247a353defa37f
137
- #"""
138
- #Then file /tmp/091000e2c0aee836fff432c1151faba86d46690c900c0f6355247a353defa37f will contain PNG image of size 50x50
139
-
140
- @storage @uuid
141
- Scenario: Posting picture to file system under input data digest
142
- Given test.png file content as request body
143
- When I do POST request http://localhost:3000/images/uuid
144
- Then response status will be 200
145
- And response content type will be text/plain
146
- And response body will contain UUID
147
-
148
- @storage @image_meta @identify
149
- Scenario: Posting picture to file system under input data digest
150
- Given there is no file /tmp/509x719.png
151
- Given test.png file content as request body
152
- When I do POST request http://localhost:3000/images/image_meta/identify
153
- Then response status will be 200
154
- And response content type will be text/plain
155
- And response body will be CRLF ended lines
156
- """
157
- 509x719.png
158
- """
159
- Then file /tmp/509x719.png will contain PNG image of size 509x719
160
-
161
- @storage @image_meta @thumbnail
162
- Scenario: Posting picture to file system under input data digest
163
- Given test.png file content as request body
164
- Given there is no file /tmp/50x100.png
165
- When I do POST request http://localhost:3000/images/image_meta/thumbnail
166
- Then response status will be 200
167
- And response content type will be text/plain
168
- And response body will be CRLF ended lines
169
- """
170
- 50x100.png
171
- """
172
- Then file /tmp/50x100.png will contain PNG image of size 50x100
173
-
174
- @storage @image_meta @thumbnails
175
- Scenario: Posting picture to file system under input data digest
176
- Given test.png file content as request body
177
- Given there is no file /tmp/50x100.png
178
- When I do POST request http://localhost:3000/images/image_meta/thumbnails
179
- Then response status will be 200
180
- And response content type will be text/plain
181
- And response body will be CRLF ended lines
182
- """
183
- 50x100.png
184
- """
185
- Then file /tmp/50x100.png will contain PNG image of size 50x100
186
-
187
- @storage @input_image_meta
188
- Scenario: Input image meta variables
189
- Given there is no file /tmp/509x719.png
190
- Given test.png file content as request body
191
- When I do POST request http://localhost:3000/images/input_image_meta/thumbnail
192
- Then response status will be 200
193
- And response content type will be text/plain
194
- And response body will be CRLF ended lines
195
- """
196
- 509x719.png
197
- """
198
- Then file /tmp/509x719.png will contain PNG image of size 50x100
@@ -1,116 +0,0 @@
1
- require 'bundler'
2
- begin
3
- Bundler.setup(:default, :development)
4
- rescue Bundler::BundlerError => e
5
- $stderr.puts e.message
6
- $stderr.puts "Run `bundle install` to install missing gems"
7
- exit e.status_code
8
- end
9
-
10
- $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
11
- require 'rspec/expectations'
12
-
13
- require 'daemon'
14
- require 'timeout'
15
- require 'faraday'
16
- require "open3"
17
- require "thread"
18
- require 'tempfile'
19
- require 'RMagick'
20
- require 'aws-sdk'
21
- require 'httpimagestore/aws_sdk_regions_hack'
22
- require 'digest'
23
-
24
- class String
25
- def replace_s3_variables
26
- string = self.dup
27
- string.gsub!(/@AWS_ACCESS_KEY_ID@/, ENV['AWS_ACCESS_KEY_ID'])
28
- string.gsub!(/@AWS_SECRET_ACCESS_KEY@/, ENV['AWS_SECRET_ACCESS_KEY'])
29
- string.gsub!(/@AWS_S3_TEST_BUCKET@/, ENV['AWS_S3_TEST_BUCKET'])
30
- string
31
- end
32
- end
33
-
34
- def gem_dir
35
- Pathname.new(__FILE__).dirname + '..' + '..'
36
- end
37
-
38
- def features_dir
39
- gem_dir + 'features'
40
- end
41
-
42
- def support_dir
43
- features_dir + 'support'
44
- end
45
-
46
- def script(file)
47
- gem_dir + 'bin' + file
48
- end
49
-
50
- def http_client
51
- @faraday ||= Faraday.new
52
- end
53
-
54
- def request(method, uri, body, headers)
55
- http_client.run_request(method.downcase.to_sym, uri.replace_s3_variables, body, headers || {})
56
- end
57
-
58
- def get(url)
59
- http_client.get(url).body
60
- end
61
-
62
- def get_headers(url)
63
- http_client.get(url).headers
64
- end
65
-
66
- @@running_cmd = {}
67
- def start_server(cmd, pid_file, log_file, test_url)
68
- if @@running_cmd[pid_file]
69
- return if @@running_cmd[pid_file] == cmd
70
- stop_server(pid_file)
71
- end
72
-
73
- fork do
74
- Daemon.daemonize(pid_file, log_file)
75
- log_file = Pathname.new(log_file)
76
- log_file.truncate(0) if log_file.exist?
77
- exec(cmd)
78
- end
79
-
80
- @@running_cmd[pid_file] = cmd
81
-
82
- ppid = Process.pid
83
- at_exit do
84
- stop_server(pid_file) if Process.pid == ppid
85
- end
86
-
87
- Timeout.timeout(10) do
88
- begin
89
- get test_url
90
- rescue Faraday::Error::ConnectionFailed
91
- sleep 0.1
92
- retry
93
- end
94
- end
95
- end
96
-
97
- def stop_server(pid_file)
98
- pid_file = Pathname.new(pid_file)
99
- return unless pid_file.exist?
100
-
101
- #STDERR.puts http_client.get("http://localhost:3000/stats").body if pid_file.to_s.include? 'httpimagestore'
102
- pid = pid_file.read.strip.to_i
103
-
104
- Timeout.timeout(20) do
105
- begin
106
- loop do
107
- Process.kill("TERM", pid)
108
- sleep 0.1
109
- end
110
- rescue Errno::ESRCH
111
- @@running_cmd.delete pid_file.to_s
112
- pid_file.unlink
113
- end
114
- end
115
- end
116
-
File without changes
Binary file
Binary file
@@ -1 +0,0 @@
1
- hello world
Binary file
@@ -1,49 +0,0 @@
1
- Feature: Forwarding of transaction ID header to thumbnailer
2
- HTTP Image Store should forward transaction ID header found in the request to HTTP Thumbnailer
3
-
4
- Background:
5
- Given httpthumbnailer server is running at http://localhost:3100/health_check
6
- Given httpimagestore server is running at http://localhost:3000/ with the following configuration
7
- """
8
- post "identify" {
9
- identify "input"
10
- }
11
-
12
- post "single" {
13
- thumbnail "input" "thumbnail" operation="pad" width="8" height="8"
14
- }
15
-
16
- post "multi" {
17
- thumbnail "input" {
18
- "small" operation="crop" width=128 height=128 format="jpeg"
19
- "tiny_png" operation="crop" width=32 height=32 format="png"
20
- }
21
- }
22
- """
23
-
24
- @xid-forwarding
25
- Scenario: Should forward XID with identify requests
26
- Given tiny.png file content as request body
27
- And XID header set to 123
28
- When I do POST request http://localhost:3000/identify
29
- Then response status will be 200
30
- And httpimagestore log will contain xid="123"
31
- And httpthumbnailer log will contain xid="123"
32
-
33
- @xid-forwarding
34
- Scenario: Should forward XID with single thumbnail requests
35
- Given tiny.png file content as request body
36
- And XID header set to 123
37
- When I do POST request http://localhost:3000/single
38
- Then response status will be 200
39
- And httpimagestore log will contain xid="123"
40
- And httpthumbnailer log will contain xid="123"
41
-
42
- @xid-forwarding
43
- Scenario: Should forward XID with multi thumbnail requests
44
- Given tiny.png file content as request body
45
- And XID header set to 123
46
- When I do POST request http://localhost:3000/multi
47
- Then response status will be 200
48
- And httpimagestore log will contain xid="123"
49
- And httpthumbnailer log will contain xid="123"
@@ -1,145 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = "httpimagestore"
8
- s.version = "1.8.1"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Jakub Pastuszek"]
12
- s.date = "2014-08-28"
13
- s.description = "Thumbnails images using httpthumbnailer and stored data on HTTP server (S3)"
14
- s.email = "jpastuszek@gmail.com"
15
- s.executables = ["httpimagestore"]
16
- s.extra_rdoc_files = [
17
- "LICENSE.txt",
18
- "README.md"
19
- ]
20
- s.files = [
21
- ".document",
22
- ".rspec",
23
- "Gemfile",
24
- "Gemfile.lock",
25
- "LICENSE.txt",
26
- "README.md",
27
- "Rakefile",
28
- "VERSION",
29
- "bin/httpimagestore",
30
- "features/cache-control.feature",
31
- "features/compatibility.feature",
32
- "features/data-uri.feature",
33
- "features/encoding.feature",
34
- "features/error-reporting.feature",
35
- "features/flexi.feature",
36
- "features/health-check.feature",
37
- "features/request-matching.feature",
38
- "features/rewrite.feature",
39
- "features/s3-store-and-thumbnail.feature",
40
- "features/source-failover.feature",
41
- "features/step_definitions/httpimagestore_steps.rb",
42
- "features/storage.feature",
43
- "features/support/env.rb",
44
- "features/support/test-large.jpg",
45
- "features/support/test.empty",
46
- "features/support/test.jpg",
47
- "features/support/test.png",
48
- "features/support/test.txt",
49
- "features/support/tiny.png",
50
- "features/xid-forwarding.feature",
51
- "httpimagestore.gemspec",
52
- "lib/httpimagestore/aws_sdk_regions_hack.rb",
53
- "lib/httpimagestore/configuration.rb",
54
- "lib/httpimagestore/configuration/file.rb",
55
- "lib/httpimagestore/configuration/handler.rb",
56
- "lib/httpimagestore/configuration/identify.rb",
57
- "lib/httpimagestore/configuration/output.rb",
58
- "lib/httpimagestore/configuration/path.rb",
59
- "lib/httpimagestore/configuration/s3.rb",
60
- "lib/httpimagestore/configuration/source_failover.rb",
61
- "lib/httpimagestore/configuration/thumbnailer.rb",
62
- "lib/httpimagestore/error_reporter.rb",
63
- "lib/httpimagestore/ruby_string_template.rb",
64
- "load_test/load_test.1k.23a022f6e.m1.small-comp.csv",
65
- "load_test/load_test.1k.ec9bde794.m1.small.csv",
66
- "load_test/load_test.jmx",
67
- "load_test/thumbnail_specs.csv",
68
- "load_test/thumbnail_specs_v2.csv",
69
- "spec/configuration_file_spec.rb",
70
- "spec/configuration_handler_spec.rb",
71
- "spec/configuration_identify_spec.rb",
72
- "spec/configuration_output_spec.rb",
73
- "spec/configuration_path_spec.rb",
74
- "spec/configuration_s3_spec.rb",
75
- "spec/configuration_source_failover_spec.rb",
76
- "spec/configuration_spec.rb",
77
- "spec/configuration_thumbnailer_spec.rb",
78
- "spec/ruby_string_template_spec.rb",
79
- "spec/spec_helper.rb",
80
- "spec/support/compute.jpg",
81
- "spec/support/cuba_response_env.rb",
82
- "spec/support/full.cfg",
83
- "spec/support/utf_string.txt"
84
- ]
85
- s.homepage = "http://github.com/jpastuszek/httpimagestore"
86
- s.licenses = ["MIT"]
87
- s.require_paths = ["lib"]
88
- s.rubygems_version = "1.8.23"
89
- s.summary = "HTTP based image storage and thumbnailer"
90
-
91
- if s.respond_to? :specification_version then
92
- s.specification_version = 3
93
-
94
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
95
- s.add_runtime_dependency(%q<unicorn-cuba-base>, ["~> 1.2.2"])
96
- s.add_runtime_dependency(%q<httpthumbnailer-client>, ["~> 1.2.0"])
97
- s.add_runtime_dependency(%q<aws-sdk>, ["~> 1.10"])
98
- s.add_runtime_dependency(%q<mime-types>, ["~> 1.17"])
99
- s.add_runtime_dependency(%q<sdl4r>, ["~> 0.9"])
100
- s.add_runtime_dependency(%q<msgpack>, ["~> 0.5"])
101
- s.add_runtime_dependency(%q<addressable>, ["~> 2.3"])
102
- s.add_development_dependency(%q<faraday>, [">= 0.8"])
103
- s.add_development_dependency(%q<rspec>, ["~> 2.13"])
104
- s.add_development_dependency(%q<cucumber>, [">= 0"])
105
- s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
106
- s.add_development_dependency(%q<rdoc>, ["~> 3.9"])
107
- s.add_development_dependency(%q<daemon>, ["~> 1"])
108
- s.add_development_dependency(%q<prawn>, ["= 0.8.4"])
109
- s.add_development_dependency(%q<httpthumbnailer>, ["~> 1.2.0"])
110
- else
111
- s.add_dependency(%q<unicorn-cuba-base>, ["~> 1.2.2"])
112
- s.add_dependency(%q<httpthumbnailer-client>, ["~> 1.2.0"])
113
- s.add_dependency(%q<aws-sdk>, ["~> 1.10"])
114
- s.add_dependency(%q<mime-types>, ["~> 1.17"])
115
- s.add_dependency(%q<sdl4r>, ["~> 0.9"])
116
- s.add_dependency(%q<msgpack>, ["~> 0.5"])
117
- s.add_dependency(%q<addressable>, ["~> 2.3"])
118
- s.add_dependency(%q<faraday>, [">= 0.8"])
119
- s.add_dependency(%q<rspec>, ["~> 2.13"])
120
- s.add_dependency(%q<cucumber>, [">= 0"])
121
- s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
122
- s.add_dependency(%q<rdoc>, ["~> 3.9"])
123
- s.add_dependency(%q<daemon>, ["~> 1"])
124
- s.add_dependency(%q<prawn>, ["= 0.8.4"])
125
- s.add_dependency(%q<httpthumbnailer>, ["~> 1.2.0"])
126
- end
127
- else
128
- s.add_dependency(%q<unicorn-cuba-base>, ["~> 1.2.2"])
129
- s.add_dependency(%q<httpthumbnailer-client>, ["~> 1.2.0"])
130
- s.add_dependency(%q<aws-sdk>, ["~> 1.10"])
131
- s.add_dependency(%q<mime-types>, ["~> 1.17"])
132
- s.add_dependency(%q<sdl4r>, ["~> 0.9"])
133
- s.add_dependency(%q<msgpack>, ["~> 0.5"])
134
- s.add_dependency(%q<addressable>, ["~> 2.3"])
135
- s.add_dependency(%q<faraday>, [">= 0.8"])
136
- s.add_dependency(%q<rspec>, ["~> 2.13"])
137
- s.add_dependency(%q<cucumber>, [">= 0"])
138
- s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
139
- s.add_dependency(%q<rdoc>, ["~> 3.9"])
140
- s.add_dependency(%q<daemon>, ["~> 1"])
141
- s.add_dependency(%q<prawn>, ["= 0.8.4"])
142
- s.add_dependency(%q<httpthumbnailer>, ["~> 1.2.0"])
143
- end
144
- end
145
-