fanforce-app-factory 0.7.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 (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