miso 0.1.0

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.
Files changed (39) hide show
  1. data/LICENSE +20 -0
  2. data/README +55 -0
  3. data/Rakefile +54 -0
  4. data/TODO +2 -0
  5. data/VERSION +1 -0
  6. data/html/classes/Miso.html +133 -0
  7. data/html/classes/Miso/Factory.html +278 -0
  8. data/html/classes/Miso/Image.html +394 -0
  9. data/html/classes/Miso/Processor.html +379 -0
  10. data/html/classes/Miso/Processor/CoreImage.html +246 -0
  11. data/html/classes/Miso/Processor/ImageMagick.html +345 -0
  12. data/html/classes/Miso/Processor/NotImplementedError.html +111 -0
  13. data/html/created.rid +1 -0
  14. data/html/files/LICENSE.html +133 -0
  15. data/html/files/README.html +156 -0
  16. data/html/files/lib/miso/factory_rb.html +101 -0
  17. data/html/files/lib/miso/image_rb.html +101 -0
  18. data/html/files/lib/miso/processor/core_image_rb.html +108 -0
  19. data/html/files/lib/miso/processor/image_magick_rb.html +110 -0
  20. data/html/files/lib/miso/processor_rb.html +101 -0
  21. data/html/files/lib/miso_rb.html +101 -0
  22. data/html/fr_class_index.html +33 -0
  23. data/html/fr_file_index.html +34 -0
  24. data/html/fr_method_index.html +62 -0
  25. data/html/index.html +24 -0
  26. data/html/rdoc-style.css +208 -0
  27. data/lib/miso.rb +5 -0
  28. data/lib/miso/factory.rb +53 -0
  29. data/lib/miso/image.rb +51 -0
  30. data/lib/miso/processor.rb +61 -0
  31. data/lib/miso/processor/core_image.rb +27 -0
  32. data/lib/miso/processor/image_magick.rb +59 -0
  33. data/spec/api/factory_spec.rb +31 -0
  34. data/spec/api/image_spec.rb +115 -0
  35. data/spec/api/processor/image_magick_spec.rb +22 -0
  36. data/spec/api/processor_spec.rb +41 -0
  37. data/spec/fixtures/120x100.png +0 -0
  38. data/spec/start.rb +30 -0
  39. metadata +97 -0
