fanforce-app-factory 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +21 -0
  3. data/Gemfile +2 -0
  4. data/README.md +182 -0
  5. data/Rakefile +16 -0
  6. data/fanforce-app-factory.gemspec +40 -0
  7. data/lib/fanforce/app_factory.rake +71 -0
  8. data/lib/fanforce/app_factory.rb +56 -0
  9. data/lib/fanforce/app_factory/_init_sinatra.rb +54 -0
  10. data/lib/fanforce/app_factory/assets/css/dashboard.scss +24 -0
  11. data/lib/fanforce/app_factory/assets/css/promotional.scss +1 -0
  12. data/lib/fanforce/app_factory/assets/img/icon-16.png +0 -0
  13. data/lib/fanforce/app_factory/assets/img/icon-32.png +0 -0
  14. data/lib/fanforce/app_factory/assets/img/icon-42.png +0 -0
  15. data/lib/fanforce/app_factory/assets/img/marketplace.png +0 -0
  16. data/lib/fanforce/app_factory/assets/img/marketplace.psd +0 -0
  17. data/lib/fanforce/app_factory/assets/js/dashboard.coffee +18 -0
  18. data/lib/fanforce/app_factory/assets/js/promotional.js +1 -0
  19. data/lib/fanforce/app_factory/assets/lib/common/_mixins.scss +97 -0
  20. data/lib/fanforce/app_factory/assets/lib/common/_tags.scss +83 -0
  21. data/lib/fanforce/app_factory/assets/lib/common/_variables.scss +27 -0
  22. data/lib/fanforce/app_factory/assets/lib/common/icons/dropdown-arrow.png +0 -0
  23. data/lib/fanforce/app_factory/assets/lib/common/icons/initiative.png +0 -0
  24. data/lib/fanforce/app_factory/assets/lib/common/layouts/_dashboard.scss +18 -0
  25. data/lib/fanforce/app_factory/assets/lib/common/layouts/_promotional.scss +27 -0
  26. data/lib/fanforce/app_factory/assets/lib/common/layouts/dashboard.js +6 -0
  27. data/lib/fanforce/app_factory/assets/lib/common/layouts/promotional.js +1 -0
  28. data/lib/fanforce/app_factory/assets/lib/promotional/fanforce_bg.png +0 -0
  29. data/lib/fanforce/app_factory/assets/lib/promotional/icon-42.png +0 -0
  30. data/lib/fanforce/app_factory/assets/lib/promotional/icon-plus.png +0 -0
  31. data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/css/bootstrap.css +6103 -0
  32. data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/css/bootstrap.min.css +868 -0
  33. data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/img/glyphicons-halflings-white.png +0 -0
  34. data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/img/glyphicons-halflings.png +0 -0
  35. data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/js/bootstrap.js +2170 -0
  36. data/lib/fanforce/app_factory/assets/lib/vendors/bootstrap/js/bootstrap.min.js +7 -0
  37. data/lib/fanforce/app_factory/assets/lib/vendors/chosen/chosen-sprite.png +0 -0
  38. data/lib/fanforce/app_factory/assets/lib/vendors/chosen/chosen.jquery.min.js +10 -0
  39. data/lib/fanforce/app_factory/assets/lib/vendors/chosen/chosen.scss +399 -0
  40. data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/css/font-awesome.css +540 -0
  41. data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/css/font-awesome.min.css +33 -0
  42. data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/font/FontAwesome.otf +0 -0
  43. data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/font/fontawesome-webfont.eot +0 -0
  44. data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/font/fontawesome-webfont.svg +284 -0
  45. data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/font/fontawesome-webfont.ttf +0 -0
  46. data/lib/fanforce/app_factory/assets/lib/vendors/font-awesome/font/fontawesome-webfont.woff +0 -0
  47. data/lib/fanforce/app_factory/assets/lib/vendors/jquery/jquery.inputHint.js +154 -0
  48. data/lib/fanforce/app_factory/assets/lib/vendors/jquery/jquery.tmpl.debug.js +484 -0
  49. data/lib/fanforce/app_factory/assets/lib/vendors/knockout/knockout.custom-handlers.coffee +131 -0
  50. data/lib/fanforce/app_factory/assets/lib/vendors/knockout/knockout.debug.js +3223 -0
  51. data/lib/fanforce/app_factory/assets/lib/vendors/underscore/underscore.debug.js +999 -0
  52. data/lib/fanforce/app_factory/config/_error_handling.rb +26 -0
  53. data/lib/fanforce/app_factory/config/helpers/assets.rb +23 -0
  54. data/lib/fanforce/app_factory/config/helpers/fanforce.rb +21 -0
  55. data/lib/fanforce/app_factory/config/helpers/json.rb +10 -0
  56. data/lib/fanforce/app_factory/config/sinatra_config.rb +51 -0
  57. data/lib/fanforce/app_factory/initializers/ff_globals.rb +72 -0
  58. data/lib/fanforce/app_factory/layouts/dashboard.haml +14 -0
  59. data/lib/fanforce/app_factory/layouts/promotional.haml +14 -0
  60. data/lib/fanforce/app_factory/public/favicon.ico +0 -0
  61. data/lib/fanforce/app_factory/routes.rb +41 -0
  62. data/lib/fanforce/app_factory/sprockets/compiler.rb +105 -0
  63. data/lib/fanforce/app_factory/sprockets/hacks.rb +43 -0
  64. data/lib/fanforce/app_factory/version.rb +5 -0
  65. data/lib/fanforce/app_factory/views/dashboard.haml +38 -0
  66. data/lib/fanforce/app_factory/views/index.haml +38 -0
  67. data/lib/fanforce/app_factory_workers.rb +1 -0
  68. data/lib/fanforce_app_factory.rb +2 -0
  69. 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
@@ -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
@@ -0,0 +1,5 @@
1
+ class Fanforce
2
+ module AppFactory
3
+ VERSION = '0.7.0'
4
+ end
5
+ end