httpimagestore 0.5.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/Gemfile +10 -12
  2. data/Gemfile.lock +57 -55
  3. data/README.md +829 -0
  4. data/VERSION +1 -1
  5. data/bin/httpimagestore +114 -180
  6. data/features/cache-control.feature +26 -90
  7. data/features/compatibility.feature +129 -0
  8. data/features/error-reporting.feature +207 -0
  9. data/features/health-check.feature +30 -0
  10. data/features/s3-store-and-thumbnail.feature +65 -0
  11. data/features/step_definitions/httpimagestore_steps.rb +66 -26
  12. data/features/support/env.rb +32 -5
  13. data/features/support/test.empty +0 -0
  14. data/httpimagestore.gemspec +60 -47
  15. data/lib/httpimagestore/aws_sdk_regions_hack.rb +23 -0
  16. data/lib/httpimagestore/configuration/file.rb +120 -0
  17. data/lib/httpimagestore/configuration/handler.rb +239 -0
  18. data/lib/httpimagestore/configuration/output.rb +119 -0
  19. data/lib/httpimagestore/configuration/path.rb +77 -0
  20. data/lib/httpimagestore/configuration/s3.rb +194 -0
  21. data/lib/httpimagestore/configuration/thumbnailer.rb +244 -0
  22. data/lib/httpimagestore/configuration.rb +126 -29
  23. data/lib/httpimagestore/error_reporter.rb +36 -0
  24. data/lib/httpimagestore/ruby_string_template.rb +26 -0
  25. data/load_test/load_test.1k.23a022f6e.m1.small-comp.csv +3 -0
  26. data/load_test/load_test.1k.ec9bde794.m1.small.csv +4 -0
  27. data/load_test/load_test.jmx +344 -0
  28. data/load_test/thumbnail_specs.csv +11 -0
  29. data/spec/configuration_file_spec.rb +309 -0
  30. data/spec/configuration_handler_spec.rb +124 -0
  31. data/spec/configuration_output_spec.rb +338 -0
  32. data/spec/configuration_path_spec.rb +92 -0
  33. data/spec/configuration_s3_spec.rb +571 -0
  34. data/spec/configuration_spec.rb +80 -105
  35. data/spec/configuration_thumbnailer_spec.rb +417 -0
  36. data/spec/ruby_string_template_spec.rb +43 -0
  37. data/spec/spec_helper.rb +61 -0
  38. data/spec/support/compute.jpg +0 -0
  39. data/spec/support/cuba_response_env.rb +40 -0
  40. data/spec/support/full.cfg +49 -0
  41. metadata +138 -84
  42. data/README.rdoc +0 -23
  43. data/features/httpimagestore.feature +0 -167
  44. data/lib/httpimagestore/image_path.rb +0 -54
  45. data/lib/httpimagestore/s3_service.rb +0 -37
  46. data/lib/httpimagestore/thumbnail_class.rb +0 -13
  47. data/spec/image_path_spec.rb +0 -72
  48. data/spec/test.cfg +0 -8
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
3
  require 'rspec'
4
+ require 'httpclient'
5
+ require 'daemon'
4
6
 
5
7
  # Requires supporting files with custom matchers and macros, etc,
6
8
  # in ./support/ and its subdirectories.
@@ -9,3 +11,62 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
11
  RSpec.configure do |config|
10
12
 
11
13
  end
