magickly 1.2.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ bundler_args: "--without development"
2
+ script: "bundle exec rspec spec"
3
+ rvm:
4
+ - 1.8.7
5
+ - 1.9.2
6
+ - 1.9.3
data/Gemfile CHANGED
@@ -4,14 +4,11 @@ gem 'sinatra', '~> 1.2', :require => 'sinatra/base'
4
4
  gem 'dragonfly', '~> 0.9.5'
5
5
  gem 'addressable', '~> 2.2', :require => 'addressable/uri'
6
6
 
7
- gem 'haml', '~> 3.0'
8
7
  gem 'httparty', '~> 0.8.1'
9
8
  gem 'activesupport', '>= 2.0.0', :require => false
10
- gem 'json', '~> 1.5'
11
9
 
12
10
  group :development do
13
11
  gem 'jeweler', '~> 1.5'
14
- gem 'rcov', '>= 0'
15
12
  end
16
13
 
17
14
  group :development, :test do
@@ -1,48 +1,51 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activesupport (3.1.3)
4
+ activesupport (3.2.0)
5
+ i18n (~> 0.6)
5
6
  multi_json (~> 1.0)
6
7
  addressable (2.2.6)
7
8
  crack (0.3.1)
8
9
  diff-lcs (1.1.3)
9
- dragonfly (0.9.8)
10
+ dragonfly (0.9.10)
10
11
  rack
11
12
  git (1.2.5)
12
- haml (3.1.4)
13
13
  httparty (0.8.1)
14
14
  multi_json
15
15
  multi_xml
16
+ i18n (0.6.0)
16
17
  imagesize (0.1.1)
17
- jeweler (1.6.4)
18
+ jeweler (1.8.3)
18
19
  bundler (~> 1.0)
19
20
  git (>= 1.2.5)
20
21
  rake
21
- json (1.6.3)
22
+ rdoc
23
+ json (1.6.5)
22
24
  multi_json (1.0.4)
23
25
  multi_xml (0.4.1)
24
26
  newrelic_rpm (3.3.1)
25
- rack (1.3.5)
26
- rack-protection (1.1.4)
27
+ rack (1.4.1)
28
+ rack-protection (1.2.0)
27
29
  rack
28
30
  rack-test (0.6.1)
29
31
  rack (>= 1.0)
30
32
  rake (0.9.2.2)
31
- rcov (0.9.11)
32
- rspec (2.7.0)
33
- rspec-core (~> 2.7.0)
34
- rspec-expectations (~> 2.7.0)
35
- rspec-mocks (~> 2.7.0)
36
- rspec-core (2.7.1)
37
- rspec-expectations (2.7.0)
33
+ rdoc (3.12)
34
+ json (~> 1.4)
35
+ rspec (2.8.0)
36
+ rspec-core (~> 2.8.0)
37
+ rspec-expectations (~> 2.8.0)
38
+ rspec-mocks (~> 2.8.0)
39
+ rspec-core (2.8.0)
40
+ rspec-expectations (2.8.0)
38
41
  diff-lcs (~> 1.1.2)
39
- rspec-mocks (2.7.0)
40
- sinatra (1.3.1)
41
- rack (~> 1.3, >= 1.3.4)
42
- rack-protection (~> 1.1, >= 1.1.2)
42
+ rspec-mocks (2.8.0)
43
+ sinatra (1.3.2)
44
+ rack (~> 1.3, >= 1.3.6)
45
+ rack-protection (~> 1.2)
43
46
  tilt (~> 1.3, >= 1.3.3)
44
47
  tilt (1.3.3)
45
- webmock (1.7.8)
48
+ webmock (1.7.10)
46
49
  addressable (~> 2.2, > 2.2.5)
47
50
  crack (>= 0.1.7)
48
51
 
@@ -53,14 +56,11 @@ DEPENDENCIES
53
56
  activesupport (>= 2.0.0)
54
57
  addressable (~> 2.2)
55
58
  dragonfly (~> 0.9.5)
56
- haml (~> 3.0)
57
59
  httparty (~> 0.8.1)
58
60
  imagesize (~> 0.1)
59
61
  jeweler (~> 1.5)
60
- json (~> 1.5)
61
62
  newrelic_rpm
62
63
  rack-test
63
- rcov
64
64
  rspec (~> 2.4)
