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
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
+