mustachio 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,32 @@
1
+ ENV['RACK_ENV'] ||= 'test'
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ Bundler.require
6
+
7
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
+ require 'mustachio'
9
+ require 'webmock/rspec'
10
+ require 'vcr'
11
+
12
+ Mustachio.set :environment, :test
13
+
14
+ # Requires supporting ruby files with custom matchers and macros, etc,
15
+ # in spec/support/ and its subdirectories.
16
+ Dir[File.join('spec', 'support', '**', '*.rb')].each {|f| require f}
17
+
18
+ VCR.config do |c|
19
+ c.cassette_library_dir = File.join(File.dirname(__FILE__), 'fixtures', 'vcr_cassettes')
20
+ c.stub_with :webmock # or :fakeweb
21
+ end
22
+
23
+ RSpec.configure do |config|
24
+ # == Mock Framework
25
+ #
26
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
27
+ #
28
+ # config.mock_with :mocha
29
+ # config.mock_with :flexmock
30
+ # config.mock_with :rr
31
+ config.mock_with :rspec
32
+ end
Binary file
Binary file
Binary file
@@ -0,0 +1,75 @@
1
+ # P.S. I'm pretty sure it's spelled "analyZer", but I'm staying consistent w/ Dragonfly
2
+ require 'spec_helper'
3
+
4
+ describe "retrieving face data" do
5
+ def get_photo(filename='dubya.jpeg')
6
+ image_url = "http://www.foo.com/#{filename}"
7
+ image_path = File.join(File.dirname(__FILE__), '..', 'support', filename)
8
+ stub_request(:get, image_url).to_return(:body => File.new(image_path))
9
+
10
+ Magickly.dragonfly.fetch(image_url)
11
+ end
12
+
13
+ def face_data(filename='dubya.jpeg')
14
+ photo = get_photo(filename)
15
+ data = nil
16
+ VCR.use_cassette( filename.chomp(File.extname(filename)) ) do
17
+ data = photo.face_data
18
+ end
19
+
20
+ data
21
+ end
22
+
23
+ def face_data_as_px(filename='dubya.jpeg')
24
+ photo = get_photo(filename)
25
+ data = nil
26
+ VCR.use_cassette( filename.chomp(File.extname(filename)) ) do
27
+ data = photo.face_data_as_px
28
+ end
29
+
30
+ data
31
+ end
32
+
33
+ describe "#face_data" do
34
+ it "should give similar results for small and large photos" do
35
+ big_obama_data = face_data('big_obama.jpeg')
36
+ small_obama_data = face_data('small_obama.jpeg')
37
+
38
+ big_eye_x = big_obama_data['tags'].first['eye_right']['x']
39
+ small_eye_x = small_obama_data['tags'].first['eye_right']['x']
40
+
41
+ big_eye_x.should be_kind_of Float
42
+ small_eye_x.should be_kind_of Float
43
+
44
+ # compare positioning (percentages)
45
+ small_eye_x.should be_within(1.0).of(small_eye_x)
46
+ end
47
+ end
48
+
49
+ describe "#face_data_as_px" do
50
+ it "should not scale a photo smaller than 900px" do
51
+ image = get_photo
52
+ image.height.should eq 300
53
+
54
+ VCR.use_cassette('dubya') do
55
+ image.face_data_as_px['height'].should eq 300
56
+ end
57
+ end
58
+
59
+ it "should scale the detection areas proportionally for large photos" do
60
+ big_obama_data = face_data_as_px('big_obama.jpeg')
61
+ small_obama_data = face_data_as_px('small_obama.jpeg')
62
+
63
+ big_eye_x = big_obama_data['tags'].first['eye_right']['x']
64
+ small_eye_x = small_obama_data['tags'].first['eye_right']['x']
65
+
66
+ big_eye_x.should be_kind_of Float
67
+ small_eye_x.should be_kind_of Float
68
+ big_eye_x.should_not be_within(1.0).of(small_eye_x)
69
+
70
+ scale = big_obama_data['width'] / small_obama_data['width'].to_f
71
+ # compare positioning (px)
72
+ big_eye_x.should be_within(5.0).of(small_eye_x * scale)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,69 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %title Face.com Developer Challenge Submission
5
+ %link{:href => 'http://fonts.googleapis.com/css?family=Bentham|IM+Fell+English+SC|OFL+Sorts+Mill+Goudy+TT|Oswald|Ultra', :rel=> 'stylesheet', :type => 'text/css'}
6
+ :css
7
+ body {
8
+ background-color: #E3CBA8;
9
+ color: #4F4841;
10
+ font-family: 'OFL Sorts Mill Goudy TT', arial, serif;
11
+ }
12
+ .wrapper {
13
+ border: 2px dotted #4F4841;
14
+ padding: 20px;
15
+ width: 600px;
16
+ margin: auto;
17
+ }
18
+ h1 {
19
+ text-align: center;
20
+ font-size: 6em;
21
+ font-family: 'Oswald', arial, serif;
22
+ }
23
+ h2 {
24
+ text-align: center;
25
+ font-family: 'Ultra', arial, serif;
26
+ }
27
+ body h1:first-child {
28
+ margin: 0;
29
+ }
30
+ p {
31
+ font-style: italic;
32
+ }
33
+ hr {
34
+ width: 15%;
35
+ color: #4F4841;
36
+ border: 1px solid #4F4841;
37
+ }
38
+ .im-fell {
39
+ font-style: normal;
40
+ font-family: 'IM Fell English SC', arial, serif;
41
+ font-size: 1.8em;
42
+ }
43
+ .bentham {
44
+ font-family: 'Bentham', arial, serif;
45
+ font-style: normal;
46
+ }
47
+ #guy-hecker {
48
+ display: block;
49
+ margin: auto;
50
+ width: 204px;
51
+ }
52
+ = haml :ga
53
+ %body
54
+ .wrapper
55
+ %h1 NOTICE
56
+ %p
57
+ In the entire history of photography, countless photographs of friends and loved ones have remained common and humdrum. We, the people, say:
58
+ %h2 This will not stand.
59
+ %p
60
+ On this, the fifteenth day of May, 2011: I, Aidan Feldman, declare my intent to build the mobile application by the name of "mustachio", with intent to settle this score.
61
+ %p
62
+ %span.im-fell In said application,
63
+ upon the taking of a digital photograph, all faces are detected and mustaches are applied forthwith, endowing instant poise and panache to otherwise colloquial subjects, all before one can proclaim "<a href='http://en.wikipedia.org/wiki/Ambrose_Burnside'>Ambrose Burnside</a>". These properly whiskered photos are then suitable to be shared with acquaintances and cohorts across the globe, which can then be accomplished from within the comfort of "mustachio".
64
+ %hr
65
+ .separator
66
+ %p.bentham
67
+ An application by the same name has been constructed for the world wide web - see
68
+ %a{:href => 'https://github.com/afeld/mustachio'} https://github.com/afeld/mustachio
69
+ %img#guy-hecker{:src => '/images/guy_hecker.jpeg', :alt => ''}
data/views/ga.haml ADDED
@@ -0,0 +1,12 @@
1
+ :javascript
2
+ var _gaq = _gaq || [];
3
+ _gaq.push(['_setAccount', 'UA-23374334-1']);
4
+ _gaq.push(['_setDomainName', 'none']);
5
+ _gaq.push(['_setAllowLinker', true]);
6
+ _gaq.push(['_trackPageview']);
7
+
8
+ (function() {
9
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
10
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
11
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
12
+ })();
data/views/index.haml ADDED
@@ -0,0 +1,10 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %title mustachio
5
+ = haml :ga
6
+ %body
7
+ %a{:href => "http://github.com/afeld/mustachio"}
8
+ %img{:style => "position: absolute; top: 0; right: 0; border: 0;", :src => "https://d3nwyuy0nl342s.cloudfront.net/img/7afbc8b248c68eb468279e8c17986ad46549fb71/687474703a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67", :alt => "Fork me on GitHub"}
9
+ %img{:src => "/?src=http://www.librarising.com/astrology/celebs/images2/QR/queenelizabethii.jpg"}
10
+ %h1 #{@site}/?src=<em>YOUR_IMAGE_URL</em>
metadata ADDED
@@ -0,0 +1,301 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mustachio
3
+ version: !ruby/object:Gem::Version
4
+ hash: 25
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 1
10
+ version: 0.1.1
11
+ platform: ruby
12
+ authors:
13
+ - Aidan Feldman
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-05-16 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
22
+ none: false
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ hash: 25
27
+ segments:
28
+ - 1
29
+ - 2
30
+ - 3
31
+ version: 1.2.3
32
+ type: :runtime
33
+ requirement: *id001
34
+ prerelease: false
35
+ name: sinatra
36
+ - !ruby/object:Gem::Dependency
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ hash: 59
43
+ segments:
44
+ - 0
45
+ - 9
46
+ - 0
47
+ version: 0.9.0
48
+ type: :runtime
49
+ requirement: *id002
50
+ prerelease: false
51
+ name: dragonfly
52
+ - !ruby/object:Gem::Dependency
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ~>
57
+ - !ruby/object:Gem::Version
58
+ hash: 13
59
+ segments:
60
+ - 1
61
+ - 1
62
+ version: "1.1"
63
+ type: :runtime
64
+ requirement: *id003
65
+ prerelease: false
66
+ name: magickly
67
+ - !ruby/object:Gem::Dependency
68
+ version_requirements: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ hash: 15
74
+ segments:
75
+ - 2
76
+ - 2
77
+ - 4
78
+ version: 2.2.4
79
+ type: :runtime
80
+ requirement: *id004
81
+ prerelease: false
82
+ name: addressable
83
+ - !ruby/object:Gem::Dependency
84
+ version_requirements: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ hash: 3
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ type: :runtime
94
+ requirement: *id005
95
+ prerelease: false
96
+ name: haml
97
+ - !ruby/object:Gem::Dependency
98
+ version_requirements: &id006 !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - "="
102
+ - !ruby/object:Gem::Version
103
+ hash: 23
104
+ segments:
105
+ - 0
106
+ - 0
107
+ - 4
108
+ version: 0.0.4
109
+ type: :runtime
110
+ requirement: *id006
111
+ prerelease: false
112
+ name: face
113
+ - !ruby/object:Gem::Dependency
114
+ version_requirements: &id007 !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ~>
118
+ - !ruby/object:Gem::Version
119
+ hash: 9
120
+ segments:
121
+ - 0
122
+ - 1
123
+ version: "0.1"
124
+ type: :runtime
125
+ requirement: *id007
126
+ prerelease: false
127
+ name: imagesize
128
+ - !ruby/object:Gem::Dependency
129
+ version_requirements: &id008 !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ~>
133
+ - !ruby/object:Gem::Version
134
+ hash: 3
135
+ segments:
136
+ - 1
137
+ - 6
138
+ version: "1.6"
139
+ type: :development
140
+ requirement: *id008
141
+ prerelease: false
142
+ name: jeweler
143
+ - !ruby/object:Gem::Dependency
144
+ version_requirements: &id009 !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ hash: 3
150
+ segments:
151
+ - 0
152
+ version: "0"
153
+ type: :development
154
+ requirement: *id009
155
+ prerelease: false
156
+ name: rack-test
157
+ - !ruby/object:Gem::Dependency
158
+ version_requirements: &id010 !ruby/object:Gem::Requirement
159
+ none: false
160
+ requirements:
161
+ - - ~>
162
+ - !ruby/object:Gem::Version
163
+ hash: 9
164
+ segments:
165
+ - 2
166
+ - 5
167
+ version: "2.5"
168
+ type: :development
169
+ requirement: *id010
170
+ prerelease: false
171
+ name: rspec
172
+ - !ruby/object:Gem::Dependency
173
+ version_requirements: &id011 !ruby/object:Gem::Requirement
174
+ none: false
175
+ requirements:
176
+ - - ~>
177
+ - !ruby/object:Gem::Version
178
+ hash: 3
179
+ segments:
180
+ - 1
181
+ - 6
182
+ version: "1.6"
183
+ type: :development
184
+ requirement: *id011
185
+ prerelease: false
186
+ name: webmock
187
+ - !ruby/object:Gem::Dependency
188
+ version_requirements: &id012 !ruby/object:Gem::Requirement
189
+ none: false
190
+ requirements:
191
+ - - ~>
192
+ - !ruby/object:Gem::Version
193
+ hash: 29
194
+ segments:
195
+ - 1
196
+ - 9
197
+ version: "1.9"
198
+ type: :development
199
+ requirement: *id012
200
+ prerelease: false
201
+ name: vcr
202
+ - !ruby/object:Gem::Dependency
203
+ version_requirements: &id013 !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ hash: 3
209
+ segments:
210
+ - 0
211
+ version: "0"
212
+ type: :development
213
+ requirement: *id013
214
+ prerelease: false
215
+ name: ruby-debug19
216
+ - !ruby/object:Gem::Dependency
217
+ version_requirements: &id014 !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ hash: 3
223
+ segments:
224
+ - 0
225
+ version: "0"
226
+ type: :development
227
+ requirement: *id014
228
+ prerelease: false
229
+ name: ruby-debug
230
+ description: Adds a 'mustachify' shortcut to magickly.
231
+ email: aidan.feldman@gmail.com
232
+ executables: []
233
+
234
+ extensions: []
235
+
236
+ extra_rdoc_files:
237
+ - LICENSE.txt
238
+ - README.md
239
+ files:
240
+ - .document
241
+ - .rspec
242
+ - Gemfile
243
+ - Gemfile.lock
244
+ - LICENSE.txt
245
+ - README.md
246
+ - Rakefile
247
+ - VERSION
248
+ - bookmarklet.js
249
+ - config.ru
250
+ - lib/mustachio.rb
251
+ - mustachio.gemspec
252
+ - public/favicon.ico
253
+ - public/images/dubya.jpeg
254
+ - public/images/guy_hecker.jpeg
255
+ - public/images/mustache_03.png
256
+ - spec/fixtures/vcr_cassettes/big_obama.yml
257
+ - spec/fixtures/vcr_cassettes/dubya.yml
258
+ - spec/fixtures/vcr_cassettes/small_obama.yml
259
+ - spec/spec_helper.rb
260
+ - spec/support/big_obama.jpeg
261
+ - spec/support/dubya.jpeg
262
+ - spec/support/small_obama.jpeg
263
+ - spec/unit/analyser_spec.rb
264
+ - views/face_api_dev_challenge.haml
265
+ - views/ga.haml
266
+ - views/index.haml
267
+ homepage: http://github.com/afeld/mustachio
268
+ licenses:
269
+ - MIT
270
+ post_install_message:
271
+ rdoc_options: []
272
+
273
+ require_paths:
274
+ - lib
275
+ required_ruby_version: !ruby/object:Gem::Requirement
276
+ none: false
277
+ requirements:
278
+ - - ">="
279
+ - !ruby/object:Gem::Version
280
+ hash: 3
281
+ segments:
282
+ - 0
283
+ version: "0"
284
+ required_rubygems_version: !ruby/object:Gem::Requirement
285
+ none: false
286
+ requirements:
287
+ - - ">="
288
+ - !ruby/object:Gem::Version
289
+ hash: 3
290
+ segments:
291
+ - 0
292
+ version: "0"
293
+ requirements: []
294
+
295
+ rubyforge_project:
296
+ rubygems_version: 1.8.2
297
+ signing_key:
298
+ specification_version: 3
299
+ summary: automatic mustachifying of any image
300
+ test_files: []
301
+