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
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MjFjYjNmZjFhZGEyZGYxNTZkZThkZjI0NWU0NzgxMDg5NTM2ZjZmNQ==
5
+ data.tar.gz: !binary |-
6
+ NzZjYmIzZmFiYWZhZjI1YTZkNWI4ZDA1MTYzNGFiMDMxNDUxZDU4Mw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZmQzZmQxZjBkMTM1OTU5ODEwMTAwYWMxNDUyNWY1MzAwZTIxMmU2MTliODAw
10
+ Mzk5YjM5MTFlMDcxMjViNjYxZGZhZTljZDU1ZjE1ZGNhYzc1NzlhY2IyZjkx
11
+ OTUwYWI1ZjhjMWNhMDVmN2JlNzAzNmVmNTJmOWY0NzU4MzFiNjM=
12
+ data.tar.gz: !binary |-
13
+ ODI5OGI2NjI5MDAzNTIyYjZlYjEyMjg3MDRmOTVkMTQ3MzIxN2FhMTc4YzQ0
14
+ NTc2YjhmY2I2ZjA5YTNmYWQ0MzI4ZjQ2YThjODZmNTkwN2M1NDllMTkxYTlk
15
+ OWUwYTcxYmQ5NzY4NWUzMjczNzA4MDJlMTEwYzUzZTk4MWYzYzE=
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+ .idea/
15
+ .DS_STORE
16
+ Gemfile.lock
17
+
18
+ # YARD artifacts
19
+ .yardoc
20
+ _yardoc
21
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec
data/README.md ADDED
@@ -0,0 +1,182 @@
1
+ fanforce-app-factory
2
+ ========
3
+ The fanforce-app-factory is a gem that makes it really easy to create new Fanforce Apps using convention over configuration.
4
+
5
+ # Easy Setup
6
+ Only two files are required to setup a new project:
7
+ 1. Gemfile
8
+ 2. config.ru
9
+
10
+ ### /Gemfile
11
+ Since the fanforce-app-factory gem is hosted on a private gem server so you'll need to specify the source for both rubygems and the private server.
12
+
13
+ ```ruby
14
+ source 'https://rubygems.org'
15
+ source 'https://gems.gemfury.com/xF8KY9sm8eS9yUQqw1jD/'
16
+ ruby '1.9.3'
17
+
18
+ gem 'fanforce-app-factory'
19
+ ```
20
+ One you've created the Gemfile you'll need to run bundle install.
21
+
22
+ ### /config.ru
23
+ Only four lines are required (you must have a Redis server).
24
+
25
+ ```ruby
26
+ require 'bundler'; Bundler.setup
27
+ require 'fanforce/app'
28
+ FanforceApp.config { |config| config._id = 'facebook' }
29
+ run FanforceApp
30
+ ```
31
+ You can replace config._id (as in the example above) with an environment variable: ENV['FANFORCE_APP_ID']
32
+
33
+ ### Ready for the Fanforce Marketplace!
34
+ Your app can now be added to the Fanforce Marketplace. Use the follow config settings when adding your new app into Fanforce
35
+
36
+ ```ruby
37
+ "public_urls": {
38
+ "marketplace_img": "http://${PRIMARY_DOMAIN}/assets/marketplace.png",
39
+ "icon_16": "http://${PRIMARY_DOMAIN}/assets/icon-16.png",
40
+ "icon_32": "http://${PRIMARY_DOMAIN}/assets/icon-32.png"
41
+ "icon_42": "http://${PRIMARY_DOMAIN}/assets/icon-42.png"
42
+ },
43
+ "staffer_ui_urls": {
44
+ "dashboard": "http://${PRIMARY_DOMAIN}/dashboard.html"
45
+ },
46
+ "callback_urls": {
47
+ "install": "http://${PRIMARY_DOMAIN}/install",
48
+ "uninstall": "http://${PRIMARY_DOMAIN}/uninstall"
49
+ },
50
+ "plugin_dependencies": []
51
+ ```
52
+ Note: for development and testing we recommend using the [POW server](http://pow.cx/), but you can use rackup or any other server to run your new app.
53
+
54
+ ====================
55
+
56
+ # Customizing/Building Your App
57
+ There are lots of ways you can start building out and customizing your app...
58
+
59
+ ### /assets
60
+ Use the assets folder to store all your images, css, and javascript files. There are six asset files that are required. If any are missing, the fanforce-app-factory sends default versions when requested.
61
+
62
+ *Default Assets:*
63
+ * /js
64
+ * /dashboard.js - this is included in the dashboard.html file.
65
+ * /css
66
+ * /dashboard.css - this is also included in the dashboard.html file.
67
+ * /img
68
+ * /icon-16.png - this icon must be 16px by 16px.
69
+ * /icon-32.png - this icon must be 32px by 32px.
70
+ * /icon-42.png - this icon must be 42px by 42px.
71
+ * /marketplace.png - this icon must be 220px by 142px.
72
+
73
+ ### /views
74
+ HAML is setup by default. The extension is changed to .html when served in the browser.
75
+
76
+ *Default Views:*
77
+ * /index.haml - default page visitors will see if they try to access domain
78
+ * /dashboard.haml - used in the Command Center
79
+
80
+ ### /layouts
81
+ You can turn off layouts from be used (see Advanced Configuration)
82
+
83
+ *Default Layouts:*
84
+ * /dashboard.haml - the wrapper layout for views/dashboard.haml
85
+ * /promotional.haml - the wrapper layout for views/index.haml
86
+
87
+ ### /public
88
+ Anything you put in here will be publicly available. The only folder you should not use is /assets, since it is used for precompiling assets (see below).
89
+
90
+ *Default Files:*
91
+ * /favicon.ico
92
+
93
+ ### /config/routes.rb
94
+ The fanforce-app-factory sets up all the required routes. If you want to customize existing routes or add new ones, create a config/routes.rb file and specify routes within the FanforceApp:Sinatra class:
95
+ ```
96
+ class FanforceApp::Sinatra
97
+ get '/test' do
98
+ "Custom route!"
99
+ end
100
+ end
101
+ ```
102
+ Check out [Sinatra's](http://www.sinatrarb.com/documentation) documentation for more details on routes and much more. The FanforceApp::Sinatra inherits from the Sinatra::Base, which gives you full control to customize the fanforce-app-factory's sinatra implementation as much as you want.
103
+
104
+ Overwrite any existing routes by specifying them in your config/routes.rb. You can also pull default route logic into your new custom routes by calling route_[NAME_OF_ROUTE] method.
105
+ ```
106
+ class FanforceApp::Sinatra
107
+ any '/install' do
108
+ # do whatever you want here
109
+ route_install
110
+ end
111
+ end
112
+ ```
113
+ *Default Routes:*
114
+ - route_index: get ['/','/index.html']
115
+ - route_dashboard: get '/dashboard.html'
116
+ - route_install: post '/install'
117
+ - route_uninstall: post '/uninstall'
118
+
119
+ ### /config/initializer.rb
120
+ If you need to run Sinatra middleware or other non-route code, you'll want to create a config/initializer.rb file. This file is required before config/routes.rb. As an example, if you want to use the OmniAuth Facebook Strategy, you would include the following in config/initializer.rb:
121
+ ```
122
+ require 'omniauth'
123
+ require 'omniauth-constantcontact2'
124
+
125
+ class FanforceApp::Sinatra
126
+
127
+ use Rack::Session::Cookie
128
+ use OmniAuth::Builder do
129
+ provider :constantcontact, ENV['CONSTANTCONTACT_API_KEY'], ENV['CONSTANTCONTACT_API_SECRET']
130
+ end
131
+
132
+ end
133
+ ```
134
+
135
+ ### /lib/*
136
+ If you create a lib/ folder in your app's home directory, it will be automatically added to your app's ruby path. This allows you to require 'any_file' that has been put in this folder.
137
+
138
+
139
+ # Loading Pages/Layouts In Controllers
140
+ Fanforce-app-factory adds a helper method on top of the Sinatra code base to load pages and layouts. It's called page:
141
+ ```
142
+ get '/custom.html' do
143
+ page :custom, :layout => :custom
144
+ end
145
+ ```
146
+ *Other Examples*
147
+ - :custom_page
148
+ - :custom_page, :layout => :false
149
+
150
+ # Rendering JSON, JSONP, and JSONR
151
+ Fanforce-app-factory adds a "json" method you use in your routes to convert the object to json and set the correct application/json header:
152
+ ```
153
+ get '/custom.html' do
154
+ json first_name: 'Caleb', last_name: 'Clark'
155
+ end
156
+ ```
157
+ If a callback param is sent in the request then your json is automatically converted to JSONR[http://github.com/calebclark/rack-jsonr] (JSON Resource).
158
+
159
+
160
+ # Precompile Your Assets for Faster Delivery
161
+ Heroku tries to run `rake assets:precompile` when pushing new code changes. Fanforce-app-factory has this rake task built-in. To activate, just create a new Rakefile in your app directory with the following:
162
+ ```
163
+ require 'bundler'; Bundler.setup
164
+ require 'fanforce/app'
165
+ load 'fanforce/app.rake'
166
+ ```
167
+
168
+ # Create App-Specific ENV Variables In Development
169
+ Documentation coming soon.
170
+
171
+ # Configure Redis
172
+ By default fanforce-app-factory looks for ENV['REDIS_URL'] and if that isn't found, it falls back to redis://localhost:6379. You can specify a custom redis url with `config.redis_url = ` in config.ru:
173
+ ```
174
+ require 'bundler'; Bundler.setup
175
+ require 'fanforce/app'
176
+ FanforceApp.config do |config|
177
+ config.redis_url = 'redis://USERNAME:PASSWORD@HOST:PORT'
178
+ end
179
+ load 'fanforce/app.rake'
180
+ ```
181
+
182
+
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'fileutils'
4
+ include FileUtils
5
+
6
+ # Default Rake task is compile
7
+ #task :default => :compile
8
+
9
+ ########################################################################
10
+
11
+ Rake::TestTask.new do |t|
12
+ t.libs.push "lib"
13
+ t.libs.push "test"
14
+ t.pattern = 'test/**/*_test.rb'
15
+ t.verbose = false
16
+ end
@@ -0,0 +1,40 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fanforce/app_factory/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'fanforce-app-factory'
8
+ gem.version = Fanforce::AppFactory::VERSION
9
+ gem.date = '2012-10-19'
10
+ gem.summary = %q{Everything needed to setup a new app on Fanforce}
11
+ gem.authors = ['Caleb Clark']
12
+ gem.email = ['cclark@fanforce.com']
13
+ gem.homepage = 'http://github.com/mlabs/fanforce-app-factory'
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
+ gem.require_paths = ['lib']
18
+
19
+ gem.add_development_dependency 'rake', '~> 0.8.7'
20
+ gem.add_runtime_dependency 'redis', '~> 3.0'
21
+ gem.add_runtime_dependency 'sinatra', '~> 1.3'
22
+ gem.add_runtime_dependency 'multi_json', '~> 1.3.6'
23
+ gem.add_runtime_dependency 'sinatra-contrib'
24
+ gem.add_runtime_dependency 'rack-contrib'
25
+ gem.add_runtime_dependency 'haml', '~> 3.1'
26
+ gem.add_runtime_dependency 'coffee-script'
27
+ gem.add_runtime_dependency 'coffee-filter'
28
+ gem.add_runtime_dependency 'activesupport', '~> 3.2'
29
+
30
+ gem.add_runtime_dependency 'sass', '~> 3.2'
31
+ gem.add_runtime_dependency 'compass', '~> 0.12'
32
+ gem.add_runtime_dependency 'sprockets', '~> 2.9'
33
+ gem.add_runtime_dependency 'sprockets-sass', '~> 0.9'
34
+ gem.add_runtime_dependency 'yui-compressor', '~> 0.9'
35
+ gem.add_runtime_dependency 'uglifier', '~> 1.3'
36
+
37
+ gem.add_runtime_dependency 'rack-jsonr', '~> 0.2'
38
+ gem.add_runtime_dependency 'fanforce', '~> 0.8'
39
+ gem.add_runtime_dependency 'fanforce-errors', '~> 0.2'
40
+ end
@@ -0,0 +1,71 @@
1
+ require 'fanforce'
2
+ require 'fileutils'
3
+ require 'json'
4
+ require 'yaml'
5
+ require_relative 'app_factory/sprockets/hacks'
6
+ require_relative 'app_factory/sprockets/compiler'
7
+
8
+ def load_env_from_file(file)
9
+ File.open(file, 'rb') do |file|
10
+ contents = file.read
11
+ lines = contents.gsub('export ', '').split(/\n\r?/).reject{|line| line.blank?}
12
+ lines.each do |line|
13
+ keyValue = line.split("=", 2)
14
+ next unless keyValue.count == 2
15
+ ENV[keyValue.first] = keyValue.last.gsub("'",'').gsub('"','')
16
+ end
17
+ end
18
+ end
19
+
20
+ if (!ENV['RACK_ENV'] or ENV['RACK_ENV'] == 'development')
21
+ load_env_from_file("#{FanforceApp.config.root_dir}/.powenv") if File.exists?("#{FanforceApp.config.root_dir}/.powenv")
22
+ load_env_from_file("#{FanforceApp.config.root_dir}/.appenv") if File.exists?("#{FanforceApp.config.root_dir}/.appenv")
23
+ end
24
+
25
+ FanforceApp.config.load_redis
26
+
27
+ namespace :assets do
28
+ root_dir = FanforceApp.config.root_dir
29
+ factory_root_dir = FanforceApp.config.factory_root_dir
30
+
31
+ desc 'Precompile assets for production'
32
+ task :precompile => :clean do
33
+ sprockets = SprocketsCompiler.setup(root_dir)
34
+
35
+ puts 'PRECOMPILING ASSETS... '
36
+ SprocketsCompiler.new(sprockets: sprockets, precompile: [/(\/|^)[^_\/]+[^\/]*\.(css|js|png|gif|jpeg|jpg|otf|eot|svg|ttf|woff)/]).compile
37
+ puts 'DONE'
38
+
39
+ print 'GENERATING ASSET MANIFESTS... '
40
+ asset_list = {}
41
+ sprockets.each_logical_path do |logical_path|
42
+ if File.basename(logical_path) !~ /^[_]/ and asset = sprockets.find_asset(logical_path)
43
+ asset_list[logical_path] = "/assets/#{asset.digest_path}"
44
+ end
45
+ end
46
+ IO.write File.join(root_dir, '/public/asset_manifest.json'), JSON.generate(asset_list)
47
+ IO.write File.join(root_dir, '/public/asset_manifest.json'), "ASSETS=#{JSON.generate(asset_list)}"
48
+ IO.write File.join(root_dir, '/public/asset_manifest.json'), asset_list.to_yaml
49
+ puts 'DONE'
50
+
51
+ print 'ENSURING FAVICON EXISTS... '
52
+ if !File.exists?(root_dir+'/public/favicon.ico')
53
+ puts ''
54
+ FileUtils.cp("#{factory_root_dir}/public/favicon.ico", "#{root_dir}/public/favicon.ico")
55
+ puts "#{root_dir}/public/favicon.ico"
56
+ end
57
+ puts 'DONE'
58
+ end
59
+
60
+ desc 'Clean assets folder'
61
+ task :clean do
62
+ print 'DESTROYING PUBLIC/ASSETS... '
63
+ FileUtils.rm_rf File.join(root_dir, '/public/assets')
64
+ puts 'DONE'
65
+ end
66
+
67
+ task :test do
68
+ puts 'TEST WORKED!'
69
+ end
70
+
71
+ end
@@ -0,0 +1,56 @@
1
+ ENV['RACK_ENV'] ||= 'development'
2
+ ####################################################################################
3
+ require 'fanforce'
4
+ require 'active_support/all'
5
+ require 'sinatra/base'
6
+ require 'fileutils'
7
+ require 'redis'
8
+
9
+ if ENV['RACK_ENV'] == 'development'
10
+ require_relative 'app_factory/sprockets/hacks'
11
+ require_relative 'app_factory/sprockets/compiler'
12
+ end
13
+
14
+ caller[0].split(':')[0] =~ /^(.+(config\.ru|Rakefile))$/ ? ROOT_DIR = File.dirname($1) : nil
15
+
16
+ module FanforceApp
17
+
18
+ def self.config(&block)
19
+ config = @@config ||= FanforceApp::SinatraConfig.new(ROOT_DIR)
20
+ if block.present?
21
+ block.call(config)
22
+ config.root_dir = File.dirname($1) if !config.root_dir and caller[0].split(':')[0] =~ /^(.+(config\.ru|Rakefile))$/
23
+ end
24
+ config
25
+ end
26
+
27
+ def self.root
28
+ config.root_dir
29
+ end
30
+
31
+ def self.dir_name
32
+ config.dir_name
33
+ end
34
+
35
+ def self._id
36
+ config._id
37
+ end
38
+
39
+ def self.load_config
40
+ config.load
41
+ end
42
+
43
+ def self.call(env)
44
+ if ENV['RACK_ENV'] == 'development' and env['PATH_INFO'] =~ /^\/assets\//
45
+ env['PATH_INFO'] = env['PATH_INFO'].gsub(/^\/assets/, '')
46
+ sprockets = SprocketsCompiler.setup(FanforceApp.config.root_dir)
47
+ return sprockets.index.call(env)
48
+ end
49
+ require_relative 'app_factory/_init_sinatra'
50
+ FanforceApp::Sinatra.new.call(env)
51
+ end
52
+
53
+ require_relative 'app_factory/config/sinatra_config'
54
+ require_relative 'app_factory/initializers/ff_globals'
55
+ end
56
+
@@ -0,0 +1,54 @@
1
+ require 'sinatra/content_for'
2
+ require 'coffee-filter'
3
+ require 'rack/jsonr'
4
+ ####################################################################################
5
+
6
+ class FanforceApp::Sinatra < Sinatra::Base
7
+ require_relative 'config/_error_handling'
8
+ require_relative 'config/helpers/assets'
9
+ require_relative 'config/helpers/json'
10
+ require_relative 'config/helpers/fanforce'
11
+
12
+ use Rack::JSONR, :method_override => :all
13
+
14
+ helpers Sinatra::AssetHelpers
15
+ helpers Sinatra::JSONHelpers
16
+ helpers Sinatra::FanforceHelpers
17
+ helpers Sinatra::ContentFor
18
+
19
+ def self.any(url,&block)
20
+ get(url,&block)
21
+ post(url,&block)
22
+ put(url,&block)
23
+ delete(url,&block)
24
+ end
25
+
26
+ def page(page, options={})
27
+ current_dir = File.expand_path('../', __FILE__)
28
+ if !File.exists?("#{settings.views}/#{page}.haml")
29
+ rel_path = Pathname.new(current_dir).relative_path_from(Pathname.new(settings.views))
30
+ page = :"#{rel_path}/views/#{page}"
31
+ end
32
+
33
+ if options[:layout] and FanforceApp.config.respond_to?(:"layout_for_#{page}") and FanforceApp.config.method(:"layout_for_#{page}").call
34
+ if File.exists?("#{settings.views}/../layouts/#{options[:layout]}.haml")
35
+ options[:layout] = :"../layouts/#{options[:layout]}"
36
+ else
37
+ rel_path = Pathname.new(current_dir).relative_path_from(Pathname.new(settings.views))
38
+ options[:layout] = :"#{rel_path}/layouts/#{options[:layout]}"
39
+ end
40
+ else
41
+ options[:layout] = false
42
+ end
43
+ haml page, options
44
+ end
45
+
46
+ configure do
47
+ FanforceApp.load_config
48
+ set :haml, {:escape_attrs => false}
49
+ set :static, true
50
+ set :protection, :except => [:frame_options, :json_csrf]
51
+ end
52
+
53
+ end
54
+