diff --git a/.gitignore b/.gitignore
index 445beaab..9740804b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,7 @@
node_modules
doc/fdoc-html
tmp/cache/*
+*.war
+public/assets
+bin/*
+config/database.yml
diff --git a/Gemfile b/Gemfile
index 66653d80..1727fd29 100644
--- a/Gemfile
+++ b/Gemfile
@@ -78,3 +78,9 @@ group :test do
end
gem 'sql_origin', groups: [:development, :test]
+
+# Warbler seems to bundle its own gemspec even when skipping
+# :development. The gemspec requires warbler/version which doesn't
+# exist so the whole thing blows up. Putting this in :default group
+# until I can figure out how to fix it.
+gem 'warbler', github: 'bjeanes/warbler', platform: :jruby, require: nil
diff --git a/Gemfile.lock b/Gemfile.lock
index 4559daf7..85ba3b3d 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -19,6 +19,16 @@ GIT
specs:
git (1.2.5)
+GIT
+ remote: git://github.com/bjeanes/warbler.git
+ revision: 3363641ec52c78ab74d990f287536a78b1ea0eda
+ specs:
+ warbler (1.3.7.dev)
+ jruby-jars (>= 1.5.6)
+ jruby-rack (>= 1.0.0)
+ rake (>= 0.9.6)
+ rubyzip (>= 0.9.8)
+
GIT
remote: git://github.com/rails/rails.git
revision: f1efecfc3f009d7b25a0b72170914a2739cb3765
@@ -124,6 +134,8 @@ GEM
jquery-rails (2.2.1)
railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0)
+ jruby-jars (1.7.3)
+ jruby-rack (1.1.13.1)
json (1.7.7)
json (1.7.7-java)
json-schema (1.1.1)
@@ -176,6 +188,7 @@ GEM
rspec-core (~> 2.12.0)
rspec-expectations (~> 2.12.0)
rspec-mocks (~> 2.12.0)
+ rubyzip (0.9.9)
sass (3.2.5)
sass-rails (3.2.6)
railties (~> 3.2.0)
@@ -283,4 +296,5 @@ DEPENDENCIES
url_validation
user-agent
validates_timeliness
+ warbler!
yard
diff --git a/config/database.yml b/config/database.example.yml
similarity index 100%
rename from config/database.yml
rename to config/database.example.yml
diff --git a/config/environments/common/application.yml b/config/environments/common/application.yml
new file mode 100644
index 00000000..4faaf8f6
--- /dev/null
+++ b/config/environments/common/application.yml
@@ -0,0 +1,2 @@
+# Replace this with a random value (e.g. result of `head -c2048 /dev/urandom | openssl sha1`)
+secret_token:
\ No newline at end of file
diff --git a/config/initializers/extra_config_directory.rb b/config/initializers/extra_config_directory.rb
new file mode 100644
index 00000000..0b5e0771
--- /dev/null
+++ b/config/initializers/extra_config_directory.rb
@@ -0,0 +1,7 @@
+config_dir = ENV['CONFIG_DIR']
+
+if config_dir && File.directory?(config_dir)
+ Dir["#{config_dir}/**/*.yml"].sort.each do |config|
+ Squash::Configuration << config
+ end
+end
diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb
index 10a4401e..6c76bfb2 100644
--- a/config/initializers/secret_token.rb
+++ b/config/initializers/secret_token.rb
@@ -18,4 +18,4 @@
# If you change this key, all old signed cookies will become invalid!
# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
-Squash::Application.config.secret_token = '_SECRET_'
+Squash::Application.config.secret_token = Squash::Configuration.application.secret_token || '_SECRET_'
diff --git a/config/warble.rb b/config/warble.rb
new file mode 100644
index 00000000..77c36405
--- /dev/null
+++ b/config/warble.rb
@@ -0,0 +1,151 @@
+# Disable Rake-environment-task framework detection by uncommenting/setting to false
+Warbler.framework_detection = false
+
+# Warbler web application assembly configuration file
+Warbler::Config.new do |config|
+ # Features: additional options controlling how the jar is built.
+ # Currently the following features are supported:
+ # - gemjar: package the gem repository in a jar file in WEB-INF/lib
+ # - executable: embed a web server and make the war executable
+ # - compiled: compile .rb files to .class files
+ config.features = %w(executable runnable)
+
+ # Application directories to be included in the webapp.
+ config.dirs = %w(app bin config data db lib log script vendor tmp)
+
+ # Additional files/directories to include, above those in config.dirs
+ # config.includes = FileList["db"]
+
+ # Additional files/directories to exclude
+ config.excludes = FileList["spec", "test", "tmp/**/*", "log/*"]
+
+ # Additional Java .jar files to include. Note that if .jar files are placed
+ # in lib (and not otherwise excluded) then they need not be mentioned here.
+ # JRuby and JRuby-Rack are pre-loaded in this list. Be sure to include your
+ # own versions if you directly set the value
+ # config.java_libs += FileList["lib/java/*.jar"]
+
+ # Loose Java classes and miscellaneous files to be included.
+ # config.java_classes = FileList["target/classes/**.*"]
+
+ # One or more pathmaps defining how the java classes should be copied into
+ # the archive. The example pathmap below accompanies the java_classes
+ # configuration above. See http://rake.rubyforge.org/classes/String.html#M000017
+ # for details of how to specify a pathmap.
+ # config.pathmaps.java_classes << "%{target/classes/,}p"
+
+ # Bundler support is built-in. If Warbler finds a Gemfile in the
+ # project directory, it will be used to collect the gems to bundle
+ # in your application. If you wish to explicitly disable this
+ # functionality, uncomment here.
+ # config.bundler = false
+
+ # An array of Bundler groups to avoid including in the war file.
+ # Defaults to ["development", "test", "assets"].
+ # config.bundle_without = []
+
+ # Other gems to be included. If you don't use Bundler or a gemspec
+ # file, you need to tell Warbler which gems your application needs
+ # so that they can be packaged in the archive.
+ # For Rails applications, the Rails gems are included by default
+ # unless the vendor/rails directory is present.
+ # config.gems += ["activerecord-jdbcmysql-adapter", "jruby-openssl"]
+ # config.gems << "tzinfo"
+
+ # Uncomment this if you don't want to package rails gem.
+ # config.gems -= ["rails"]
+
+ # The most recent versions of gems are used.
+ # You can specify versions of gems by using a hash assignment:
+ # config.gems["rails"] = "2.3.10"
+
+ # You can also use regexps or Gem::Dependency objects for flexibility or
+ # finer-grained control.
+ # config.gems << /^merb-/
+ # config.gems << Gem::Dependency.new("merb-core", "= 0.9.3")
+
+ # Include gem dependencies not mentioned specifically. Default is
+ # true, uncomment to turn off.
+ # config.gem_dependencies = false
+
+ # Array of regular expressions matching relative paths in gems to be
+ # excluded from the war. Defaults to empty, but you can set it like
+ # below, which excludes test files.
+ config.gem_excludes = [/^(test|spec)\//]
+
+ # Pathmaps for controlling how application files are copied into the archive
+ # config.pathmaps.application = ["WEB-INF/%p"]
+
+ # Name of the archive (without the extension). Defaults to the basename
+ # of the project directory.
+ config.jar_name = "squash"
+
+ # Name of the MANIFEST.MF template for the war file. Defaults to a simple
+ # MANIFEST.MF that contains the version of Warbler used to create the war file.
+ # config.manifest_file = "config/MANIFEST.MF"
+
+ # When using the 'compiled' feature and specified, only these Ruby
+ # files will be compiled. Default is to compile all \.rb files in
+ # the application.
+ # config.compiled_ruby_files = FileList['app/**/*.rb']
+
+ # === War files only below here ===
+
+ # Path to the pre-bundled gem directory inside the war file. Default
+ # is 'WEB-INF/gems'. Specify path if gems are already bundled
+ # before running Warbler. This also sets 'gem.path' inside web.xml.
+ # config.gem_path = "WEB-INF/vendor/bundler_gems"
+
+ # Files for WEB-INF directory (next to web.xml). This contains
+ # web.xml by default. If there is an .erb-File it will be processed
+ # with webxml-config. You may want to exclude this file via
+ # config.excludes.
+ # config.webinf_files += FileList["jboss-web.xml"]
+
+ # Files to be included in the root of the webapp. Note that files in public
+ # will have the leading 'public/' part of the path stripped during staging.
+ # config.public_html = FileList["public/**/*", "doc/**/*"]
+
+ # Pathmaps for controlling how public HTML files are copied into the .war
+ # config.pathmaps.public_html = ["%{public/,}p"]
+
+ # Embedded webserver to use with the 'executable' feature. Currently supported
+ # webservers are:
+ # * winstone (default) - Winstone 0.9.10 from sourceforge
+ # * jenkins-ci.winstone - Improved Winstone from Jenkins CI
+ # * jetty - Embedded Jetty from Eclipse
+ config.webserver = 'jetty'
+
+ # Value of RAILS_ENV for the webapp -- default as shown below
+ config.webxml.rails.env = 'production'
+
+ # Application booter to use, one of :rack, :rails, or :merb (autodetected by default)
+ config.webxml.booter = :rails
+
+ # Set JRuby to run in 1.9 mode.
+ config.webxml.jruby.compat.version = "1.9"
+
+ # When using the :rack booter, "Rackup" script to use.
+ # - For 'rackup.path', the value points to the location of the rackup
+ # script in the web archive file. You need to make sure this file
+ # gets included in the war, possibly by adding it to config.includes
+ # or config.webinf_files above.
+ # - For 'rackup', the rackup script you provide as an inline string
+ # is simply embedded in web.xml.
+ # The script is evaluated in a Rack::Builder to load the application.
+ # Examples:
+ # config.webxml.rackup.path = 'WEB-INF/hello.ru'
+ # config.webxml.rackup = %{require './lib/demo'; run Rack::Adapter::Camping.new(Demo)}
+ # config.webxml.rackup = require 'cgi' && CGI::escapeHTML(File.read("config.ru"))
+
+ # Control the pool of Rails runtimes. Leaving unspecified means
+ # the pool will grow as needed to service requests. It is recommended
+ # that you fix these values when running a production server!
+ # If you're using threadsafe! mode, you probably don't want to set these values,
+ # since 1 runtime(default for threadsafe mode) will be enough.
+ config.webxml.jruby.min.runtimes = 1
+ config.webxml.jruby.max.runtimes = 1
+
+ # JNDI data source name
+ # config.webxml.jndi = 'jdbc/rails'
+end
diff --git a/lib/tasks/warbler/warbler.rake b/lib/tasks/warbler/warbler.rake
new file mode 100644
index 00000000..a2df2aab
--- /dev/null
+++ b/lib/tasks/warbler/warbler.rake
@@ -0,0 +1,8 @@
+if RUBY_PLATFORM == "java"
+ desc "Build a WAR file of project using Warbler"
+ task :war => "assets:precompile:all" do
+ require 'warbler'
+ Warbler::Task.new(:warble)
+ Rake::Task["warble"].invoke
+ end
+end