65
65
  sinatra (~> 1.2)
66
66
  webmock (~> 1.6)
data/HISTORY.md CHANGED
@@ -1,5 +1,27 @@
1
1
  This gem respects [semantic versioning](http://semver.org/).
2
2
 
3
+ # 1.4.0 (1/26/12)
4
+
5
+ [commits](https://github.com/afeld/magickly/compare/v1.3.0...v1.4.0)
6
+
7
+ * SECURITY: don't pass cookies to image request (tolsen)
8
+ * removed async support (for now) - needs more extensive testing
9
+ * added /q syntax as alternative to query params (tolsen)
10
+ * added JCN effect
11
+
12
+ # 1.2.1 (12/21/11)
13
+
14
+ [commits](https://github.com/afeld/magickly/compare/v1.2.0...v1.2.1)
15
+
16
+ * made compatible w/ Dragonfly v0.9.8 (tolsen)
17
+
18
+ # 1.3.0 (9/5/11) - YANKED
19
+
20
+ [commits](https://github.com/afeld/magickly/compare/v1.2.0...v1.3.0)
21
+
22
+ * added asynchronous support when using Ruby 1.9 or JRuby
23
+ * reduced gem dependencies
24
+
3
25
  # 1.2.0 (6/28/11)
4
26
 
5
27
  [commits](https://github.com/afeld/magickly/compare/v1.1.3...v1.2.0)
data/README.md CHANGED
@@ -2,27 +2,29 @@
2
2
 
3
3
  A service for image manipulation - built as a simple wrapper of Imagemagick which handles caching, c/o the [Dragonfly](http://markevans.github.com/dragonfly/) gem.
4
4
 
5
- Say the base URL is the hosted version of this app, [magickly.heroku.com](http://magickly.heroku.com). The image URL is appended to the query string as a `src=`, followed by any of the supported operations below. Multiple operations can be combined, and will be applied in order.
5
+ Say the base URL is the hosted version of this app, [magickly.jux.com](http://magickly.jux.com). The image URL is appended to the query string as a `src=`, followed by any of the supported operations below. Multiple operations can be combined, and will be applied in order.
6
6
 
7
7
  If no query params are provided, a simple sandbox page is displayed. Try it here:
8
8
 
9
- [magickly.heroku.com](http://magickly.heroku.com)
9
+ [magickly.jux.com](http://magickly.jux.com)
10
10
 
11
11
  ## Installation
12
12
 
13
- Requires Imagemagick >= v6.2.4.
13
+ Requires Ruby 1.8.7 or 1.9.2, and Imagemagick >= v6.2.4.
14
14
 
15
15
  $ gem install magickly
16
16
 
17
17
  ## Running the App
18
18
 
19
- A few options:
19
+ For Ruby 1.9.2, you will need to use an Eventmachine-compatible server, i.e. [Thin](http://code.macournoyer.com/thin/) or [Rainbows](http://rainbows.rubyforge.org/). A few options:
20
20
 
21
21
  ### A. Run the app directly
22
22
 
23
- $ magickly
23
+ # in the app directory:
24
+ $ gem install thin
25
+ $ thin start
24
26
 
25
- The app can be accessed at [http://localhost:4567](http://localhost:4567)
27
+ The app can be accessed at [http://localhost:3000](http://localhost:3000). To deploy to Heroku's Cedar stack (or another server using Foreman), see the [cedar](https://github.com/afeld/magickly/tree/cedar) branch.
26
28
 
27
29
  ### B. Use as an endpoint in another Rack app
28
30
 
@@ -48,91 +50,113 @@ The URL of the original image.
48
50
 
49
51
  *brightness* and *contrast* are percentage change, between -100 and 100. For example, to increase contrast by 20% but leave brightness unchanged, use `brightness_contrast=0x20`.
50
52
 
51
- ![tanned imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&brightness_contrast=-10x50)
53
+ ![tanned imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&brightness_contrast=-10x50)
52
54
 
53
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&brightness_contrast=-10x50](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&brightness_contrast=-10x50)
55
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&brightness_contrast=-10x50](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&brightness_contrast=-10x50)
54
56
 
55
57
  ### flip=true
56
58
 
57
- ![flipped imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flip=true)
59
+ ![flipped imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flip=true)
58
60
 
59
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flip=true](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flip=true)
61
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flip=true](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flip=true)
60
62
 
61
63
  ### flop=true
62
64
 
63
- ![flopped imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flop=true)
65
+ ![flopped imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flop=true)
64
66
 
65
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flop=true](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flop=true)
67
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flop=true](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&flop=true)
66
68
 
67
69
  ### glow=*amount*,*softness*
68
70
 
69
71
  where `amount` is a float >= 1.0, and `softness` is an int >= 0.
70
72
 
71
- ![glowing imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&glow=1.2,20)
73
+ ![glowing imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&glow=1.2,20)
72
74
 
73
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&glow=1.2,20](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&glow=1.2,20)
75
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&glow=1.2,20](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&glow=1.2,20)
74
76
 
75
77
  ### greyscale=true
76
78
 
77
- ![flopped imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&greyscale=true)
79
+ ![flopped imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&greyscale=true)
78
80
 
79
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&greyscale=true](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&greyscale=true)
81
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&greyscale=true](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&greyscale=true)
80
82
 
81
83
  ### halftone=*threshold*
82
84
 
83
85
  where *threshold* is a value between 0 and 100.
84
86
 
85
- ![halftone imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&halftone=60)
87
+ ![halftone imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&halftone=60)
86
88
 
87
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&halftone=60](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&halftone=60)
89
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&halftone=60](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&halftone=60)
90
+
91
+ ### jcn=true
92
+
93
+ ![JCN imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&jcn=true)
94
+
95
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&jcn=true](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&jcn=true)
88
96
 
