fanforce-app-factory 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +21 -0
- data/Gemfile +2 -0
- data/README.md +182 -0
- data/Rakefile +16 -0
- data/fanforce-app-factory.gemspec +40 -0
- data/lib/fanforce/app_factory.rake +71 -0
- data/lib/fanforce/app_factory.rb +56 -0
- data/lib/fanforce/app_factory/_init_sinatra.rb +54 -0
- data/lib/fanforce/app_factory/assets/css/dashboard.scss +24 -0
- data/lib/fanforce/app_factory/assets/css/promotional.scss +1 -0
- data/lib/fanforce/app_factory/assets/img/icon-16.png +0 -0
- data/lib/fanforce/app_factory/assets/img/icon-32.png +0 -0
- data/lib/fanforce/app_factory/assets/img/icon-42.png +0 -0
- data/lib/fanforce/app_factory/assets/img/marketplace.png +0 -0
- data/lib/fanforce/app_factory/assets/img/marketplace.psd +0 -0
- data/lib/fanforce/app_factory/assets/js/dashboard.coffee +18 -0
- data/lib/fanforce/app_factory/assets/js/promotional.js +1 -0
- data/lib/fanforce/app_factory/assets/lib/common/_mixins.scss +97 -0
- data/lib/fanforce/app_factory/assets/lib/common/_tags.scss +83 -0
- data/lib/fanforce/app_factory/assets/lib/common/_variables.scss +27 -0
- data/lib/fanforce/app_factory/assets/lib/common/icons/dropdown-arrow.png +0 -0
- data/lib/fanforce/app_factory/assets/lib/common/icons/initiative.png +0 -0
- data/lib/fanforce/app_factory/assets/lib/common/layouts/_dashboard.scss +18 -0
- data/lib/fanforce/app_factory/assets/lib/common/layouts/_promotional.scss +27 -0
- data/lib/fanforce/app_factory/assets/lib/common/layouts/dashboard.js +6 -0
- data/lib/fanforce/app_factory/assets/lib/common/layouts/promotional.js +1 -0
- data/lib/fanforce/app_factory/assets/lib/promotional/fanforce_bg.png +0 -0
- data/lib/fanforce/app_factory/assets/lib/promotional/icon-42.png +0 -0
- data/lib/fanforce/app_factory/assets/lib/promotional/icon-plus.png +0 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/css/bootstrap.css +6103 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/css/bootstrap.min.css +868 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/img/glyphicons-halflings-white.png +0 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/img/glyphicons-halflings.png +0 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/js/bootstrap.js +2170 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/js/bootstrap.min.js +7 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/chosen/chosen-sprite.png +0 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/chosen/chosen.jquery.min.js +10 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/chosen/chosen.scss +399 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/css/font-awesome.css +540 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/css/font-awesome.min.css +33 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/font/FontAwesome.otf +0 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/font/fontawesome-webfont.eot +0 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/font/fontawesome-webfont.svg +284 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/font/fontawesome-webfont.ttf +0 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/font/fontawesome-webfont.woff +0 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/jquery/jquery.inputHint.js +154 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/jquery/jquery.tmpl.debug.js +484 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/knockout/knockout.custom-handlers.coffee +131 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/knockout/knockout.debug.js +3223 -0
- data/lib/fanforce/app_factory/assets/lib/vendors/underscore/underscore.debug.js +999 -0
- data/lib/fanforce/app_factory/config/_error_handling.rb +26 -0
- data/lib/fanforce/app_factory/config/helpers/assets.rb +23 -0
- data/lib/fanforce/app_factory/config/helpers/fanforce.rb +21 -0
- data/lib/fanforce/app_factory/config/helpers/json.rb +10 -0
- data/lib/fanforce/app_factory/config/sinatra_config.rb +51 -0
- data/lib/fanforce/app_factory/initializers/ff_globals.rb +72 -0
- data/lib/fanforce/app_factory/layouts/dashboard.haml +14 -0
- data/lib/fanforce/app_factory/layouts/promotional.haml +14 -0
- data/lib/fanforce/app_factory/public/favicon.ico +0 -0
- data/lib/fanforce/app_factory/routes.rb +41 -0
- data/lib/fanforce/app_factory/sprockets/compiler.rb +105 -0
- data/lib/fanforce/app_factory/sprockets/hacks.rb +43 -0
- data/lib/fanforce/app_factory/version.rb +5 -0
- data/lib/fanforce/app_factory/views/dashboard.haml +38 -0
- data/lib/fanforce/app_factory/views/index.haml +38 -0
- data/lib/fanforce/app_factory_workers.rb +1 -0
- data/lib/fanforce_app_factory.rb +2 -0
- metadata +376 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
class FanforceApp::Sinatra
|
2
|
+
require 'fanforce/errors'
|
3
|
+
include Fanforce::Errors
|
4
|
+
|
5
|
+
set :raise_errors, false
|
6
|
+
set :show_exceptions, false
|
7
|
+
|
8
|
+
error 400..600 do
|
9
|
+
e = env['sinatra.error'] or (next response if e.nil?)
|
10
|
+
|
11
|
+
if Object.const_defined?('Fanforce') and Fanforce.const_defined?('Api') and e.is_a?(Fanforce::Api::Error)
|
12
|
+
errors = e.errors
|
13
|
+
else
|
14
|
+
errors = e.respond_to?(:public_errors) ? e.public_errors : []
|
15
|
+
errors << {message: 'There has been an internal server error. Our developers have been notified.'} if errors.size == 0
|
16
|
+
end
|
17
|
+
|
18
|
+
admin_details = Fanforce::Errors.format_admin_details(e, errors)
|
19
|
+
|
20
|
+
body = {errors: e.message}
|
21
|
+
body.merge!(admin_details.merge(backtrace: e.backtrace)).delete(:public_response) if params[:show_error_details] == '1' or FanforceApp.config.show_error_details
|
22
|
+
|
23
|
+
status(e.respond_to?(:code ) ? e.code : 500) and json(body)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Sinatra::AssetHelpers
|
2
|
+
|
3
|
+
def stylesheet(s)
|
4
|
+
s += '.css' unless s.include?('.css')
|
5
|
+
s = asset_path(s) unless s =~ /^https?:\// or s =~ /^\/\/\/.+/
|
6
|
+
"<link rel='stylesheet' href='#{s}' />"
|
7
|
+
end
|
8
|
+
|
9
|
+
def javascript(s)
|
10
|
+
s += '.js' unless s.include?('.js')
|
11
|
+
s = asset_path(s) unless s =~ /^https?:\// or s =~ /^\/\/\/.+/
|
12
|
+
"<script type='text/javascript' src='#{s}'></script>"
|
13
|
+
end
|
14
|
+
|
15
|
+
def asset_path(source, options={})
|
16
|
+
source = ('/assets/' + source).gsub('//', '/').gsub('/assets/assets/', '/assets/')
|
17
|
+
end
|
18
|
+
|
19
|
+
def image_path(source)
|
20
|
+
asset_path(source)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Sinatra::FanforceHelpers
|
2
|
+
require 'fanforce'
|
3
|
+
|
4
|
+
def fanforce_id
|
5
|
+
@fanforce_id = params[:fanforce_id] || ff.params[:fanforce_id]
|
6
|
+
end
|
7
|
+
|
8
|
+
def ff
|
9
|
+
return @ff if @ff.present?
|
10
|
+
@ff = Fanforce.new(params)
|
11
|
+
#return @ff if !@ff.valid_fanforce_request? and !@ff.valid_fanforce_js_request?
|
12
|
+
|
13
|
+
@ff.auth Sinatra::FanforceHelpers.find_api_key(ff.params[:fanforce_id])
|
14
|
+
@ff
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.find_api_key(fanforce_id, addon_type=:app, addon_id=FanforceApp._id)
|
18
|
+
$Redis.get("installed:#{addon_type}-#{addon_id}:#{fanforce_id}")
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
|
3
|
+
module Sinatra::JSONHelpers
|
4
|
+
def json(*args)
|
5
|
+
args[0] = {} if args.size == 0
|
6
|
+
content_type (Rack.const_defined?('JSONR') and Rack::JSONR.is_jsonp_request?(request)) ? 'application/javascript' : :json
|
7
|
+
MultiJson.dump args[0], :pretty => settings.respond_to?(:json_pretty) && settings.json_pretty
|
8
|
+
end
|
9
|
+
alias JSON json
|
10
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class FanforceApp::SinatraConfig
|
2
|
+
attr_accessor :layout_for_index, :layout_for_dashboard
|
3
|
+
attr_accessor :_id, :redis_url, :factory_root_dir, :root_dir, :dir_name, :show_error_details
|
4
|
+
attr_reader :type
|
5
|
+
|
6
|
+
def initialize(root_dir)
|
7
|
+
@layout_for_index = true
|
8
|
+
@layout_for_dashboard = true
|
9
|
+
|
10
|
+
@_id = ENV['FANFORCE_APP_ID']
|
11
|
+
@root_dir = root_dir
|
12
|
+
@factory_root_dir = File.expand_path '../../', __FILE__
|
13
|
+
@redis_url = ENV['REDIS_URL'] || 'redis://localhost:6379'
|
14
|
+
@show_error_details = false
|
15
|
+
end
|
16
|
+
|
17
|
+
def show_error_details=(bool)
|
18
|
+
@show_error_details = [true,1,'1'].include?(bool)
|
19
|
+
end
|
20
|
+
|
21
|
+
def load
|
22
|
+
raise 'CRITICAL: This FanforceApp requires config._id to be set. See documentation.' if !@_id
|
23
|
+
raise 'CRITICAL: This FanforceApp requires config.root_dir to be set. See documentation' if !@root_dir
|
24
|
+
|
25
|
+
FanforceApp::Sinatra.set :root, @root_dir
|
26
|
+
FanforceApp::Sinatra.set :public_folder, [@root_dir+'/public', @factory_root_dir+'/public'].inject(''){|dir, d| File.directory?(d) ? (break d) : d }
|
27
|
+
FanforceApp::Sinatra.set :views, [@root_dir+'/views', @factory_root_dir+'/views'].inject(''){|dir, d| File.directory?(d) ? (break d) : d }
|
28
|
+
|
29
|
+
FanforceApp.config.load_routes
|
30
|
+
FanforceApp.config.load_redis
|
31
|
+
end
|
32
|
+
|
33
|
+
def load_routes
|
34
|
+
@dir_name = /\/([^\/]+)\/?$/.match(@root_dir)[1]
|
35
|
+
|
36
|
+
$: << File.join(@root_dir,'lib') if File.directory?("#{@root_dir}/lib")
|
37
|
+
|
38
|
+
require "#{@root_dir}/config/initializer" if File.exists?("#{@root_dir}/config/initializer.rb")
|
39
|
+
require "#{@root_dir}/config/routes" if File.exists?("#{@root_dir}/config/routes.rb")
|
40
|
+
|
41
|
+
require "#{@root_dir}/initializer" if File.exists?("#{@root_dir}/initializer.rb")
|
42
|
+
require "#{@root_dir}/routes" if File.exists?("#{@root_dir}/routes.rb")
|
43
|
+
|
44
|
+
require "#{@factory_root_dir}/routes"
|
45
|
+
end
|
46
|
+
|
47
|
+
def load_redis
|
48
|
+
$Redis = ::Redis.new(url: @redis_url)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
if ENV['RACK_ENV'] == 'development'
|
2
|
+
$BASE_DOMAIN = 'fanforce.gg'
|
3
|
+
$APP_DOMAIN = 'app.' + $BASE_DOMAIN
|
4
|
+
$API_DOMAIN = 'api.' + $BASE_DOMAIN
|
5
|
+
$I_DOMAIN = 'i.' + $BASE_DOMAIN
|
6
|
+
$WEBSITE_DOMAIN = $BASE_DOMAIN
|
7
|
+
|
8
|
+
$SMARTURL_DOMAIN = 'fanforc.gg'
|
9
|
+
$FF_PLUGIN_DOMAIN = 'ffplugin.gg'
|
10
|
+
$FF_APP_DOMAIN = 'ffapp.gg'
|
11
|
+
$FF_WIDGET_DOMAIN = 'ffwidget.gg'
|
12
|
+
|
13
|
+
$DEVS_DOMAIN = 'technical%40mobilizationlabs.com:zE27fdevelopers@developers-fanforce.dotcloud.com' # or localhost:3000'
|
14
|
+
|
15
|
+
$PUSHER_APP_ID = '23240'
|
16
|
+
$PUSHER_KEY = '029caf227a64c8e82e99'
|
17
|
+
$PUSHER_SECRET = '3169163d2e27de9a2291'
|
18
|
+
|
19
|
+
elsif ENV['RACK_ENV'] == 'test'
|
20
|
+
$BASE_DOMAIN = 'fanforce.gg'
|
21
|
+
$APP_DOMAIN = 'app.' + $BASE_DOMAIN
|
22
|
+
$API_DOMAIN = 'api.' + $BASE_DOMAIN
|
23
|
+
$I_DOMAIN = 'i.' + $BASE_DOMAIN
|
24
|
+
$WEBSITE_DOMAIN = $BASE_DOMAIN
|
25
|
+
|
26
|
+
$SMARTURL_DOMAIN = 'fanforc.gg'
|
27
|
+
$FF_PLUGIN_DOMAIN = 'ffplugin.gg'
|
28
|
+
$FF_WIDGET_DOMAIN = 'ffwidget.gg'
|
29
|
+
$FF_APP_DOMAIN = 'ffapp.gg'
|
30
|
+
|
31
|
+
$DEVS_DOMAIN = 'technical%40mobilizationlabs.com:zE27fdevelopers@developers-fanforce.dotcloud.com'
|
32
|
+
|
33
|
+
$PUSHER_APP_ID = '23243'
|
34
|
+
$PUSHER_KEY = '7bcc87b3c55301f687b9'
|
35
|
+
$PUSHER_SECRET = '61c760c05430e68d7e8d'
|
36
|
+
|
37
|
+
elsif ENV['RACK_ENV'] == 'qa'
|
38
|
+
$BASE_DOMAIN = 'fanforce-qa.com'
|
39
|
+
$APP_DOMAIN = 'app.' + $BASE_DOMAIN
|
40
|
+
$API_DOMAIN = 'api.' + $BASE_DOMAIN
|
41
|
+
$I_DOMAIN = 'i.' + $BASE_DOMAIN
|
42
|
+
$WEBSITE_DOMAIN = $BASE_DOMAIN
|
43
|
+
|
44
|
+
$SMARTURL_DOMAIN = 'fanforc.us'
|
45
|
+
$FF_PLUGIN_DOMAIN = 'ffplugin.us'
|
46
|
+
$FF_APP_DOMAIN = 'ffapp.us'
|
47
|
+
$FF_WIDGET_DOMAIN = 'ffwidget.us'
|
48
|
+
|
49
|
+
$DEVS_DOMAIN = 'technical%40mobilizationlabs.com:zE27fdevelopers@developers-fanforce.dotcloud.com'
|
50
|
+
|
51
|
+
$PUSHER_APP_ID = '14778'
|
52
|
+
$PUSHER_KEY = 'b5e2e23fb9542798ef38'
|
53
|
+
$PUSHER_SECRET = '7bfba2003df078ca64e9'
|
54
|
+
|
55
|
+
elsif ENV['RACK_ENV'] == 'production'
|
56
|
+
$BASE_DOMAIN = 'fanforce.com'
|
57
|
+
$APP_DOMAIN = 'app.' + $BASE_DOMAIN
|
58
|
+
$API_DOMAIN = 'api.' + $BASE_DOMAIN
|
59
|
+
$I_DOMAIN = 'i.' + $BASE_DOMAIN
|
60
|
+
$WEBSITE_DOMAIN = $BASE_DOMAIN
|
61
|
+
|
62
|
+
$SMARTURL_DOMAIN = 'fanforce.io'
|
63
|
+
$FF_PLUGIN_DOMAIN = 'ffplugin.io'
|
64
|
+
$FF_APP_DOMAIN = 'ffapp.io'
|
65
|
+
$FF_WIDGET_DOMAIN = 'ffwidget.io'
|
66
|
+
|
67
|
+
$DEVS_DOMAIN = 'technical%40mobilizationlabs.com:zE27fdevelopers@developers-fanforce.dotcloud.com'
|
68
|
+
|
69
|
+
$PUSHER_APP_ID = '14778'
|
70
|
+
$PUSHER_KEY = 'b5e2e23fb9542798ef38'
|
71
|
+
$PUSHER_SECRET = '7bfba2003df078ca64e9'
|
72
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<?xml version='1.0' encoding='utf-8' ?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
%html
|
4
|
+
%head
|
5
|
+
%title Fanforce
|
6
|
+
%meta{'http-equiv'=>'Content-Type', content:'text/html; charset=iso-8859-1'}/
|
7
|
+
%meta{'http-equiv'=>'Content-Language', content: 'en-us'}/
|
8
|
+
= stylesheet '/dashboard.css'
|
9
|
+
|
10
|
+
%body
|
11
|
+
= yield
|
12
|
+
= javascript '///' + $I_DOMAIN + '/devforce.js'
|
13
|
+
= javascript '/dashboard.js'
|
14
|
+
= yield_content :after_core_js
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<?xml version='1.0' encoding='utf-8' ?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
3
|
+
%html
|
4
|
+
%head
|
5
|
+
%title Fanforce
|
6
|
+
%meta{'http-equiv'=>'Content-Type', content:'text/html; charset=iso-8859-1'}/
|
7
|
+
%meta{'http-equiv'=>'Content-Language', content: 'en-us'}/
|
8
|
+
= stylesheet '/promotional.css'
|
9
|
+
|
10
|
+
%body
|
11
|
+
= yield
|
12
|
+
= javascript "///#{$I_DOMAIN}/devforce.js?force_compile=#{ENV['RACK_ENV']=='development' ? 1 : 0}&env=#{ENV['RACK_ENV']}"
|
13
|
+
= javascript '/promotional.js'
|
14
|
+
= yield_content :after_core_js
|
Binary file
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class FanforceApp::Sinatra
|
2
|
+
|
3
|
+
# INDEX ########################################################################
|
4
|
+
def route_index(params)
|
5
|
+
page :index, :layout => :promotional
|
6
|
+
end
|
7
|
+
['/', '/index.html'].each do |path|
|
8
|
+
get path do route_index(params) end
|
9
|
+
end
|
10
|
+
|
11
|
+
# INSTALL ######################################################################
|
12
|
+
def route_install(params)
|
13
|
+
raise "This is not a valid app install request: #{env['HTTP_HOST']}" if !ff.valid_install_request?(params)
|
14
|
+
api_key = $Redis.get("installed:#{ff.params[:addon_type]}-#{ff.params[:addon_id]}:#{ff.params[:fanforce_id]}")
|
15
|
+
|
16
|
+
#raise 'A different API key already exists for this addon. Please uninstall first.' if api_key.present? and ff.params[:api_key] != api_key
|
17
|
+
$Redis.set("installed:#{ff.params[:addon_type]}-#{ff.params[:addon_id]}:#{ff.params[:fanforce_id]}", ff.params[:api_key])
|
18
|
+
ff.auth(ff.params[:api_key])
|
19
|
+
|
20
|
+
json status: 'installed', success: true
|
21
|
+
end
|
22
|
+
any '/install' do route_install(params) end
|
23
|
+
|
24
|
+
# UNINSTALL ####################################################################
|
25
|
+
def route_uninstall(params)
|
26
|
+
raise 'This is not a valid app uninstall request.' if !ff.valid_uninstall_request?(params)
|
27
|
+
api_key = $Redis.get("installed:#{ff.params[:addon_type]}-#{ff.params[:addon_id]}:#{ff.params[:fanforce_id]}")
|
28
|
+
|
29
|
+
raise 'API keys must match before an addon can be uninstalled.' if api_key.present? and ff.params[:api_key] != api_key
|
30
|
+
$Redis.del("installed:#{ff.params[:addon_type]}-#{ff.params[:addon_id]}:#{ff.params[:fanforce_id]}")
|
31
|
+
json status: 'uninstalled', success: true
|
32
|
+
end
|
33
|
+
any '/uninstall' do route_uninstall(params) end
|
34
|
+
|
35
|
+
# DASHBOARD ####################################################################
|
36
|
+
def route_dashboard(params)
|
37
|
+
page :dashboard, :layout => :dashboard
|
38
|
+
end
|
39
|
+
get '/dashboard.html' do route_dashboard(params) end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'sprockets'
|
2
|
+
|
3
|
+
class SprocketsCompiler
|
4
|
+
# This is pretty much copy/paste from https://github.com/stevehodgkiss/guard-sprockets2/blob/master/lib/guard/sprockets2/compiler.rb
|
5
|
+
# The only method added/changed is self.sprockets()
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
configure(options)
|
9
|
+
@target = Pathname.new(@assets_path)
|
10
|
+
end
|
11
|
+
|
12
|
+
def clean
|
13
|
+
FileUtils.rm_rf @assets_path, :secure => true
|
14
|
+
end
|
15
|
+
|
16
|
+
def compile
|
17
|
+
@sprockets.send(:expire_index!)
|
18
|
+
success = true
|
19
|
+
@precompile.each do |path|
|
20
|
+
@sprockets.each_logical_path do |logical_path|
|
21
|
+
next unless path_matches?(path, logical_path)
|
22
|
+
|
23
|
+
if asset = @sprockets.find_asset(logical_path)
|
24
|
+
success = compile_asset(asset, false)
|
25
|
+
success = compile_asset(asset, true) if @digest
|
26
|
+
break unless success
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
success
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
def compile_asset(asset, digest)
|
36
|
+
filename = digest ? @target.join(asset.digest_path) : @target.join(asset.logical_path)
|
37
|
+
puts filename
|
38
|
+
|
39
|
+
FileUtils.mkdir_p filename.dirname
|
40
|
+
asset.write_to(filename)
|
41
|
+
asset.write_to("#{filename}.gz") if @gz && filename.to_s =~ /\.(css|js)$/
|
42
|
+
true
|
43
|
+
rescue => e
|
44
|
+
puts unless ENV['GUARD_ENV'] == 'test'
|
45
|
+
UI.error e.message.gsub(/^Error: /, '')
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
49
|
+
def path_matches?(path, logical_path)
|
50
|
+
if path.is_a?(Regexp)
|
51
|
+
path.match(logical_path)
|
52
|
+
else
|
53
|
+
File.fnmatch(path.to_s, logical_path)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def configure(options)
|
58
|
+
@sprockets = options[:sprockets]
|
59
|
+
@assets_path = options[:assets_path]
|
60
|
+
@precompile = options[:precompile]
|
61
|
+
@digest = options[:digest]
|
62
|
+
@gz = options[:gz]
|
63
|
+
set_defaults
|
64
|
+
end
|
65
|
+
|
66
|
+
def set_defaults
|
67
|
+
if defined?(Rails)
|
68
|
+
@sprockets ||= Rails.application.assets
|
69
|
+
@assets_path ||= File.join(Rails.public_path, Rails.application.config.assets.prefix)
|
70
|
+
@precompile ||= Rails.application.config.assets.precompile
|
71
|
+
else
|
72
|
+
@assets_path ||= "#{Dir.pwd}/public/assets"
|
73
|
+
@precompile ||= [ /\w+\.(?!js|css).+/, /application.(js|css)$/ ]
|
74
|
+
end
|
75
|
+
@digest = true if @digest.nil?
|
76
|
+
@gz = true if @gz.nil?
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.setup(base_dir)
|
80
|
+
sprockets = ::Sprockets::Environment.new(base_dir)
|
81
|
+
|
82
|
+
sprockets.append_path 'assets/img'
|
83
|
+
sprockets.append_path 'assets/js'
|
84
|
+
sprockets.append_path 'assets/css'
|
85
|
+
sprockets.append_path 'assets/lib'
|
86
|
+
|
87
|
+
default_assets_dir = File.dirname( File.expand_path( __FILE__ ) ) + '/..'
|
88
|
+
sprockets.append_path default_assets_dir + '/assets/img'
|
89
|
+
sprockets.append_path default_assets_dir + '/assets/js'
|
90
|
+
sprockets.append_path default_assets_dir + '/assets/css'
|
91
|
+
sprockets.append_path default_assets_dir + '/assets/lib'
|
92
|
+
|
93
|
+
sprockets.append_path "#{Gem.loaded_specs['compass'].full_gem_path}/frameworks/compass/stylesheets"
|
94
|
+
|
95
|
+
if ENV['RACK_ENV'] != 'development'
|
96
|
+
require 'yui/compressor'
|
97
|
+
require 'uglifier'
|
98
|
+
sprockets.css_compressor = YUI::CssCompressor.new
|
99
|
+
sprockets.js_compressor = Uglifier.new
|
100
|
+
end
|
101
|
+
|
102
|
+
return sprockets
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Compact function pulled from compass
|
2
|
+
require 'sass'
|
3
|
+
module Sass::Script::Functions
|
4
|
+
module CustomSassExtensions
|
5
|
+
def compact(*args)
|
6
|
+
sep = :comma
|
7
|
+
if args.size == 1 && args.first.is_a?(Sass::Script::List)
|
8
|
+
args = args.first.value
|
9
|
+
sep = args.first.separator
|
10
|
+
end
|
11
|
+
Sass::Script::List.new(args.reject{|a| !a.to_bool}, sep)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
include CustomSassExtensions
|
15
|
+
end
|
16
|
+
|
17
|
+
module Sprockets
|
18
|
+
class AssetAttributes
|
19
|
+
def search_paths
|
20
|
+
paths = [pathname.to_s]
|
21
|
+
|
22
|
+
path_without_extensions = extensions.inject(pathname) { |p, ext| p.sub(ext, '') }
|
23
|
+
|
24
|
+
# optimization: component.json can only be nested one level deep
|
25
|
+
if !path_without_extensions.to_s.index('/')
|
26
|
+
paths << path_without_extensions.join("component.json").to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
if pathname.basename(extensions.join).to_s != 'index'
|
30
|
+
paths << path_without_extensions.join("index#{extensions.join}").to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
if paths[0] !~ /\/assets\/(js|css|img)\// and paths[0] =~ /^(\/?[^\/]+)(\/.+)$/
|
34
|
+
paths << $1 + '/assets/css' +$2
|
35
|
+
paths << $1 + '/assets/js' +$2
|
36
|
+
paths << $1 + '/assets/img' +$2
|
37
|
+
end
|
38
|
+
|
39
|
+
paths
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|