@@ -0,0 +1,33 @@
1
+
2
+ <?xml version="1.0" encoding="utf-8"?>
3
+ <!DOCTYPE html
4
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+
7
+ <!--
8
+
9
+ Classes
10
+
11
+ -->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
+ <head>
14
+ <title>Classes</title>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
16
+ <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
+ <base target="docwin" />
18
+ </head>
19
+ <body>
20
+ <div id="index">
21
+ <h1 class="section-bar">Classes</h1>
22
+ <div id="index-entries">
23
+ <a href="classes/Miso.html">Miso</a><br />
24
+ <a href="classes/Miso/Factory.html">Miso::Factory</a><br />
25
+ <a href="classes/Miso/Image.html">Miso::Image</a><br />
26
+ <a href="classes/Miso/Processor.html">Miso::Processor</a><br />
27
+ <a href="classes/Miso/Processor/CoreImage.html">Miso::Processor::CoreImage</a><br />
28
+ <a href="classes/Miso/Processor/ImageMagick.html">Miso::Processor::ImageMagick</a><br />
29
+ <a href="classes/Miso/Processor/NotImplementedError.html">Miso::Processor::NotImplementedError</a><br />
30
+ </div>
31
+ </div>
32
+ </body>
33
+ </html>
@@ -0,0 +1,34 @@
1
+
2
+ <?xml version="1.0" encoding="utf-8"?>
3
+ <!DOCTYPE html
4
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+
7
+ <!--
8
+
9
+ Files
10
+
11
+ -->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
+ <head>
14
+ <title>Files</title>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
16
+ <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
+ <base target="docwin" />
18
+ </head>
19
+ <body>
20
+ <div id="index">
21
+ <h1 class="section-bar">Files</h1>
22
+ <div id="index-entries">
23
+ <a href="files/LICENSE.html">LICENSE</a><br />
24
+ <a href="files/README.html">README</a><br />
25
+ <a href="files/lib/miso_rb.html">lib/miso.rb</a><br />
26
+ <a href="files/lib/miso/factory_rb.html">lib/miso/factory.rb</a><br />
27
+ <a href="files/lib/miso/image_rb.html">lib/miso/image.rb</a><br />
28
+ <a href="files/lib/miso/processor_rb.html">lib/miso/processor.rb</a><br />
29
+ <a href="files/lib/miso/processor/core_image_rb.html">lib/miso/processor/core_image.rb</a><br />
30
+ <a href="files/lib/miso/processor/image_magick_rb.html">lib/miso/processor/image_magick.rb</a><br />
31
+ </div>
32
+ </div>
33
+ </body>
34
+ </html>
@@ -0,0 +1,62 @@
1
+
2
+ <?xml version="1.0" encoding="utf-8"?>
3
+ <!DOCTYPE html
4
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+
7
+ <!--
8
+
9
+ Methods
10
+
11
+ -->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
+ <head>
14
+ <title>Methods</title>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
16
+ <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
+ <base target="docwin" />
18
+ </head>
19
+ <body>
20
+ <div id="index">
21
+ <h1 class="section-bar">Methods</h1>
22
+ <div id="index-entries">
23
+ <a href="classes/Miso/Factory.html#M000026">apply (Miso::Factory)</a><br />
24
+ <a href="classes/Miso/Processor.html#M000003">available? (Miso::Processor)</a><br />
25
+ <a href="classes/Miso/Processor/CoreImage.html#M000017">available? (Miso::Processor::CoreImage)</a><br />
26
+ <a href="classes/Miso/Processor/ImageMagick.html#M000009">available? (Miso::Processor::ImageMagick)</a><br />
27
+ <a href="classes/Miso/Processor/ImageMagick.html#M000014">convert (Miso::Processor::ImageMagick)</a><br />
28
+ <a href="classes/Miso/Image.html#M000029">crop (Miso::Image)</a><br />
29
+ <a href="classes/Miso/Processor.html#M000005">crop (Miso::Processor)</a><br />
30
+ <a href="classes/Miso/Factory.html#M000023">crop (Miso::Factory)</a><br />
31
+ <a href="classes/Miso/Image.html#M000034">crop (Miso::Image)</a><br />
32
+ <a href="classes/Miso/Processor/CoreImage.html#M000018">crop (Miso::Processor::CoreImage)</a><br />
33
+ <a href="classes/Miso/Processor/ImageMagick.html#M000010">crop (Miso::Processor::ImageMagick)</a><br />
34
+ <a href="classes/Miso/Image.html#M000033">crop_fitting (Miso::Image)</a><br />
35
+ <a href="classes/Miso/Factory.html#M000025">crop_fitting (Miso::Factory)</a><br />
36
+ <a href="classes/Miso/Image.html#M000031">dimensions (Miso::Image)</a><br />
37
+ <a href="classes/Miso/Image.html#M000036">dimensions (Miso::Image)</a><br />
38
+ <a href="classes/Miso/Processor.html#M000007">dimensions (Miso::Processor)</a><br />
39
+ <a href="classes/Miso/Processor/ImageMagick.html#M000012">dimensions (Miso::Processor::ImageMagick)</a><br />
40
+ <a href="classes/Miso/Processor/CoreImage.html#M000020">dimensions (Miso::Processor::CoreImage)</a><br />
41
+ <a href="classes/Miso/Processor/ImageMagick.html#M000016">ensure_output_directory (Miso::Processor::ImageMagick)</a><br />
42
+ <a href="classes/Miso/Image.html#M000027">factory (Miso::Image)</a><br />
43
+ <a href="classes/Miso/Processor/ImageMagick.html#M000011">fit (Miso::Processor::ImageMagick)</a><br />
44
+ <a href="classes/Miso/Processor.html#M000006">fit (Miso::Processor)</a><br />
45
+ <a href="classes/Miso/Image.html#M000035">fit (Miso::Image)</a><br />
46
+ <a href="classes/Miso/Factory.html#M000024">fit (Miso::Factory)</a><br />
47
+ <a href="classes/Miso/Image.html#M000030">fit (Miso::Image)</a><br />
48
+ <a href="classes/Miso/Processor/CoreImage.html#M000019">fit (Miso::Processor::CoreImage)</a><br />
49
+ <a href="classes/Miso/Factory.html#M000022">new (Miso::Factory)</a><br />
50
+ <a href="classes/Miso/Image.html#M000028">new (Miso::Image)</a><br />
51
+ <a href="classes/Miso/Processor.html#M000004">new (Miso::Processor)</a><br />
52
+ <a href="classes/Miso/Processor/ImageMagick.html#M000015">operations (Miso::Processor::ImageMagick)</a><br />
53
+ <a href="classes/Miso/Processor.html#M000001">processor_class (Miso::Processor)</a><br />
54
+ <a href="classes/Miso/Processor.html#M000002">processor_classes (Miso::Processor)</a><br />
55
+ <a href="classes/Miso/Processor/CoreImage.html#M000021">write (Miso::Processor::CoreImage)</a><br />
56
+ <a href="classes/Miso/Processor.html#M000008">write (Miso::Processor)</a><br />
57
+ <a href="classes/Miso/Processor/ImageMagick.html#M000013">write (Miso::Processor::ImageMagick)</a><br />
58
+ <a href="classes/Miso/Image.html#M000032">write (Miso::Image)</a><br />
59
+ </div>
60
+ </div>
61
+ </body>
62
+ </html>
data/html/index.html ADDED
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
5
+
6
+ <!--
7
+
8
+ RDoc Documentation
9
+
10
+ -->
11
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
12
+ <head>
13
+ <title>RDoc Documentation</title>
14
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
15
+ </head>
16
+ <frameset rows="20%, 80%">
17
+ <frameset cols="25%,35%,45%">
18
+ <frame src="fr_file_index.html" title="Files" name="Files" />
19
+ <frame src="fr_class_index.html" name="Classes" />
20
+ <frame src="fr_method_index.html" name="Methods" />
21
+ </frameset>
22
+ <frame src="files/README.html" name="docwin" />
23
+ </frameset>
24
+ </html>
@@ -0,0 +1,208 @@
1
+
2
+ body {
3
+ font-family: Verdana,Arial,Helvetica,sans-serif;
4
+ font-size: 90%;
5
+ margin: 0;
6
+ margin-left: 40px;
7
+ padding: 0;
8
+ background: white;
9
+ }
10
+
11
+ h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
12
+ h1 { font-size: 150%; }
13
+ h2,h3,h4 { margin-top: 1em; }
14
+
15
+ a { background: #eef; color: #039; text-decoration: none; }
16
+ a:hover { background: #039; color: #eef; }
17
+
18
+ /* Override the base stylesheet's Anchor inside a table cell */
19
+ td > a {
20
+ background: transparent;
21
+ color: #039;
22
+ text-decoration: none;
23
+ }
24
+
25
+ /* and inside a section title */
26
+ .section-title > a {
27
+ background: transparent;
28
+ color: #eee;
29
+ text-decoration: none;
30
+ }
31
+
32
+ /* === Structural elements =================================== */
33
+
34
+ div#index {
35
+ margin: 0;
36
+ margin-left: -40px;
37
+ padding: 0;
38
+ font-size: 90%;
39
+ }
40
+
41
+
42
+ div#index a {
43
+ margin-left: 0.7em;
44
+ }
45
+
46
+ div#index .section-bar {
47
+ margin-left: 0px;
48
+ padding-left: 0.7em;
49
+ background: #ccc;
50
+ font-size: small;
51
+ }
52
+
53
+
54
+ div#classHeader, div#fileHeader {
55
+ width: auto;
56
+ color: white;
57
+ padding: 0.5em 1.5em 0.5em 1.5em;
58
+ margin: 0;
59
+ margin-left: -40px;
60
+ border-bottom: 3px solid #006;
61
+ }
62
+
63
+ div#classHeader a, div#fileHeader a {
64
+ background: inherit;
65
+ color: white;
66
+ }
67
+
68
+ div#classHeader td, div#fileHeader td {
69
+ background: inherit;
70
+ color: white;
71
+ }
72
+
73
+
74
+ div#fileHeader {
75
+ background: #057;
76
+ }
77
+
78
+ div#classHeader {
79
+ background: #048;
80
+ }
81
+
82
+
83
+ .class-name-in-header {
84
+ font-size: 180%;
85
+ font-weight: bold;
86
+ }
87
+
88
+
89
+ div#bodyContent {
90
+ padding: 0 1.5em 0 1.5em;
91
+ }
92
+
93
+ div#description {
94
+ padding: 0.5em 1.5em;
95
+ background: #efefef;
96
+ border: 1px dotted #999;
97
+ }
98
+
99
+ div#description h1,h2,h3,h4,h5,h6 {
100
+ color: #125;;
101
+ background: transparent;
102
+ }
103
+
104
+ div#validator-badges {
105
+ text-align: center;
106
+ }
107
+ div#validator-badges img { border: 0; }
108
+
109
+ div#copyright {
110
+ color: #333;
111
+ background: #efefef;
112
+ font: 0.75em sans-serif;
113
+ margin-top: 5em;
114
+ margin-bottom: 0;
115
+ padding: 0.5em 2em;
116
+ }
117
+
118
+
119
+ /* === Classes =================================== */
120
+
121
+ table.header-table {
122
+ color: white;
123
+ font-size: small;
124
+ }
125
+
126
+ .type-note {
127
+ font-size: small;
128
+ color: #DEDEDE;
129
+ }
130
+
131
+ .xxsection-bar {
132
+ background: #eee;
133
+ color: #333;
134
+ padding: 3px;
135
+ }
136
+
137
+ .section-bar {
138
+ color: #333;
139
+ border-bottom: 1px solid #999;
140
+ margin-left: -20px;
141
+ }
142
+
143
+
144
+ .section-title {
145
+ background: #79a;
146
+ color: #eee;
147
+ padding: 3px;
148
+ margin-top: 2em;
149
+ margin-left: -30px;
150
+ border: 1px solid #999;
151
+ }
152
+
153
+ .top-aligned-row { vertical-align: top }
154
+ .bottom-aligned-row { vertical-align: bottom }
155
+
156
+ /* --- Context section classes ----------------------- */
157
+
158
+ .context-row { }
159
+ .context-item-name { font-family: monospace; font-weight: bold; color: black; }
160
+ .context-item-value { font-size: small; color: #448; }
161
+ .context-item-desc { color: #333; padding-left: 2em; }
162
+
163
+ /* --- Method classes -------------------------- */
164
+ .method-detail {
165
+ background: #efefef;
166
+ padding: 0;
167
+ margin-top: 0.5em;
168
+ margin-bottom: 1em;
169
+ border: 1px dotted #ccc;
170
+ }
171
+ .method-heading {
172
+ color: black;
173
+ background: #ccc;
174
+ border-bottom: 1px solid #666;
175
+ padding: 0.2em 0.5em 0 0.5em;
176
+ }
177
+ .method-signature { color: black; background: inherit; }
178
+ .method-name { font-weight: bold; }
179
+ .method-args { font-style: italic; }
180
+ .method-description { padding: 0 0.5em 0 0.5em; }
181
+
182
+ /* --- Source code sections -------------------- */
183
+
184
+ a.source-toggle { font-size: 90%; }
185
+ div.method-source-code {
186
+ background: #262626;
187
+ color: #ffdead;
188
+ margin: 1em;
189
+ padding: 0.5em;
190
+ border: 1px dashed #999;
191
+ overflow: hidden;
192
+ }
193
+
194
+ div.method-source-code pre { color: #ffdead; overflow: hidden; }
195
+
196
+ /* --- Ruby keyword styles --------------------- */
197
+
198
+ .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
199
+
200
+ .ruby-constant { color: #7fffd4; background: transparent; }
201
+ .ruby-keyword { color: #00ffff; background: transparent; }
202
+ .ruby-ivar { color: #eedd82; background: transparent; }
203
+ .ruby-operator { color: #00ffee; background: transparent; }
204
+ .ruby-identifier { color: #ffdead; background: transparent; }
205
+ .ruby-node { color: #ffa07a; background: transparent; }
206
+ .ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
207
+ .ruby-regexp { color: #ffa07a; background: transparent; }
208
+ .ruby-value { color: #7fffd4; background: transparent; }
data/lib/miso.rb ADDED
@@ -0,0 +1,5 @@
1
+ module Miso
2
+ autoload :Factory, 'miso/factory'
3
+ autoload :Image, 'miso/image'
4
+ autoload :Processor, 'miso/processor'
5
+ end
@@ -0,0 +1,53 @@
1
+ module Miso
2
+ class Image
3
+ def self.factory(processor_class = Processor.processor_class)
4
+ Factory.new(processor_class)
5
+ end
6
+ end
7
+
8
+ # A Miso::Image::Factory can be used to define multiple operations which are
9
+ # to be applied to an image.
10
+ #
11
+ # A typical use case would be:
12
+ #
13
+ # class Member < ActiveRecord::Base
14
+ # has_variant :avatar, :processor => Miso::Image.factory.crop(123, 456).watermark(WATERMARK, :southwest, 10, 10)
15
+ # end
16
+ #
17
+ # In this example, the resulting Miso::Factory instance would be used by the
18
+ # attachment library to apply the operations. Eg:
19
+ #
20
+ # module HasVariant
21
+ # def process_variant(name)
22
+ # variant = self.class.variants[name]
23
+ # variant.processor.apply(upload_file, output_file)
24
+ # end
25
+ # end
26
+ class Factory
27
+ def initialize(processor_class = Processor.processor_class)
28
+ @processor_class = processor_class
29
+ @operations = []
30
+ end
31
+
32
+ def crop(width, height)
33
+ @operations << [:crop, [width, height]]
34
+ self
35
+ end
36
+
37
+ def fit(width, height)
38
+ @operations << [:fit, [width, height]]
39
+ self
40
+ end
41
+
42
+ def crop_fitting(width, heigth)
43
+ @operations << [:crop_fitting, [width, height]]
44
+ self
45
+ end
46
+
47
+ def apply(input_file, output_file)
48
+ image = Image.new(input_file, @processor_class)
49
+ @operations.each { |method, args| image.send(method, *args) }
50
+ image.write(output_file)
51
+ end
52
+ end
53
+ end
data/lib/miso/image.rb ADDED
@@ -0,0 +1,51 @@
1
+ module Miso
2
+ class Image
3
+ attr_reader :processor
4
+
5
+ def initialize(input_file, processor_class=nil)
6
+ processor_class ||= Processor.processor_class
7
+ @processor = processor_class.new(input_file)
8
+ end
9
+
10
+ # Basic methods
11
+
12
+ def crop(width, height)
13
+ @processor.crop(width, height)
14
+ return self
15
+ end
16
+
17
+ def fit(width, height)
18
+ @processor.fit(width, height)
19
+ return self
20
+ end
21
+
22
+ def dimensions
23
+ @processor.dimensions
24
+ end
25
+
26
+ def write(output_file)
27
+ @processor.write(output_file)
28
+ self.class.new(output_file, @processor.class)
29
+ end
30
+
31
+ # Combined methods
32
+
33
+ def crop_fitting(width, heigth)
34
+ fit(width, heigth).crop(width, heigth)
35
+ end
36
+
37
+ # Class shortcut methods
38
+
39
+ def self.crop(input_file, output_file, width, height, processor_class = nil)
40
+ new(input_file, processor_class).crop(width, height).write(output_file)
41
+ end
42
+
43
+ def self.fit(input_file, output_file, width, height, processor_class = nil)
44
+ new(input_file, processor_class).fit(width, height).write(output_file)
45
+ end
46
+
47
+ def self.dimensions(input_file, processor_class = nil)
48
+ new(input_file, processor_class).dimensions
49
+ end
50
+ end
51
+ end