89
97
  ### resize=*geometry*
90
98
 
91
- ![resized imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&resize=100x100)
99
+ ![resized imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&resize=100x100)
92
100
 
93
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&resize=100x100](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&resize=100x100)
101
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&resize=100x100](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&resize=100x100)
94
102
 
95
103
  ### rotate=*degrees*
96
104
 
97
- ![rotated imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&rotate=45)
105
+ ![rotated imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&rotate=45)
98
106
 
99
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&rotate=45](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&rotate=45)
107
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&rotate=45](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&rotate=45)
100
108
 
101
109
  ### saturation=*percentage*
102
110
 
103
111
  *percentage* is the percentage of variation: a positive integer. 100 means no change. For example, to increase saturation by 50%, use `saturation=150`.
104
112
 
105
- ![saturated imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&saturation=150)
113
+ ![saturated imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&saturation=150)
106
114
 
107
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&saturation=150](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&saturation=150)
115
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&saturation=150](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&saturation=150)
108
116
 
109
117
  ### tilt_shift=true
110
118
 
111
- ![tilt-shifted imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&tilt_shift=true)
119
+ ![tilt-shifted imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&tilt_shift=true)
112
120
 
113
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&tilt_shift=true](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&tilt_shift=true)
121
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&tilt_shift=true](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&tilt_shift=true)
114
122
 
115
123
  ### thumb=*geometry*
116
124
 
117
- ![thumbnail of imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&thumb=200x100%23)
125
+ ![thumbnail of imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&thumb=200x100%23)
118
126
 
119
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&thumb=200x100%23](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&thumb=200x100%23)
127
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&thumb=200x100%23](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&thumb=200x100%23)
120
128
 
121
129
  (note: the `%23` in the geometry string above is an encoded '`#`', which tells Dragonfly to fill the dimensions and crop)
122
130
 
123
131
  ### two_color=true
124
132
 
125
- ![two color imagemagick logo](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&two_color=true)
133
+ ![two color imagemagick logo](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&two_color=true)
134
+
135
+ [http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&two_color=true](http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&two_color=true)
136
+
137
+ ## Alternate Syntax
138
+
139
+ Some CDNs are jerks and don't respect query params on resources (_ahem_ CLOUDFRONT _ahem_) when caching. To use this syntax:
126
140
 
