appetizer-ui 0.9.0 → 0.9.1
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/appetizer-ui.gemspec +15 -13
- data/lib/appetizer/ui/assets.rb +21 -8
- data/lib/appetizer/ui/jasmine/js/jquery-jasmine.js +288 -0
- data/lib/appetizer/ui/jasmine/js/spec-runner.coffee +0 -1
- data/lib/appetizer/ui/jasmine/views/specs.erb +12 -4
- data/lib/appetizer/ui/rake.rb +29 -10
- data/lib/appetizer/ui/spec.rb +1 -2
- metadata +122 -61
- data/lib/appetizer/ui/app/js/appetizer.coffee +0 -15
- data/lib/appetizer/ui/app/js/appetizer/core.coffee +0 -20
- data/lib/appetizer/ui/app/js/appetizer/model.coffee +0 -1
- data/lib/appetizer/ui/app/js/appetizer/router.coffee +0 -70
- data/lib/appetizer/ui/app/js/appetizer/view.coffee +0 -139
- data/lib/appetizer/ui/app/js/appetizer/xdr.coffee +0 -57
- data/lib/appetizer/ui/app/views/client/appetizer/missing.jst.eco +0 -3
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/appetizerExtensions.spec.js +0 -54
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/checkboxConventionBindings.spec.js +0 -110
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/configurableBindingAttributes.spec.js +0 -117
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/configureAllBindingAttributes.spec.js +0 -139
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/customConvention.spec.js +0 -53
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/dataBindConvention.spec.js +0 -151
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/dataBindMultiple.spec.js +0 -36
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/dataBindSubstitutions.spec.js +0 -137
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/globalConfiguraAllBindingAttributes.spec.js +0 -124
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/globalConfigurableBindingAttributes.spec.js +0 -36
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/helpers/SpecHelper.js +0 -4
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/helpers/sample.backbone.app.js +0 -159
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/html5inputConventionBinding.spec.js +0 -142
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/modelUnbinding.spec.js +0 -73
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/noConflict.spec.js +0 -36
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/radioButtonConventionBinding.spec.js +0 -41
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/selectboxConventionBindings.spec.js +0 -60
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/textareaConventionBinding.spec.js +0 -29
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/textboxConventionBinding.spec.js +0 -66
- data/lib/appetizer/ui/vendor/js/backbone.js +0 -1290
- data/lib/appetizer/ui/vendor/js/backbone.modelbinding.js +0 -624
- data/lib/appetizer/ui/vendor/js/jquery.js +0 -9266
- data/lib/appetizer/ui/vendor/js/json2.js +0 -480
- data/lib/appetizer/ui/vendor/js/underscore.js +0 -999
- data/lib/appetizer/ui/vendor/js/underscore.string.js +0 -480
data/appetizer-ui.gemspec
CHANGED
@@ -10,20 +10,22 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.test_files = `git ls-files -- test/*`.split("\n")
|
11
11
|
gem.name = "appetizer-ui"
|
12
12
|
gem.require_paths = ["lib"]
|
13
|
-
gem.version = "0.9.
|
13
|
+
gem.version = "0.9.1"
|
14
14
|
|
15
15
|
gem.required_ruby_version = ">= 1.9.2"
|
16
16
|
|
17
|
-
gem.add_dependency "appetizer",
|
18
|
-
gem.add_dependency "coffee-script",
|
19
|
-
gem.add_dependency "eco",
|
20
|
-
gem.add_dependency "rack-contrib",
|
21
|
-
gem.add_dependency "rack-ssl",
|
22
|
-
gem.add_dependency "sass",
|
23
|
-
gem.add_dependency "sinatra",
|
24
|
-
gem.add_dependency "sprockets",
|
25
|
-
gem.add_dependency "sprockets-sass",
|
26
|
-
gem.add_dependency "
|
27
|
-
gem.add_dependency "
|
28
|
-
gem.add_dependency "
|
17
|
+
gem.add_dependency "appetizer", "~> 0.0"
|
18
|
+
gem.add_dependency "coffee-script", "~> 2.2"
|
19
|
+
gem.add_dependency "eco", "~> 1.0"
|
20
|
+
gem.add_dependency "rack-contrib", "~> 1.1"
|
21
|
+
gem.add_dependency "rack-ssl", "~> 1.3"
|
22
|
+
gem.add_dependency "sass", "~> 3.1"
|
23
|
+
gem.add_dependency "sinatra", "~> 1.3"
|
24
|
+
gem.add_dependency "sprockets", "~> 2.11"
|
25
|
+
gem.add_dependency "sprockets-sass", "~> 1.0"
|
26
|
+
gem.add_dependency "sprockets-helpers", "~> 1.1"
|
27
|
+
gem.add_dependency "uglifier", "~> 1.0"
|
28
|
+
gem.add_dependency "vendorer", "~> 0.1"
|
29
|
+
gem.add_dependency "yajl-ruby", "~> 1.0"
|
30
|
+
gem.add_dependency "yui-compressor", "~> 0.9"
|
29
31
|
end
|
data/lib/appetizer/ui/assets.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
require "coffee-script"
|
2
2
|
require "eco"
|
3
3
|
require "fileutils"
|
4
|
-
require "sass"
|
5
4
|
require "sinatra/base"
|
6
|
-
require "sprockets"
|
7
|
-
require "sprockets/sass"
|
5
|
+
require "sprockets-helpers"
|
8
6
|
require "uglifier"
|
9
7
|
require "yui/compressor"
|
10
8
|
|
@@ -12,8 +10,10 @@ module App
|
|
12
10
|
def self.assets
|
13
11
|
@sprockets ||= Sprockets::Environment.new.tap do |s|
|
14
12
|
if Appetizer::UI::Assets.compiled?
|
15
|
-
|
16
|
-
|
13
|
+
if Appetizer::UI::Assets.uglify?
|
14
|
+
s.register_bundle_processor "application/javascript", :uglifier do |ctx, data|
|
15
|
+
Uglifier.compile data, mangle: false, squeeze: false, seqs: false
|
16
|
+
end
|
17
17
|
end
|
18
18
|
|
19
19
|
s.register_bundle_processor "text/css", :yui do |ctx, data|
|
@@ -21,6 +21,12 @@ module App
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
Sprockets::Helpers.configure do |config|
|
25
|
+
config.environment = s
|
26
|
+
config.prefix = "/assets"
|
27
|
+
config.digest = true
|
28
|
+
end
|
29
|
+
|
24
30
|
# NOTE: Seems like Sprockets' built-in FileStore is kinda busted
|
25
31
|
# in the way it creates directories or processes key names (or I
|
26
32
|
# don't understand it yet), so we're manually creating the
|
@@ -31,11 +37,9 @@ module App
|
|
31
37
|
s.cache = Sprockets::Cache::FileStore.new "tmp/sprockets"
|
32
38
|
end
|
33
39
|
|
34
|
-
%w(css img js views).each do |d|
|
40
|
+
%w(css img js views fonts).each do |d|
|
35
41
|
s.append_path "./app/#{d}"
|
36
42
|
s.append_path "./vendor/#{d}"
|
37
|
-
s.append_path File.expand_path("../app/#{d}", __FILE__)
|
38
|
-
s.append_path File.expand_path("../vendor/#{d}", __FILE__)
|
39
43
|
end
|
40
44
|
end
|
41
45
|
end
|
@@ -48,6 +52,10 @@ module Appetizer
|
|
48
52
|
App.production? or ENV["APPETIZER_USE_COMPILED_ASSETS"]
|
49
53
|
end
|
50
54
|
|
55
|
+
def self.uglify?
|
56
|
+
compiled? and not ENV["APPETIZER_NO_UGLIFY"]
|
57
|
+
end
|
58
|
+
|
51
59
|
def self.manifest
|
52
60
|
return @manifest if defined? @manifest
|
53
61
|
|
@@ -63,6 +71,11 @@ module Appetizer
|
|
63
71
|
|
64
72
|
def self.registered app
|
65
73
|
app.helpers do
|
74
|
+
def asset_apps
|
75
|
+
apps = Dir.glob(Dir.pwd + "/app/js/*")
|
76
|
+
apps.collect { |path| File.basename(path) if File.directory?(path) }.compact
|
77
|
+
end
|
78
|
+
|
66
79
|
def asset name
|
67
80
|
if Appetizer::UI::Assets.compiled?
|
68
81
|
return cdnify "/assets/#{Appetizer::UI::Assets.manifest[name]}"
|
@@ -0,0 +1,288 @@
|
|
1
|
+
var readFixtures = function() {
|
2
|
+
return jasmine.getFixtures().proxyCallTo_('read', arguments);
|
3
|
+
};
|
4
|
+
|
5
|
+
var preloadFixtures = function() {
|
6
|
+
jasmine.getFixtures().proxyCallTo_('preload', arguments);
|
7
|
+
};
|
8
|
+
|
9
|
+
var loadFixtures = function() {
|
10
|
+
jasmine.getFixtures().proxyCallTo_('load', arguments);
|
11
|
+
};
|
12
|
+
|
13
|
+
var setFixtures = function(html) {
|
14
|
+
jasmine.getFixtures().set(html);
|
15
|
+
};
|
16
|
+
|
17
|
+
var sandbox = function(attributes) {
|
18
|
+
return jasmine.getFixtures().sandbox(attributes);
|
19
|
+
};
|
20
|
+
|
21
|
+
var spyOnEvent = function(selector, eventName) {
|
22
|
+
jasmine.JQuery.events.spyOn(selector, eventName);
|
23
|
+
}
|
24
|
+
|
25
|
+
jasmine.getFixtures = function() {
|
26
|
+
return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures();
|
27
|
+
};
|
28
|
+
|
29
|
+
jasmine.Fixtures = function() {
|
30
|
+
this.containerId = 'jasmine-fixtures';
|
31
|
+
this.fixturesCache_ = {};
|
32
|
+
this.fixturesPath = 'spec/javascripts/fixtures';
|
33
|
+
};
|
34
|
+
|
35
|
+
jasmine.Fixtures.prototype.set = function(html) {
|
36
|
+
this.cleanUp();
|
37
|
+
this.createContainer_(html);
|
38
|
+
};
|
39
|
+
|
40
|
+
jasmine.Fixtures.prototype.preload = function() {
|
41
|
+
this.read.apply(this, arguments);
|
42
|
+
};
|
43
|
+
|
44
|
+
jasmine.Fixtures.prototype.load = function() {
|
45
|
+
this.cleanUp();
|
46
|
+
this.createContainer_(this.read.apply(this, arguments));
|
47
|
+
};
|
48
|
+
|
49
|
+
jasmine.Fixtures.prototype.read = function() {
|
50
|
+
var htmlChunks = [];
|
51
|
+
|
52
|
+
var fixtureUrls = arguments;
|
53
|
+
for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
|
54
|
+
htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]));
|
55
|
+
}
|
56
|
+
|
57
|
+
return htmlChunks.join('');
|
58
|
+
};
|
59
|
+
|
60
|
+
jasmine.Fixtures.prototype.clearCache = function() {
|
61
|
+
this.fixturesCache_ = {};
|
62
|
+
};
|
63
|
+
|
64
|
+
jasmine.Fixtures.prototype.cleanUp = function() {
|
65
|
+
jQuery('#' + this.containerId).remove();
|
66
|
+
};
|
67
|
+
|
68
|
+
jasmine.Fixtures.prototype.sandbox = function(attributes) {
|
69
|
+
var attributesToSet = attributes || {};
|
70
|
+
return jQuery('<div id="sandbox" />').attr(attributesToSet);
|
71
|
+
};
|
72
|
+
|
73
|
+
jasmine.Fixtures.prototype.createContainer_ = function(html) {
|
74
|
+
var container;
|
75
|
+
if(html instanceof jQuery) {
|
76
|
+
container = jQuery('<div id="' + this.containerId + '" />');
|
77
|
+
container.html(html);
|
78
|
+
} else {
|
79
|
+
container = '<div id="' + this.containerId + '">' + html + '</div>'
|
80
|
+
}
|
81
|
+
jQuery('body').append(container);
|
82
|
+
};
|
83
|
+
|
84
|
+
jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) {
|
85
|
+
if (typeof this.fixturesCache_[url] == 'undefined') {
|
86
|
+
this.loadFixtureIntoCache_(url);
|
87
|
+
}
|
88
|
+
return this.fixturesCache_[url];
|
89
|
+
};
|
90
|
+
|
91
|
+
jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
|
92
|
+
var self = this;
|
93
|
+
var url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl;
|
94
|
+
jQuery.ajax({
|
95
|
+
async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
|
96
|
+
cache: false,
|
97
|
+
dataType: 'html',
|
98
|
+
url: url,
|
99
|
+
success: function(data) {
|
100
|
+
self.fixturesCache_[relativeUrl] = data;
|
101
|
+
},
|
102
|
+
error: function(jqXHR, status, errorThrown) {
|
103
|
+
throw Error('Fixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')');
|
104
|
+
}
|
105
|
+
});
|
106
|
+
};
|
107
|
+
|
108
|
+
jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
|
109
|
+
return this[methodName].apply(this, passedArguments);
|
110
|
+
};
|
111
|
+
|
112
|
+
|
113
|
+
jasmine.JQuery = function() {};
|
114
|
+
|
115
|
+
jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
|
116
|
+
return jQuery('<div/>').append(html).html();
|
117
|
+
};
|
118
|
+
|
119
|
+
jasmine.JQuery.elementToString = function(element) {
|
120
|
+
return jQuery('<div />').append(element.clone()).html();
|
121
|
+
};
|
122
|
+
|
123
|
+
jasmine.JQuery.matchersClass = {};
|
124
|
+
|
125
|
+
(function(namespace) {
|
126
|
+
var data = {
|
127
|
+
spiedEvents: {},
|
128
|
+
handlers: []
|
129
|
+
};
|
130
|
+
|
131
|
+
namespace.events = {
|
132
|
+
spyOn: function(selector, eventName) {
|
133
|
+
var handler = function(e) {
|
134
|
+
data.spiedEvents[[selector, eventName]] = e;
|
135
|
+
};
|
136
|
+
jQuery(selector).bind(eventName, handler);
|
137
|
+
data.handlers.push(handler);
|
138
|
+
},
|
139
|
+
|
140
|
+
wasTriggered: function(selector, eventName) {
|
141
|
+
return !!(data.spiedEvents[[selector, eventName]]);
|
142
|
+
},
|
143
|
+
|
144
|
+
cleanUp: function() {
|
145
|
+
data.spiedEvents = {};
|
146
|
+
data.handlers = [];
|
147
|
+
}
|
148
|
+
}
|
149
|
+
})(jasmine.JQuery);
|
150
|
+
|
151
|
+
(function(){
|
152
|
+
var jQueryMatchers = {
|
153
|
+
toHaveClass: function(className) {
|
154
|
+
return this.actual.hasClass(className);
|
155
|
+
},
|
156
|
+
|
157
|
+
toBeVisible: function() {
|
158
|
+
return this.actual.is(':visible');
|
159
|
+
},
|
160
|
+
|
161
|
+
toBeHidden: function() {
|
162
|
+
return this.actual.is(':hidden');
|
163
|
+
},
|
164
|
+
|
165
|
+
toBeSelected: function() {
|
166
|
+
return this.actual.is(':selected');
|
167
|
+
},
|
168
|
+
|
169
|
+
toBeChecked: function() {
|
170
|
+
return this.actual.is(':checked');
|
171
|
+
},
|
172
|
+
|
173
|
+
toBeEmpty: function() {
|
174
|
+
return this.actual.is(':empty');
|
175
|
+
},
|
176
|
+
|
177
|
+
toExist: function() {
|
178
|
+
return this.actual.size() > 0;
|
179
|
+
},
|
180
|
+
|
181
|
+
toHaveAttr: function(attributeName, expectedAttributeValue) {
|
182
|
+
return hasProperty(this.actual.attr(attributeName), expectedAttributeValue);
|
183
|
+
},
|
184
|
+
|
185
|
+
toHaveId: function(id) {
|
186
|
+
return this.actual.attr('id') == id;
|
187
|
+
},
|
188
|
+
|
189
|
+
toHaveHtml: function(html) {
|
190
|
+
return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html);
|
191
|
+
},
|
192
|
+
|
193
|
+
toHaveText: function(text) {
|
194
|
+
if (text && jQuery.isFunction(text.test)) {
|
195
|
+
return text.test(this.actual.text());
|
196
|
+
} else {
|
197
|
+
return this.actual.text() == text;
|
198
|
+
}
|
199
|
+
},
|
200
|
+
|
201
|
+
toHaveValue: function(value) {
|
202
|
+
return this.actual.val() == value;
|
203
|
+
},
|
204
|
+
|
205
|
+
toHaveData: function(key, expectedValue) {
|
206
|
+
return hasProperty(this.actual.data(key), expectedValue);
|
207
|
+
},
|
208
|
+
|
209
|
+
toBe: function(selector) {
|
210
|
+
return this.actual.is(selector);
|
211
|
+
},
|
212
|
+
|
213
|
+
toContain: function(selector) {
|
214
|
+
return this.actual.find(selector).size() > 0;
|
215
|
+
},
|
216
|
+
|
217
|
+
toBeDisabled: function(selector){
|
218
|
+
return this.actual.is(':disabled');
|
219
|
+
},
|
220
|
+
|
221
|
+
// tests the existence of a specific event binding
|
222
|
+
toHandle: function(eventName) {
|
223
|
+
var events = this.actual.data("events");
|
224
|
+
return events && events[eventName].length > 0;
|
225
|
+
},
|
226
|
+
|
227
|
+
// tests the existence of a specific event binding + handler
|
228
|
+
toHandleWith: function(eventName, eventHandler) {
|
229
|
+
var stack = this.actual.data("events")[eventName];
|
230
|
+
var i;
|
231
|
+
for (i = 0; i < stack.length; i++) {
|
232
|
+
if (stack[i].handler == eventHandler) {
|
233
|
+
return true;
|
234
|
+
}
|
235
|
+
}
|
236
|
+
return false;
|
237
|
+
}
|
238
|
+
};
|
239
|
+
|
240
|
+
var hasProperty = function(actualValue, expectedValue) {
|
241
|
+
if (expectedValue === undefined) {
|
242
|
+
return actualValue !== undefined;
|
243
|
+
}
|
244
|
+
return actualValue == expectedValue;
|
245
|
+
};
|
246
|
+
|
247
|
+
var bindMatcher = function(methodName) {
|
248
|
+
var builtInMatcher = jasmine.Matchers.prototype[methodName];
|
249
|
+
|
250
|
+
jasmine.JQuery.matchersClass[methodName] = function() {
|
251
|
+
if (this.actual instanceof jQuery) {
|
252
|
+
var result = jQueryMatchers[methodName].apply(this, arguments);
|
253
|
+
this.actual = jasmine.JQuery.elementToString(this.actual);
|
254
|
+
return result;
|
255
|
+
}
|
256
|
+
|
257
|
+
if (builtInMatcher) {
|
258
|
+
return builtInMatcher.apply(this, arguments);
|
259
|
+
}
|
260
|
+
|
261
|
+
return false;
|
262
|
+
};
|
263
|
+
};
|
264
|
+
|
265
|
+
for(var methodName in jQueryMatchers) {
|
266
|
+
bindMatcher(methodName);
|
267
|
+
}
|
268
|
+
})();
|
269
|
+
|
270
|
+
beforeEach(function() {
|
271
|
+
this.addMatchers(jasmine.JQuery.matchersClass);
|
272
|
+
this.addMatchers({
|
273
|
+
toHaveBeenTriggeredOn: function(selector) {
|
274
|
+
this.message = function() {
|
275
|
+
return [
|
276
|
+
"Expected event " + this.actual + " to have been triggered on" + selector,
|
277
|
+
"Expected event " + this.actual + " not to have been triggered on" + selector
|
278
|
+
];
|
279
|
+
};
|
280
|
+
return jasmine.JQuery.events.wasTriggered(selector, this.actual);
|
281
|
+
}
|
282
|
+
})
|
283
|
+
});
|
284
|
+
|
285
|
+
afterEach(function() {
|
286
|
+
jasmine.getFixtures().cleanUp();
|
287
|
+
jasmine.JQuery.events.cleanUp();
|
288
|
+
});
|
@@ -4,14 +4,22 @@
|
|
4
4
|
<head>
|
5
5
|
<title>Specs</title>
|
6
6
|
|
7
|
-
<script>
|
7
|
+
<script>
|
8
|
+
App = {}
|
9
|
+
</script>
|
8
10
|
|
9
11
|
<% assets("jasmine.css").each do |css| %>
|
10
|
-
|
12
|
+
<link href="<%= css %>" rel="stylesheet" type="text/css">
|
11
13
|
<% end %>
|
12
14
|
|
13
|
-
<% assets("
|
14
|
-
|
15
|
+
<% assets("spec-runner.js", "jasmine-jquery.js", "jasmine-mocks.js").each do |js| %>
|
16
|
+
<script src="<%= js %>"></script>
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<% asset_apps.each do |app| %>
|
20
|
+
<% assets("#{app}/app.js", "#{app}/spec-helper.js", "#{app}/fixtures.js").each do |js| %>
|
21
|
+
<script src="<%= js %>"></script>
|
22
|
+
<% end %>
|
15
23
|
<% end %>
|
16
24
|
</head>
|
17
25
|
|
data/lib/appetizer/ui/rake.rb
CHANGED
@@ -1,29 +1,38 @@
|
|
1
1
|
require "appetizer/rake"
|
2
|
+
require "appetizer/ui/assets"
|
3
|
+
require "vendorer"
|
2
4
|
|
3
5
|
# For Heroku.
|
4
6
|
|
7
|
+
desc "Download vendored assets"
|
8
|
+
task :vendorer => :init do
|
9
|
+
Vendorer.new(update: true).parse File.read('Vendorfile')
|
10
|
+
end
|
11
|
+
|
5
12
|
task "assets:precompile" => :compile
|
6
13
|
|
7
14
|
desc "Compile the app's CSS and JS files."
|
8
15
|
task :compile => :init do
|
9
16
|
ENV["APPETIZER_MINIFY_ASSETS"] = "true"
|
10
17
|
|
11
|
-
require "appetizer/ui/assets"
|
12
18
|
require "fileutils"
|
13
19
|
require "yaml"
|
14
20
|
|
15
|
-
|
21
|
+
entry_points = ENV["APPETIZER_ASSETS_ENTRY_POINTS"] || "app.scss, app.coffee"
|
16
22
|
|
17
|
-
App.assets.each_file
|
18
|
-
|
19
|
-
|
23
|
+
assets = App.assets.each_file
|
24
|
+
|
25
|
+
manifest = {}
|
20
26
|
|
21
|
-
|
22
|
-
|
23
|
-
|
27
|
+
assets.each do |path|
|
28
|
+
if entry_points.include? File.basename(path)
|
29
|
+
if asset = App.assets[path]
|
30
|
+
manifest[asset.logical_path] = asset.digest_path
|
31
|
+
file = "public/assets/#{asset.digest_path}"
|
24
32
|
|
25
|
-
|
26
|
-
|
33
|
+
FileUtils.mkdir_p File.dirname file
|
34
|
+
asset.write_to file
|
35
|
+
end
|
27
36
|
end
|
28
37
|
end
|
29
38
|
|
@@ -31,3 +40,13 @@ task :compile => :init do
|
|
31
40
|
YAML.dump manifest, f
|
32
41
|
end
|
33
42
|
end
|
43
|
+
|
44
|
+
if Gem::Specification.find { |spec| spec.name == "jasmine-headless-webkit" }
|
45
|
+
require "jasmine-headless-webkit"
|
46
|
+
|
47
|
+
Jasmine::Headless::Task.new("test") do |t|
|
48
|
+
t.colors = true
|
49
|
+
t.keep_on_error = true
|
50
|
+
t.jasmine_config = ENV["JASMINE_HEADLESS_CONFIG"] || "config/jasmine.yml"
|
51
|
+
end
|
52
|
+
end
|