14
+
15
+ def support_dir
16
+ Pathname.new('spec/support')
17
+ end
18
+
19
+ def get(url)
20
+ HTTPClient.new.get_content(url)
21
+ end
22
+
23
+ def status(url)
24
+ HTTPClient.new.get(url).status
25
+ end
26
+
27
+ def headers(url)
28
+ HTTPClient.new.get(url).headers
29
+ end
30
+
31
+ def start_server(cmd, pid_file, log_file, test_url)
32
+ fork do
33
+ Daemon.daemonize(pid_file, log_file)
34
+ log_file = Pathname.new(log_file)
35
+ log_file.truncate(0) if log_file.exist?
36
+ exec(cmd)
37
+ end
38
+ return unless Process.wait2.last.exitstatus == 0
39
+
40
+ ppid = Process.pid
41
+ at_exit do
42
+ stop_server(pid_file) if Process.pid == ppid
43
+ end
44
+
45
+ Timeout.timeout(6) do
46
+ begin
47
+ get test_url
48
+ rescue Errno::ECONNREFUSED
49
+ sleep 0.1
50
+ retry
51
+ end
52
+ end
53
+ end
54
+
55
+ def stop_server(pid_file)
56
+ pid_file = Pathname.new(pid_file)
57
+ return unless pid_file.exist?
58
+
59
+ pid = pid_file.read.strip.to_i
60
+
61
+ Timeout.timeout(20) do
62
+ begin
63
+ loop do
64
+ Process.kill("TERM", pid)
65
+ sleep 0.1
66
+ end
67
+ rescue Errno::ESRCH
68
+ pid_file.unlink
69
+ end
70
+ end
71
+ end
72
+
Binary file
@@ -0,0 +1,40 @@
1
+ require 'unicorn-cuba-base/plugin/response_helpers'
2
+ class CubaResponseEnv
3
+ include Plugin::ResponseHelpers
4
+
5
+ class Response < Struct.new(:status, :data)
6
+ extend Forwardable
7
+
8
+ def initialize
9
+ super
10
+ @headers = {}
11
+ end
12
+
13
+ def write(data)
14
+ (self.data ||= '') << data
15
+ end
16
+
17
+ def_delegators :@headers, :[]=, :[]
18
+ end
19
+
20
+ class Request
21
+ class Body
22
+ def read
23
+ ''
24
+ end
25
+ end
26
+
27
+ def body
28
+ Body.new
29
+ end
30
+ end
31
+
32
+ def initialize
33
+ @res = Response.new
34
+ @req = Request.new
35
+ end
36
+
37
+ attr_reader :res
38
+ attr_reader :req
39
+ end
40
+
@@ -0,0 +1,49 @@
1
+ s3 key="AKIAJMUYVYOSACNXLPTQ" secret="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"
2
+
3
+ path {
4
+ "uri" "#{path}"
5
+ "hash" "#{digest}.#{mimeextension}"
6
+ "hash-name" "#{digest}/#{imagename}.#{mimeextension}"
7
+ "structured" "#{dirname}/#{digest}/#{basename}.#{mimeextension}"
8
+ "structured-name" "#{dirname}/#{digest}/#{basename}-#{imagename}.#{mimeextension}"
9
+ }
10
+
11
+ put "thumbnail" ":name_list" {
12
+ thumbnail "input" {
13
+ "original" operation="limit" width=1080 height=1080 format="jpeg" quality=95
14
+ "small" operation="crop" width=128 height=128 format="jpeg" if-image-name-on="#{name_list}"
15
+ "padded" operation="pad" width=128 height=128 format="jpeg" background-color="gray" if-image-name-on="#{name_list}"
16
+ }
17
+
18
+ store_s3 "input" bucket="httpimagestoretest" path="hash" cache-control="public, max-age=31557600, s-maxage=0" public=true
19
+ store_s3 "original" bucket="httpimagestoretest-originals" path="hash"
20
+ store_s3 "small" bucket="httpimagestoretest" path="hash-name" cache-control="public, max-age=31557600, s-maxage=0" public=true if-image-name-on="#{name_list}"
21
+ store_s3 "padded" bucket="httpimagestoretest" path="hash-name" cache-control="public, max-age=31557600, s-maxage=0" public=true if-image-name-on="#{name_list}"
22
+
23
+ output_store_url {
24
+ "input"
25
+ "small" if-image-name-on="#{name_list}"
26
+ "padded" if-image-name-on="#{name_list}"
27
+ }
28
+ }
29
+
30
+ post "original" {
31
+ thumbnail "input" {
32
+ "original" operation="limit" width=1080 height=1080 format="jpeg" quality=95
33
+ }
34
+
35
+ store_s3 "original" bucket="rhoriginals" path="hash"
36
+
37
+ output_store_path "original"
38
+ }
39
+
40
+ get "thumbnail" "v1" ":operation" ":width" ":height" ":options" {
41
+ source_s3 "original" bucket="rhoriginals" path="uri"
42
+
43
+ thumbnail "original" {
44
+ "thumbnail" operation="#{operation}" width="#{width}" height="#{height}" options="#{options}" quality=84 format="jpeg"
45
+ }
46
+
47
+ output_image "thumbnail" cache-control="public, max-age=31557600, s-maxage=0"
48
+ }
49
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httpimagestore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,110 +9,123 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-14 00:00:00.000000000 Z
12
+ date: 2013-07-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: sinatra
16
- requirement: &70152800899640 !ruby/object:Gem::Requirement
15
+ name: unicorn-cuba-base
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 1.2.6
21
+ version: '1.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70152800899640
25
- - !ruby/object:Gem::Dependency
26
- name: mongrel
27
- requirement: &70152801295320 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
28
25
  none: false
