oahu-dragonfly 0.8.2
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/.rspec +1 -0
- data/.yardopts +24 -0
- data/Gemfile +30 -0
- data/History.md +323 -0
- data/LICENSE +20 -0
- data/README.md +88 -0
- data/Rakefile +50 -0
- data/VERSION +1 -0
- data/config.ru +14 -0
- data/docs.watchr +1 -0
- data/dragonfly.gemspec +297 -0
- data/extra_docs/Analysers.md +66 -0
- data/extra_docs/Caching.md +23 -0
- data/extra_docs/Configuration.md +124 -0
- data/extra_docs/Couch.md +49 -0
- data/extra_docs/DataStorage.md +153 -0
- data/extra_docs/Encoding.md +67 -0
- data/extra_docs/GeneralUsage.md +121 -0
- data/extra_docs/Generators.md +60 -0
- data/extra_docs/Heroku.md +50 -0
- data/extra_docs/ImageMagick.md +125 -0
- data/extra_docs/Index.md +33 -0
- data/extra_docs/MimeTypes.md +40 -0
- data/extra_docs/Models.md +272 -0
- data/extra_docs/Mongo.md +45 -0
- data/extra_docs/Processing.md +77 -0
- data/extra_docs/Rack.md +52 -0
- data/extra_docs/Rails2.md +57 -0
- data/extra_docs/Rails3.md +62 -0
- data/extra_docs/Sinatra.md +25 -0
- data/extra_docs/URLs.md +169 -0
- data/features/images.feature +47 -0
- data/features/no_processing.feature +14 -0
- data/features/rails_3.0.5.feature +8 -0
- data/features/steps/common_steps.rb +8 -0
- data/features/steps/dragonfly_steps.rb +66 -0
- data/features/steps/rails_steps.rb +28 -0
- data/features/support/env.rb +13 -0
- data/features/support/setup.rb +32 -0
- data/fixtures/rails_3.0.5/files/app/models/album.rb +7 -0
- data/fixtures/rails_3.0.5/files/app/views/albums/new.html.erb +7 -0
- data/fixtures/rails_3.0.5/files/app/views/albums/show.html.erb +6 -0
- data/fixtures/rails_3.0.5/files/config/initializers/dragonfly.rb +4 -0
- data/fixtures/rails_3.0.5/files/features/manage_album_images.feature +38 -0
- data/fixtures/rails_3.0.5/files/features/step_definitions/helper_steps.rb +7 -0
- data/fixtures/rails_3.0.5/files/features/step_definitions/image_steps.rb +25 -0
- data/fixtures/rails_3.0.5/files/features/support/paths.rb +17 -0
- data/fixtures/rails_3.0.5/files/features/text_images.feature +7 -0
- data/fixtures/rails_3.0.5/template.rb +20 -0
- data/irbrc.rb +18 -0
- data/lib/dragonfly.rb +55 -0
- data/lib/dragonfly/active_model_extensions.rb +13 -0
- data/lib/dragonfly/active_model_extensions/attachment.rb +250 -0
- data/lib/dragonfly/active_model_extensions/attachment_class_methods.rb +148 -0
- data/lib/dragonfly/active_model_extensions/class_methods.rb +95 -0
- data/lib/dragonfly/active_model_extensions/instance_methods.rb +28 -0
- data/lib/dragonfly/active_model_extensions/validations.rb +41 -0
- data/lib/dragonfly/analyser.rb +58 -0
- data/lib/dragonfly/analysis/file_command_analyser.rb +32 -0
- data/lib/dragonfly/analysis/image_magick_analyser.rb +6 -0
- data/lib/dragonfly/app.rb +172 -0
- data/lib/dragonfly/config/heroku.rb +19 -0
- data/lib/dragonfly/config/image_magick.rb +6 -0
- data/lib/dragonfly/config/rails.rb +20 -0
- data/lib/dragonfly/configurable.rb +207 -0
- data/lib/dragonfly/core_ext/array.rb +7 -0
- data/lib/dragonfly/core_ext/hash.rb +7 -0
- data/lib/dragonfly/core_ext/object.rb +12 -0
- data/lib/dragonfly/core_ext/string.rb +9 -0
- data/lib/dragonfly/core_ext/symbol.rb +9 -0
- data/lib/dragonfly/data_storage.rb +9 -0
- data/lib/dragonfly/data_storage/couch_data_store.rb +64 -0
- data/lib/dragonfly/data_storage/file_data_store.rb +141 -0
- data/lib/dragonfly/data_storage/mongo_data_store.rb +86 -0
- data/lib/dragonfly/data_storage/s3data_store.rb +145 -0
- data/lib/dragonfly/encoder.rb +13 -0
- data/lib/dragonfly/encoding/image_magick_encoder.rb +6 -0
- data/lib/dragonfly/function_manager.rb +71 -0
- data/lib/dragonfly/generation/image_magick_generator.rb +6 -0
- data/lib/dragonfly/generator.rb +9 -0
- data/lib/dragonfly/hash_with_css_style_keys.rb +21 -0
- data/lib/dragonfly/image_magick/analyser.rb +51 -0
- data/lib/dragonfly/image_magick/config.rb +41 -0
- data/lib/dragonfly/image_magick/encoder.rb +57 -0
- data/lib/dragonfly/image_magick/generator.rb +145 -0
- data/lib/dragonfly/image_magick/processor.rb +99 -0
- data/lib/dragonfly/image_magick/utils.rb +72 -0
- data/lib/dragonfly/image_magick_utils.rb +4 -0
- data/lib/dragonfly/job.rb +451 -0
- data/lib/dragonfly/job_builder.rb +39 -0
- data/lib/dragonfly/job_definitions.rb +26 -0
- data/lib/dragonfly/job_endpoint.rb +15 -0
- data/lib/dragonfly/loggable.rb +28 -0
- data/lib/dragonfly/middleware.rb +20 -0
- data/lib/dragonfly/processing/image_magick_processor.rb +6 -0
- data/lib/dragonfly/processor.rb +9 -0
- data/lib/dragonfly/rails/images.rb +27 -0
- data/lib/dragonfly/response.rb +97 -0
- data/lib/dragonfly/routed_endpoint.rb +40 -0
- data/lib/dragonfly/serializer.rb +32 -0
- data/lib/dragonfly/server.rb +113 -0
- data/lib/dragonfly/simple_cache.rb +23 -0
- data/lib/dragonfly/temp_object.rb +175 -0
- data/lib/dragonfly/url_mapper.rb +78 -0
- data/samples/beach.png +0 -0
- data/samples/egg.png +0 -0
- data/samples/round.gif +0 -0
- data/samples/sample.docx +0 -0
- data/samples/taj.jpg +0 -0
- data/spec/dragonfly/active_model_extensions/model_spec.rb +1426 -0
- data/spec/dragonfly/active_model_extensions/spec_helper.rb +91 -0
- data/spec/dragonfly/analyser_spec.rb +123 -0
- data/spec/dragonfly/analysis/file_command_analyser_spec.rb +48 -0
- data/spec/dragonfly/app_spec.rb +135 -0
- data/spec/dragonfly/configurable_spec.rb +461 -0
- data/spec/dragonfly/core_ext/array_spec.rb +19 -0
- data/spec/dragonfly/core_ext/hash_spec.rb +19 -0
- data/spec/dragonfly/core_ext/string_spec.rb +17 -0
- data/spec/dragonfly/core_ext/symbol_spec.rb +17 -0
- data/spec/dragonfly/data_storage/couch_data_store_spec.rb +76 -0
- data/spec/dragonfly/data_storage/file_data_store_spec.rb +296 -0
- data/spec/dragonfly/data_storage/mongo_data_store_spec.rb +57 -0
- data/spec/dragonfly/data_storage/s3_data_store_spec.rb +258 -0
- data/spec/dragonfly/data_storage/shared_data_store_examples.rb +77 -0
- data/spec/dragonfly/function_manager_spec.rb +154 -0
- data/spec/dragonfly/hash_with_css_style_keys_spec.rb +24 -0
- data/spec/dragonfly/image_magick/analyser_spec.rb +64 -0
- data/spec/dragonfly/image_magick/encoder_spec.rb +41 -0
- data/spec/dragonfly/image_magick/generator_spec.rb +172 -0
- data/spec/dragonfly/image_magick/processor_spec.rb +233 -0
- data/spec/dragonfly/image_magick/utils_spec.rb +18 -0
- data/spec/dragonfly/job_builder_spec.rb +37 -0
- data/spec/dragonfly/job_definitions_spec.rb +35 -0
- data/spec/dragonfly/job_endpoint_spec.rb +173 -0
- data/spec/dragonfly/job_spec.rb +1046 -0
- data/spec/dragonfly/loggable_spec.rb +80 -0
- data/spec/dragonfly/middleware_spec.rb +47 -0
- data/spec/dragonfly/routed_endpoint_spec.rb +48 -0
- data/spec/dragonfly/serializer_spec.rb +61 -0
- data/spec/dragonfly/server_spec.rb +278 -0
- data/spec/dragonfly/simple_cache_spec.rb +27 -0
- data/spec/dragonfly/temp_object_spec.rb +306 -0
- data/spec/dragonfly/url_mapper_spec.rb +126 -0
- data/spec/functional/deprecations_spec.rb +51 -0
- data/spec/functional/image_magick_app_spec.rb +27 -0
- data/spec/functional/model_urls_spec.rb +85 -0
- data/spec/functional/remote_on_the_fly_spec.rb +51 -0
- data/spec/functional/to_response_spec.rb +31 -0
- data/spec/spec_helper.rb +51 -0
- data/spec/support/argument_matchers.rb +19 -0
- data/spec/support/image_matchers.rb +47 -0
- data/spec/support/simple_matchers.rb +53 -0
- data/yard/handlers/configurable_attr_handler.rb +38 -0
- data/yard/setup.rb +15 -0
- data/yard/templates/default/fulldoc/html/css/common.css +107 -0
- data/yard/templates/default/layout/html/layout.erb +89 -0
- data/yard/templates/default/module/html/configuration_summary.erb +31 -0
- data/yard/templates/default/module/setup.rb +17 -0
- metadata +544 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
Feature: champion uses dragonfly to process images
|
|
2
|
+
In order to be a champion
|
|
3
|
+
A user uses dragonfly
|
|
4
|
+
|
|
5
|
+
Background:
|
|
6
|
+
Given we are using the app for images
|
|
7
|
+
Given a stored image "beach.png" with dimensions 200x100
|
|
8
|
+
|
|
9
|
+
Scenario: Go to url for original
|
|
10
|
+
When I go to the url for "beach.png", with format 'png'
|
|
11
|
+
Then the response should be OK
|
|
12
|
+
And the response should have mime-type 'image/png'
|
|
13
|
+
And the image should have width '200'
|
|
14
|
+
And the image should have height '100'
|
|
15
|
+
And the image should have format 'png'
|
|
16
|
+
|
|
17
|
+
Scenario: Go to url for changed format version
|
|
18
|
+
When I go to the url for "beach.png", with format 'gif'
|
|
19
|
+
Then the response should be OK
|
|
20
|
+
And the response should have mime-type 'image/gif'
|
|
21
|
+
And the image should have width '200'
|
|
22
|
+
And the image should have height '100'
|
|
23
|
+
And the image should have format 'gif'
|
|
24
|
+
|
|
25
|
+
Scenario: Go to url for soft resized version
|
|
26
|
+
When I go to the url for "beach.png", with format 'png' and resize geometry '100x150'
|
|
27
|
+
Then the response should be OK
|
|
28
|
+
And the response should have mime-type 'image/png'
|
|
29
|
+
And the image should have width '100'
|
|
30
|
+
And the image should have height '50'
|
|
31
|
+
And the image should have format 'png'
|
|
32
|
+
|
|
33
|
+
Scenario: Go to url for hard resized version
|
|
34
|
+
When I go to the url for "beach.png", with format 'png' and resize geometry '100x150!'
|
|
35
|
+
Then the response should be OK
|
|
36
|
+
And the response should have mime-type 'image/png'
|
|
37
|
+
And the image should have width '100'
|
|
38
|
+
And the image should have height '150'
|
|
39
|
+
And the image should have format 'png'
|
|
40
|
+
|
|
41
|
+
Scenario: use a parameters shortcut
|
|
42
|
+
When I go to the url for "beach.png", with shortcut '100x150!'
|
|
43
|
+
Then the response should be OK
|
|
44
|
+
And the response should have mime-type 'image/png'
|
|
45
|
+
And the image should have width '100'
|
|
46
|
+
And the image should have height '150'
|
|
47
|
+
And the image should have format 'png'
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Feature: winner uses dragonfly to serve different kinds of files
|
|
2
|
+
In order to be a winner
|
|
3
|
+
As a potential loser
|
|
4
|
+
I want to be a winner
|
|
5
|
+
|
|
6
|
+
Background:
|
|
7
|
+
Given we are using the app for files
|
|
8
|
+
|
|
9
|
+
Scenario: Go to url for original, without extension
|
|
10
|
+
Given a stored file "sample.docx"
|
|
11
|
+
When I go to the url for "sample.docx"
|
|
12
|
+
Then the response should be OK
|
|
13
|
+
And the response should have mime-type 'application/zip'
|
|
14
|
+
And the response should have the same content as the file "sample.docx"
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Feature: champion uses dragonfly in his Rails 3.0.5 application
|
|
2
|
+
In order to be a champion
|
|
3
|
+
A user uses dragonfly in his Rails 3.0.5 application
|
|
4
|
+
|
|
5
|
+
Scenario: Set up dragonfly using initializer
|
|
6
|
+
Given a Rails 3.0.5 application set up for using dragonfly
|
|
7
|
+
Then the manage_album_images cucumber features in my Rails 3.0.5 app should pass
|
|
8
|
+
And the text_images cucumber features in my Rails 3.0.5 app should pass
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
require 'tempfile'
|
|
2
|
+
|
|
3
|
+
Given /^we are using the app for (\w+)$/ do |app_name|
|
|
4
|
+
$app = Dragonfly[app_name.to_sym]
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Given /^a stored file "(.+?)"$/ do |name|
|
|
8
|
+
file = File.new(File.dirname(__FILE__) + "/../../samples/#{name}")
|
|
9
|
+
uid = $app.store(file)
|
|
10
|
+
TEMP_FILES[name] = uid
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Given /^a stored image "(.+?)" with dimensions (\d+)x(\d+)$/ do |name, width, height|
|
|
14
|
+
tempfile = Tempfile.new(name)
|
|
15
|
+
`convert -resize #{width}x#{height}! #{SAMPLE_IMAGE_PATH} #{tempfile.path}`
|
|
16
|
+
uid = $app.store(tempfile)
|
|
17
|
+
TEMP_FILES[name] = uid
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
When /^I go to the url for "(.+?)"$/ do |name|
|
|
21
|
+
uid = TEMP_FILES[name]
|
|
22
|
+
make_request $app.fetch(uid)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
When /^I go to the url for "(.+?)", with format '([^']+?)'$/ do |name, format|
|
|
26
|
+
uid = TEMP_FILES[name]
|
|
27
|
+
make_request $app.fetch(uid).encode(format)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
When /^I go to the url for "(.+?)", with format '(.+?)' and resize geometry '(.+?)'$/ do |name, format, geometry|
|
|
31
|
+
uid = TEMP_FILES[name]
|
|
32
|
+
make_request $app.fetch(uid).process(:resize, geometry).encode(format)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
When /^I go to the url for "(.+?)", with shortcut '([^']+?)'$/ do |name, geometry|
|
|
36
|
+
uid = TEMP_FILES[name]
|
|
37
|
+
make_request $app.fetch(uid).thumb(geometry)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
Then "the response should be OK" do
|
|
41
|
+
@response.status.should == 200
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
Then /the response should have mime-type '(.+?)'/ do |mime_type|
|
|
45
|
+
@response.headers['Content-Type'].should == mime_type
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
Then /^the image should have width '(.+?)'$/ do |width|
|
|
49
|
+
@response.body.should have_width(width.to_i)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
Then /^the image should have height '(.+?)'$/ do |height|
|
|
53
|
+
@response.body.should have_height(height.to_i)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
Then /^the image should have format '(.+?)'$/ do |format|
|
|
57
|
+
@response.body.should have_format(format)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
Then /^the response should have the same content as the file "([^\"]*)"$/ do |name|
|
|
61
|
+
if RUBY_VERSION =~ /^1\.8/
|
|
62
|
+
@response.body.should == $app.fetch(TEMP_FILES[name]).data
|
|
63
|
+
else
|
|
64
|
+
@response.body.force_encoding('BINARY').should == $app.fetch(TEMP_FILES[name]).data.force_encoding('BINARY')
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
RAILS_APP_NAME = 'tmp_app'
|
|
2
|
+
FIXTURES_PATH = ROOT_PATH + "/fixtures"
|
|
3
|
+
|
|
4
|
+
def fixture_path(version)
|
|
5
|
+
"#{FIXTURES_PATH}/rails_#{version}"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def app_path(version)
|
|
9
|
+
"#{fixture_path(version)}/#{RAILS_APP_NAME}"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
##############################################################################
|
|
13
|
+
|
|
14
|
+
Given "a Rails 3.0.5 application set up for using dragonfly" do
|
|
15
|
+
raise "Problem setting up Rails app" unless `
|
|
16
|
+
cd #{fixture_path('3.0.5')} &&
|
|
17
|
+
rm -rf #{RAILS_APP_NAME} &&
|
|
18
|
+
bundle exec rails new #{RAILS_APP_NAME} -m template.rb`
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
Then /^the (.+) cucumber features in my Rails (.+) app should pass$/ do |filename, version|
|
|
22
|
+
puts "\n*** RUNNING FEATURES IN THE RAILS APP... ***\n"
|
|
23
|
+
path = File.join(fixture_path(version), RAILS_APP_NAME)
|
|
24
|
+
`cd #{path} && RAILS_ENV=cucumber rake db:migrate`
|
|
25
|
+
features_passed = system "cd #{path} && cucumber features/#{filename}.feature"
|
|
26
|
+
puts "\n*** FINISHED RUNNING FEATURES IN THE RAILS APP ***\n"
|
|
27
|
+
raise "Features failed" unless features_passed
|
|
28
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'bundler'
|
|
2
|
+
begin
|
|
3
|
+
Bundler.setup(:default, :cucumber)
|
|
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 'dragonfly'
|
|
12
|
+
|
|
13
|
+
require 'rspec/expectations'
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
ROOT_PATH = File.expand_path(File.dirname(__FILE__) + "/../..")
|
|
2
|
+
|
|
3
|
+
require ROOT_PATH + '/spec/support/image_matchers.rb'
|
|
4
|
+
|
|
5
|
+
# A hash of <name for reference> => <dragonfly uid> pairs
|
|
6
|
+
TEMP_FILES = {}
|
|
7
|
+
|
|
8
|
+
Dragonfly[:images].configure_with(:imagemagick)
|
|
9
|
+
Dragonfly[:files].configure do |c|
|
|
10
|
+
c.analyser.register(Dragonfly::Analysis::FileCommandAnalyser)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
SAMPLE_IMAGE_PATH = ROOT_PATH + '/samples/beach.png'
|
|
14
|
+
|
|
15
|
+
Before do
|
|
16
|
+
# Remove temporary images
|
|
17
|
+
TEMP_FILES.each do |name, uid|
|
|
18
|
+
$app.datastore.destroy(uid)
|
|
19
|
+
TEMP_FILES.delete(name)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
module MyHelpers
|
|
24
|
+
|
|
25
|
+
def make_request(job)
|
|
26
|
+
request = Rack::MockRequest.new($app)
|
|
27
|
+
@response = request.get(job.url)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
World(MyHelpers)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
Feature: champion adds cover images to his albums
|
|
2
|
+
In order to be a champion
|
|
3
|
+
A user adds an image to his album
|
|
4
|
+
|
|
5
|
+
Scenario: Add and view image
|
|
6
|
+
When I go to the new album page
|
|
7
|
+
And I attach the file "../../../samples/beach.png" to "album[cover_image]"
|
|
8
|
+
And I press "Create"
|
|
9
|
+
Then I should see "successfully created"
|
|
10
|
+
And I should see "Look at this cover image!"
|
|
11
|
+
When I look at the generated image
|
|
12
|
+
Then I should see a PNG image of size 200x100
|
|
13
|
+
|
|
14
|
+
Scenario: validation fails
|
|
15
|
+
When I go to the new album page
|
|
16
|
+
And I attach the file "../../../samples/sample.docx" to "album[cover_image]"
|
|
17
|
+
And I press "Create"
|
|
18
|
+
Then I should see "Cover image format is incorrect. It needs to be one of 'jpg', 'png', 'gif', but was 'docx'"
|
|
19
|
+
|
|
20
|
+
Scenario: other validation fails
|
|
21
|
+
When I go to the new album page
|
|
22
|
+
And I fill in "album[name]" with "too long"
|
|
23
|
+
And I attach the file "../../../samples/beach.png" to "album[cover_image]"
|
|
24
|
+
And I press "Create"
|
|
25
|
+
Then I should see "Name is too long"
|
|
26
|
+
When I fill in "album[name]" with "short"
|
|
27
|
+
And I press "Create"
|
|
28
|
+
Then I should see "successfully created"
|
|
29
|
+
And I should see "short"
|
|
30
|
+
And I should see "Look at this cover image!"
|
|
31
|
+
When I look at the generated image
|
|
32
|
+
Then I should see a PNG image of size 200x100
|
|
33
|
+
|
|
34
|
+
Scenario: view remote image
|
|
35
|
+
Given an album "good" with attached file "beach.png"
|
|
36
|
+
When I go to the page for album "good"
|
|
37
|
+
And I look at the original image
|
|
38
|
+
Then I should see a PNG image of size 280x355
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Given /^an album "(.+)" with attached file "(.+)"$/ do |name, filename|
|
|
2
|
+
Album.create! :name => name, :cover_image => Rails.root.join('../../../samples', filename)
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
When /^I look at the generated image$/ do
|
|
6
|
+
page.body =~ %r{src="(/media[^"]+?)"}
|
|
7
|
+
url = $1
|
|
8
|
+
visit(url)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
When /^I look at the original image$/ do
|
|
12
|
+
page.body =~ %r{src="(/system[^"]+?)"}
|
|
13
|
+
url = $1
|
|
14
|
+
visit(url)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
Then /^I should see a (.+) image of size (.+)$/ do |format, size|
|
|
18
|
+
tempfile = Tempfile.new('wicked')
|
|
19
|
+
page.body.force_encoding('UTF-8').encode! if page.body.respond_to?(:force_encoding) # For some reason need this on Ruby 1.9.2
|
|
20
|
+
tempfile.write page.body
|
|
21
|
+
tempfile.close
|
|
22
|
+
output = `identify #{tempfile.path}`.split(' ')
|
|
23
|
+
output[1].should == format
|
|
24
|
+
output[2].should == size
|
|
25
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module NavigationHelpers
|
|
2
|
+
def path_to(page_name)
|
|
3
|
+
case page_name
|
|
4
|
+
when "the new album page"
|
|
5
|
+
'/albums/new'
|
|
6
|
+
when /^the page for album "(.+)"$/
|
|
7
|
+
album_path(Album.find_by_name($1))
|
|
8
|
+
when /^the image for text "(.+)", size "(.+)"$/
|
|
9
|
+
"/text/#{$1}/#{$2}"
|
|
10
|
+
else
|
|
11
|
+
raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
|
|
12
|
+
"Now, go and add a mapping in #{__FILE__}"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
World(NavigationHelpers)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
gem 'rack-cache', :require => 'rack/cache'
|
|
2
|
+
|
|
3
|
+
gem 'capybara'
|
|
4
|
+
gem 'cucumber-rails'
|
|
5
|
+
gem 'cucumber', '0.8.5'
|
|
6
|
+
|
|
7
|
+
generate 'cucumber:install'
|
|
8
|
+
|
|
9
|
+
generate 'scaffold albums cover_image_uid:string name:string'
|
|
10
|
+
rake 'db:migrate'
|
|
11
|
+
|
|
12
|
+
# Copy over all files from the template dir
|
|
13
|
+
files_dir = File.expand_path(File.dirname(__FILE__) + '/files')
|
|
14
|
+
run "cp -r #{files_dir}/** ."
|
|
15
|
+
|
|
16
|
+
route <<ROUTES
|
|
17
|
+
match '/text/:text/:size' => Dragonfly[:images].endpoint{|params, app|
|
|
18
|
+
app.generate(:text, params[:text]).thumb(params[:size])
|
|
19
|
+
}
|
|
20
|
+
ROUTES
|
data/irbrc.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require "rubygems"
|
|
2
|
+
require "bundler/setup"
|
|
3
|
+
$:.unshift(File.expand_path('../lib', __FILE__))
|
|
4
|
+
require 'dragonfly'
|
|
5
|
+
APP = Dragonfly[:images].configure_with(:imagemagick)
|
|
6
|
+
|
|
7
|
+
# available_uids = `find #{APP.datastore.root_path} ! -type d`.split("\n").map do |file|
|
|
8
|
+
# file.sub("#{APP.datastore.root_path}/", '')
|
|
9
|
+
# end
|
|
10
|
+
|
|
11
|
+
puts "Loaded stuff from dragonfly irbrc"
|
|
12
|
+
# puts "\nAvailable uids:\n"
|
|
13
|
+
# puts available_uids
|
|
14
|
+
puts "\nAvailable sample images:\n"
|
|
15
|
+
puts Dir['samples/*']
|
|
16
|
+
puts "\nAvailable constants:\n"
|
|
17
|
+
puts "APP"
|
|
18
|
+
puts
|
data/lib/dragonfly.rb
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# AUTOLOAD EVERYTHING IN THE DRAGONFLY DIRECTORY TREE
|
|
2
|
+
|
|
3
|
+
# The convention is that dirs are modules
|
|
4
|
+
# so declare them here and autoload any modules/classes inside them
|
|
5
|
+
# All paths here are absolute
|
|
6
|
+
def camelize(path)
|
|
7
|
+
# e.g. 'test/this_one' => Test::ThisOne
|
|
8
|
+
"#{path}".
|
|
9
|
+
chomp('/').
|
|
10
|
+
gsub('/','::').
|
|
11
|
+
gsub(/([^a-z])(\w)/){ "#{$1}#{$2.upcase}" }.
|
|
12
|
+
gsub('_','').
|
|
13
|
+
sub(/^(\w)/){ $1.upcase }
|
|
14
|
+
end
|
|
15
|
+
def autoload_files_in_dir(path, namespace)
|
|
16
|
+
# Define the module
|
|
17
|
+
eval("module #{namespace}; end")
|
|
18
|
+
# Autoload modules/classes in that module
|
|
19
|
+
Dir.glob("#{path}/*.rb").each do |file|
|
|
20
|
+
file = File.expand_path(file)
|
|
21
|
+
sub_const_name = camelize( File.basename(file, '.rb') )
|
|
22
|
+
eval("#{namespace}.autoload('#{sub_const_name}', '#{file}')")
|
|
23
|
+
end
|
|
24
|
+
# Recurse on subdirectories
|
|
25
|
+
Dir.glob("#{path}/*/").each do |dir|
|
|
26
|
+
sub_namespace = camelize( File.basename(dir) )
|
|
27
|
+
autoload_files_in_dir(dir, "#{namespace}::#{sub_namespace}")
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
autoload_files_in_dir("#{File.dirname(__FILE__)}/dragonfly", 'Dragonfly')
|
|
32
|
+
|
|
33
|
+
require 'dragonfly/core_ext/object'
|
|
34
|
+
require 'dragonfly/core_ext/string'
|
|
35
|
+
require 'dragonfly/core_ext/symbol'
|
|
36
|
+
require 'dragonfly/core_ext/array'
|
|
37
|
+
require 'dragonfly/core_ext/hash'
|
|
38
|
+
|
|
39
|
+
module Dragonfly
|
|
40
|
+
class << self
|
|
41
|
+
|
|
42
|
+
def [](*args)
|
|
43
|
+
App[*args]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Register saved configurations so we can do e.g.
|
|
47
|
+
# Dragonfly[:my_app].configure_with(:image_magick)
|
|
48
|
+
App.register_configuration(:imagemagick){ ImageMagick::Config }
|
|
49
|
+
App.register_configuration(:image_magick){ ImageMagick::Config }
|
|
50
|
+
App.register_configuration(:rails){ Config::Rails }
|
|
51
|
+
App.register_configuration(:s3){ Config::S3 }
|
|
52
|
+
App.register_configuration(:heroku){ Config::Heroku }
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
end
|