127
- [http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&two_color=true](http://magickly.heroku.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&two_color=true)
141
+ * replace the question mark that starts the query string (`?`) with `q/`
142
+ * replace the ampersands (`&`) and equals signs (`=`) with forward slashes (`/`)
143
+ * make sure the `src` is encoded - this can be done in Javascript with `encodeURIComponent()`
144
+
145
+ Therefore, instead of
146
+
147
+ http://magickly.jux.com/?src=http://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Imagemagick-logo.png/200px-Imagemagick-logo.png&thumb=200x100
148
+
149
+ the new URL would be
150
+
151
+ http://magickly.jux.com/q/src/http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2F0%2F0d%2FImagemagick-logo.png%2F200px-Imagemagick-logo.png/thumb/200x100
128
152
 
129
153
  ## Analyzers
130
154
 
131
155
  Magickly v1.2.0 introduces the ability to retrieve image properties via a REST API. For example, to retrieve the number of colors in the photo, visit:
132
156
 
133
- [magickly.heroku.com/analyze/number_of_colors?src=http://upload.wikimedia.org/wikipedia/commons/0/0d/Imagemagick-logo.png](http://magickly.heroku.com/analyze/number_of_colors?src=http://upload.wikimedia.org/wikipedia/commons/0/0d/Imagemagick-logo.png)
157
+ [magickly.jux.com/analyze/number_of_colors?src=http://upload.wikimedia.org/wikipedia/commons/0/0d/Imagemagick-logo.png](http://magickly.jux.com/analyze/number_of_colors?src=http://upload.wikimedia.org/wikipedia/commons/0/0d/Imagemagick-logo.png)
134
158
 
135
- To get the list of available analyzers, visit [magickly.heroku.com/analyze](http://magickly.heroku.com/analyze)
159
+ To get the list of available analyzers, visit [magickly.jux.com/analyze](http://magickly.jux.com/analyze)
136
160
 
137
161
  ## Customization
138
162
 
@@ -149,6 +173,10 @@ which can then be used with the query string `?src=...&resize_with_blur=200x`.
149
173
 
150
174
  See the [Dragonfly documentation](http://markevans.github.com/dragonfly/file.GeneralUsage.html#Shortcuts) for more info on "shortcuts", and the [shortcuts.rb](https://github.com/afeld/magickly/blob/master/lib/shortcuts.rb) file for examples.
151
175
 
176
+ ## Disclaimer
177
+
178
+ The hosted version of the app ([magickly.jux.com](http://magickly.jux.com)) is a single app instance intended for demonstration purposes - if you are going to be making a large number of API calls to it or would like to use it in production, please let us know :-)
179
+
152
180
  ## Contributing to magickly
153
181
 
154
182
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
data/Rakefile CHANGED
@@ -19,7 +19,6 @@ Jeweler::Tasks.new do |gem|
19
19
  gem.description = %Q{A service for image manipulation - built as an extensible wrapper of Imagemagick which handles caching, c/o the Dragonfly gem.}
20
20
  gem.email = "aidan.feldman@gmail.com"
21
21
  gem.authors = ["Aidan Feldman"]
22
- gem.executables = ['magickly']
23
22
  gem.files.include '.gemtest'
24
23
  # Include your dependencies below. Runtime dependencies are required when using your gem,
25
24
  # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
@@ -42,8 +41,8 @@ end
42
41
  task :default => :spec
43
42
  task :test => :spec
44
43
 
45
- require 'rake/rdoctask'
46
- Rake::RDocTask.new do |rdoc|
44
+ require 'rdoc/task'
45
+ RDoc::Task.new do |rdoc|
47
46
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
47
 
49
48
  rdoc.rdoc_dir = 'rdoc'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.1
1
+ 1.4.0
@@ -7,14 +7,12 @@ module Dragonfly
7
7
  class RemoteDataStore
8
8
  include Configurable
9
9
 
10
- configurable_attr :cookie_str
11
-
12
10
  def store(temp_object, opts={})
13
11
  raise "Sorry friend, this datastore is read-only."
14
12
  end
15
13
 
16
14
  def retrieve(uid)
17
- response = HTTParty.get uid, :headers => {'cookie' => cookie_str || ''}, :timeout => 3
15
+ response = HTTParty.get uid, :timeout => 3
18
16
  unless response.ok?
19
17
  #raise Forbidden if response.code == 403
20
18
  raise DataNotFound
@@ -1,3 +1,4 @@
1
+ require 'active_support/json'
1
2
  require 'active_support/core_ext/object/blank'
2
3
  require 'active_support/ordered_hash'
3
4
 
@@ -15,6 +16,8 @@ module Magickly
15
16
  @dragonfly.configure do |c|
16
17
  c.datastore = Dragonfly::DataStorage::RemoteDataStore.new
17
18
  c.log = Logger.new($stdout)
19
+
20
+ # seems this config param was removed from Dragonfly ~v0.9.8
18
21
  # c.log_commands = true
19
22
  end
20
23
 
@@ -1,7 +1,7 @@
1
1
  module Magickly
2
2
  class App < Sinatra::Base
3
3
  RESERVED_PARAMS = ['src']
4
- DEMO_IMAGE = 'http://upload.wikimedia.org/wikipedia/commons/0/0d/Imagemagick-logo.png'
4
+ DEMO_IMAGE = 'http://farm4.static.flickr.com/3351/3450592233_c29fde01ef_z.jpg'
5
5
 
6
6
  enable :logging
7
7
  set :root, File.join(File.dirname(__FILE__), '..')
@@ -11,13 +11,15 @@ module Magickly
11
11
  require 'newrelic_rpm' if ENV['NEW_RELIC_ID']
12
12
  end
13
13
 
14
-
15
14
  before do
16
- Magickly.dragonfly.datastore.configure do |d|
17
- # pass cookies to subsequent request
18
- d.cookie_str = request.env["rack.request.cookie_string"]
15
+ # redirect to MAGICKLY_APP_DOMAIN, if specified
16
+ app_host = ENV['MAGICKLY_APP_DOMAIN']
17
+ if app_host && request.host != app_host
18
+ request_host_with_port = request.env['HTTP_HOST']
19
+ redirect request.url.sub(request_host_with_port, app_host), 301
19
20
  end
20
21
 
22
+ # parse query params so they are ordered
21
23
  @options = ActiveSupport::OrderedHash.new
22
24
  request.query_string.split('&').each do |e|
23
25
  k,v = e.split('=')
@@ -26,27 +28,34 @@ module Magickly
26
28
  end
27
29
 
28
30
  get '/' do
29
- src = params['src']
31
+ process_src_or_display_demo params[:src], @options
32
+ end
33
+
34
+ get '/q/*' do
35
+ src = nil
36
+ opts = ActiveSupport::OrderedHash.new
37
+ splat = request.path_info.sub /^\/q\//, ''
30
38
 
31
- if src
32
- # process image
33
- url = uri_to_url(src)
34
- image = Magickly.process_src(url, @options)
35
- image.to_response(env)
36
- else
37
- # display demo page
38
-
39
- # get combined list of jobs and processor methods
40
- @methods = ( Magickly.dragonfly.job_methods | Magickly.dragonfly.processor_methods )
41
- @methods.sort!{|m1, m2| m1.to_s <=> m2.to_s }
42
- haml :index
39
+ splat.split('/').each_slice(2) do |k, v|
40
+ if RESERVED_PARAMS.include? k
41
+ if k == 'src'
42
+ src = URI.unescape(v)
43
+ # slashes come in double-escaped by Apache so we
44
+ # need to unescape again
45
+ src = URI.unescape(src) if src =~ /%2F/
46
+ end
47
+ else
48
+ opts[k] = URI.unescape(v)
49
+ end
43
50
  end
51
+
52
+ process_src_or_display_demo src, opts
44
53
  end
45
54
 
46
55
  get '/analyze' do
47
56
  @analyzers = Magickly.dragonfly.analyser_methods
48
57
  @analyzers.sort!{|m1, m2| m1.to_s <=> m2.to_s }
49
- haml :analyzers
58
+ erb :analyzers
50
59
  end
51
60
 
52
61
  get '/analyze/:name' do |method|
@@ -68,7 +77,22 @@ module Magickly
68
77
  "Please provide an image URL with the src parameter."
69
78
  end
70
79
  end
71
-
80
+
81
+ def process_src_or_display_demo src, options
82
+ if src
83
+ # process image
84
+ url = uri_to_url src
85
+ image = Magickly.process_src(url, options)
86
+ image.to_response(env)
87
+ else
88
+ # display demo page
89
+
90
+ # get combined list of jobs and processor methods
91
+ @methods = ( Magickly.dragonfly.job_methods | Magickly.dragonfly.processor_methods )
92
+ @methods.sort!{|m1, m2| m1.to_s <=> m2.to_s }
93
+ erb :index
94
+ end
95
+ end
72
96
 
73
97
  def uri_to_url(uri)
74
98
  url = Addressable::URI.parse(uri)