29
26
  requirements:
30
- - - ! '>='
27
+ - - ~>
31
28
  - !ruby/object:Gem::Version
32
- version: 1.2.0.pre2
33
- type: :runtime
34
- prerelease: false
35
- version_requirements: *70152801295320
29
+ version: '1.0'
36
30
  - !ruby/object:Gem::Dependency
37
- name: s3
38
- requirement: &70152801294280 !ruby/object:Gem::Requirement
31
+ name: httpthumbnailer-client
32
+ requirement: !ruby/object:Gem::Requirement
39
33
  none: false
40
34
  requirements:
41
35
  - - ~>
42
36
  - !ruby/object:Gem::Version
43
- version: '0.3'
37
+ version: '1.0'
44
38
  type: :runtime
45
39
  prerelease: false
46
- version_requirements: *70152801294280
47
- - !ruby/object:Gem::Dependency
48
- name: httpthumbnailer-client
49
- requirement: &70152801292780 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
50
41
  none: false
51
42
  requirements:
52
43
  - - ~>
53
44
  - !ruby/object:Gem::Version
54
- version: 0.1.0
55
- type: :runtime
56
- prerelease: false
57
- version_requirements: *70152801292780
45
+ version: '1.0'
58
46
  - !ruby/object:Gem::Dependency
59
- name: ruby-ip
60
- requirement: &70152801291520 !ruby/object:Gem::Requirement
47
+ name: aws-sdk
48
+ requirement: !ruby/object:Gem::Requirement
61
49
  none: false
62
50
  requirements:
63
51
  - - ~>
64
52
  - !ruby/object:Gem::Version
65
- version: '0.9'
53
+ version: '1.10'
66
54
  type: :runtime
67
55
  prerelease: false
68
- version_requirements: *70152801291520
69
- - !ruby/object:Gem::Dependency
70
- name: cli
71
- requirement: &70152801290400 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
72
57
  none: false
73
58
  requirements:
74
59
  - - ~>
75
60
  - !ruby/object:Gem::Version
76
- version: 1.1.0
77
- type: :runtime
78
- prerelease: false
79
- version_requirements: *70152801290400
61
+ version: '1.10'
80
62
  - !ruby/object:Gem::Dependency
81
63
  name: mime-types
82
- requirement: &70152801289520 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
83
65
  none: false
84
66
  requirements:
85
67
  - - ~>
86
68
  - !ruby/object:Gem::Version
87
- version: 1.17.2
69
+ version: '1.17'
88
70
  type: :runtime
89
71
  prerelease: false
90
- version_requirements: *70152801289520
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '1.17'
91
78
  - !ruby/object:Gem::Dependency
92
- name: retry-this
93
- requirement: &70152801288860 !ruby/object:Gem::Requirement
79
+ name: sdl4r
80
+ requirement: !ruby/object:Gem::Requirement
94
81
  none: false
95
82
  requirements:
96
83
  - - ~>
97
84
  - !ruby/object:Gem::Version
98
- version: '1.1'
85
+ version: '0.9'
99
86
  type: :runtime
100
87
  prerelease: false
101
- version_requirements: *70152801288860
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '0.9'
94
+ - !ruby/object:Gem::Dependency
95
+ name: httpclient
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '2.3'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '2.3'
102
110
  - !ruby/object:Gem::Dependency
103
111
  name: rspec
104
- requirement: &70152801288200 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
105
113
  none: false
106
114
  requirements:
107
115
  - - ~>
108
116
  - !ruby/object:Gem::Version
109
- version: 2.8.0
117
+ version: '2.13'
110
118
  type: :development
111
119
  prerelease: false
112
- version_requirements: *70152801288200
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: '2.13'
113
126
  - !ruby/object:Gem::Dependency
114
127
  name: cucumber
115
- requirement: &70152801287580 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
116
129
  none: false
117
130
  requirements:
118
131
  - - ! '>='
@@ -120,32 +133,31 @@ dependencies:
120
133
  version: '0'
121
134
  type: :development
122
135
  prerelease: false
123
- version_requirements: *70152801287580
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
124
142
  - !ruby/object:Gem::Dependency
125
143
  name: jeweler
126
- requirement: &70152801302780 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
127
145
  none: false
128
146
  requirements:
129
147
  - - ~>
130
148
  - !ruby/object:Gem::Version
131
- version: 1.6.4
149
+ version: 1.8.4
132
150
  type: :development
133
151
  prerelease: false
134
- version_requirements: *70152801302780
135
- - !ruby/object:Gem::Dependency
136
- name: simplecov
137
- requirement: &70152801301640 !ruby/object:Gem::Requirement
152
+ version_requirements: !ruby/object:Gem::Requirement
138
153
  none: false
139
154
  requirements:
140
- - - ! '>='
155
+ - - ~>
141
156
  - !ruby/object:Gem::Version
142
- version: '0'
143
- type: :development
144
- prerelease: false
145
- version_requirements: *70152801301640
157
+ version: 1.8.4
146
158
  - !ruby/object:Gem::Dependency
147
159
  name: rdoc
148
- requirement: &70152801300940 !ruby/object:Gem::Requirement
160
+ requirement: !ruby/object:Gem::Requirement
149
161
  none: false
150
162
  requirements:
151
163
  - - ~>
@@ -153,10 +165,15 @@ dependencies:
153
165
  version: '3.9'
154
166
  type: :development
155
167
  prerelease: false
156
- version_requirements: *70152801300940
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: '3.9'
157
174
  - !ruby/object:Gem::Dependency
158
175
  name: daemon
159
- requirement: &70152801300380 !ruby/object:Gem::Requirement
176
+ requirement: !ruby/object:Gem::Requirement
160
177
  none: false
161
178
  requirements:
162
179
  - - ~>
@@ -164,29 +181,44 @@ dependencies:
164
181
  version: '1'
165
182
  type: :development
166
183
  prerelease: false
167
- version_requirements: *70152801300380
168
- - !ruby/object:Gem::Dependency
169
- name: httpthumbnailer
170
- requirement: &70152801299680 !ruby/object:Gem::Requirement
184
+ version_requirements: !ruby/object:Gem::Requirement
171
185
  none: false
172
186
  requirements:
173
187
  - - ~>
174
188
  - !ruby/object:Gem::Version
175
- version: '0.2'
176
- type: :development
177
- prerelease: false
178
- version_requirements: *70152801299680
189
+ version: '1'
179
190
  - !ruby/object:Gem::Dependency
180
191
  name: prawn
181
- requirement: &70152801299080 !ruby/object:Gem::Requirement
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - '='
196
+ - !ruby/object:Gem::Version
197
+ version: 0.8.4
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
182
201
  none: false
183
202
  requirements:
184
- - - =
203
+ - - '='
185
204
  - !ruby/object:Gem::Version
186
205
  version: 0.8.4
206
+ - !ruby/object:Gem::Dependency
207
+ name: httpthumbnailer
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ! '>='
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
187
214
  type: :development
188
215
  prerelease: false
189
- version_requirements: *70152801299080
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
190
222
  description: Thumbnails images using httpthumbnailer and stored data on HTTP server
191
223
  (S3)
192
224
  email: jpastuszek@gmail.com
@@ -195,33 +227,55 @@ executables:
195
227
  extensions: []
196
228
  extra_rdoc_files:
197
229
  - LICENSE.txt
198
- - README.rdoc
230
+ - README.md
199
231
  files:
200
232
  - .document
201
233
  - .rspec
202
234
  - Gemfile
203
235
  - Gemfile.lock
204
236
  - LICENSE.txt
205
- - README.rdoc
237
+ - README.md
206
238
  - Rakefile
207
239
  - VERSION
208
240
  - bin/httpimagestore
209
241
  - features/cache-control.feature
210
- - features/httpimagestore.feature
242
+ - features/compatibility.feature
243
+ - features/error-reporting.feature
244
+ - features/health-check.feature
245
+ - features/s3-store-and-thumbnail.feature
211
246
  - features/step_definitions/httpimagestore_steps.rb
212
247
  - features/support/env.rb
213
248
  - features/support/test-large.jpg
249
+ - features/support/test.empty
214
250
  - features/support/test.jpg
215
251
  - features/support/test.txt
216
252
  - httpimagestore.gemspec
253
+ - lib/httpimagestore/aws_sdk_regions_hack.rb
217
254
  - lib/httpimagestore/configuration.rb
218
- - lib/httpimagestore/image_path.rb
219
- - lib/httpimagestore/s3_service.rb
220
- - lib/httpimagestore/thumbnail_class.rb
255
+ - lib/httpimagestore/configuration/file.rb
256
+ - lib/httpimagestore/configuration/handler.rb
257
+ - lib/httpimagestore/configuration/output.rb
258
+ - lib/httpimagestore/configuration/path.rb
259
+ - lib/httpimagestore/configuration/s3.rb
260
+ - lib/httpimagestore/configuration/thumbnailer.rb
261
+ - lib/httpimagestore/error_reporter.rb
262
+ - lib/httpimagestore/ruby_string_template.rb
263
+ - load_test/load_test.1k.23a022f6e.m1.small-comp.csv
264
+ - load_test/load_test.1k.ec9bde794.m1.small.csv
265
+ - load_test/load_test.jmx
266
+ - load_test/thumbnail_specs.csv
267
+ - spec/configuration_file_spec.rb
268
+ - spec/configuration_handler_spec.rb
269
+ - spec/configuration_output_spec.rb
270
+ - spec/configuration_path_spec.rb
271
+ - spec/configuration_s3_spec.rb
221
272
  - spec/configuration_spec.rb
222
- - spec/image_path_spec.rb
273
+ - spec/configuration_thumbnailer_spec.rb
274
+ - spec/ruby_string_template_spec.rb
223
275
  - spec/spec_helper.rb
224
- - spec/test.cfg
276
+ - spec/support/compute.jpg
277
+ - spec/support/cuba_response_env.rb
278
+ - spec/support/full.cfg
225
279
  homepage: http://github.com/jpastuszek/httpimagestore
226
280
  licenses:
227
281
  - MIT
@@ -237,7 +291,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
237
291
  version: '0'
238
292
  segments:
239
293
  - 0
240
- hash: -4091729981865495477
294
+ hash: 801711138329567989
241
295
  required_rubygems_version: !ruby/object:Gem::Requirement
242
296
  none: false
243
297
  requirements:
@@ -246,7 +300,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
246
300
  version: '0'
247
301
  requirements: []
248
302
  rubyforge_project:
249
- rubygems_version: 1.8.15
303
+ rubygems_version: 1.8.25
250
304
  signing_key:
251
305
  specification_version: 3
252
306
  summary: HTTP based image storage and thumbnailer
data/README.rdoc DELETED
@@ -1,23 +0,0 @@
1
- = httpimagestore
2
-
3
- Description goes here.
4
-
5
- == Putting image with cURL
6
-
7
- `curl -X PUT --data-binary @<image_file> -H "Content-Type: image/auto" <server>:<port>/thumbnail/<class_name>/<store_uri>`
8
-
9
- == Contributing to httpimagestore
10
-
11
- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
12
- * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
13
- * Fork the project
14
- * Start a feature/bugfix branch
15
- * Commit and push until you are happy with your contribution
16
- * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
17
- * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
18
-
19
- == Copyright
20
-
21
- Copyright (c) 2011 Jakub Pastuszek. See LICENSE.txt for
22
- further details.
23
-