From ce91297ee06301b0ae5ce4e0c994a3fb8644e811 Mon Sep 17 00:00:00 2001 From: Gregory Eremin Date: Fri, 12 Jul 2013 17:40:26 +0700 Subject: [PATCH] Implement assetpack for Sinatra --- .gitignore | 4 +- Gemfile | 7 +- Gemfile.lock | 16 + Rakefile | 4 + app/assets/{stylesheets => css}/dropdown.styl | 0 .../{stylesheets => css}/pastemaster.styl | 4 +- .../css}/pygments_solarized_modified.css | 0 .../{javascripts => js}/dropdown.coffee | 0 .../{javascripts => js}/pastemaster.coffee | 0 app/models/configuration.rb | 2 + app/views/default.slim | 11 +- config/database.yml | 1 - .../initializers/sinatra_assetpack_stylus.rb | 11 + config/syntax.yml | 1 - lib/assets.rb | 21 - pastemaster.rb | 28 +- public/normalize.css | 396 ------------------ 17 files changed, 73 insertions(+), 433 deletions(-) create mode 100644 Rakefile rename app/assets/{stylesheets => css}/dropdown.styl (100%) rename app/assets/{stylesheets => css}/pastemaster.styl (100%) rename {public => app/assets/css}/pygments_solarized_modified.css (100%) rename app/assets/{javascripts => js}/dropdown.coffee (100%) rename app/assets/{javascripts => js}/pastemaster.coffee (100%) delete mode 120000 config/database.yml create mode 100644 config/initializers/sinatra_assetpack_stylus.rb delete mode 120000 config/syntax.yml delete mode 100644 lib/assets.rb delete mode 100644 public/normalize.css diff --git a/.gitignore b/.gitignore index 55fa745..36248e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -app/config.rb +config/database.yml +config/syntax.yml +public/assets diff --git a/Gemfile b/Gemfile index 48628ce..8fa01cd 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,7 @@ source 'https://rubygems.org' gem 'sinatra' gem 'shotgun' gem 'unicorn' +gem 'rake' # Database gem 'sequel' @@ -19,7 +20,11 @@ gem 'pygments.rb' gem 'execjs' gem 'therubyracer' -# Sugar +# Assets & Sugar +gem 'sinatra-assetpack' gem 'coffee-script' gem 'slim' gem 'stylus' + +# Deployment +gem 'mina' diff --git a/Gemfile.lock b/Gemfile.lock index c6b05c5..d77bfce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,9 +8,14 @@ GEM encryptor (1.1.3) execjs (1.4.0) multi_json (~> 1.0) + jsmin (1.0.1) kgio (2.8.0) libv8 (3.11.8.17) + mina (0.3.0) + open4 + rake multi_json (1.7.7) + open4 (1.3.0) pg (0.15.1) posix-spawn (0.3.6) pygments.rb (0.5.1) @@ -19,7 +24,10 @@ GEM rack (1.5.2) rack-protection (1.5.0) rack + rack-test (0.6.2) + rack (>= 1.0) raindrops (0.11.0) + rake (10.1.0) ref (1.0.5) sequel (4.0.0) shotgun (0.9) @@ -28,6 +36,11 @@ GEM rack (~> 1.4) rack-protection (~> 1.4) tilt (~> 1.3, >= 1.3.4) + sinatra-assetpack (0.2.8) + jsmin + rack-test + sinatra + tilt (>= 1.3.0) slim (2.0.0) temple (~> 0.6.5) tilt (~> 1.3, >= 1.3.3) @@ -53,11 +66,14 @@ DEPENDENCIES coffee-script encryptor execjs + mina pg pygments.rb + rake sequel shotgun sinatra + sinatra-assetpack slim stylus therubyracer diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..d07427e --- /dev/null +++ b/Rakefile @@ -0,0 +1,4 @@ +APP_FILE = 'pastemaster.rb' +APP_CLASS = 'Pastemaster' + +require 'sinatra/assetpack/rake' diff --git a/app/assets/stylesheets/dropdown.styl b/app/assets/css/dropdown.styl similarity index 100% rename from app/assets/stylesheets/dropdown.styl rename to app/assets/css/dropdown.styl diff --git a/app/assets/stylesheets/pastemaster.styl b/app/assets/css/pastemaster.styl similarity index 100% rename from app/assets/stylesheets/pastemaster.styl rename to app/assets/css/pastemaster.styl index 68a6161..7307401 100644 --- a/app/assets/stylesheets/pastemaster.styl +++ b/app/assets/css/pastemaster.styl @@ -84,10 +84,10 @@ textarea form input[type="submit"], form a[role="submit"] float right - -form a[role="submit"] width 5em font-weight 600 text-align center margin .4em 0 + +form a[role="submit"] display none diff --git a/public/pygments_solarized_modified.css b/app/assets/css/pygments_solarized_modified.css similarity index 100% rename from public/pygments_solarized_modified.css rename to app/assets/css/pygments_solarized_modified.css diff --git a/app/assets/javascripts/dropdown.coffee b/app/assets/js/dropdown.coffee similarity index 100% rename from app/assets/javascripts/dropdown.coffee rename to app/assets/js/dropdown.coffee diff --git a/app/assets/javascripts/pastemaster.coffee b/app/assets/js/pastemaster.coffee similarity index 100% rename from app/assets/javascripts/pastemaster.coffee rename to app/assets/js/pastemaster.coffee diff --git a/app/models/configuration.rb b/app/models/configuration.rb index 5048c53..17bef4e 100644 --- a/app/models/configuration.rb +++ b/app/models/configuration.rb @@ -8,6 +8,8 @@ class Configuration load_syntax_config end + private + def load_database_config config = YAML.load_file(APP_ROOT.join('config', 'database.yml')) @database_url = '%s://%s:%s@%s:%s/%s' % [ diff --git a/app/views/default.slim b/app/views/default.slim index f5fe7b8..fac3856 100644 --- a/app/views/default.slim +++ b/app/views/default.slim @@ -2,16 +2,13 @@ doctype html html head title Pastemaster - link rel="stylesheet" href="/normalize.css?v2.1.2" - link rel="stylesheet" href="/assets/pastemaster.css?r1" - link rel="stylesheet" href="/assets/dropdown.css?r1" - link rel="stylesheet" href="/pygments_solarized_modified.css?r1" + link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/normalize/2.1.0/normalize.css" + == css :application body a href="/" h1 strong Paste | master .container== yield - script type="text/javascript" src="http://code.jquery.com/jquery-2.0.3.min.js" - script type="text/javascript" src="/assets/pastemaster.js?r1" - script type="text/javascript" src="/assets/dropdown.js?r1" + script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js" + == js :application diff --git a/config/database.yml b/config/database.yml deleted file mode 120000 index f227519..0000000 --- a/config/database.yml +++ /dev/null @@ -1 +0,0 @@ -examples/database.yml \ No newline at end of file diff --git a/config/initializers/sinatra_assetpack_stylus.rb b/config/initializers/sinatra_assetpack_stylus.rb new file mode 100644 index 0000000..d20bb71 --- /dev/null +++ b/config/initializers/sinatra_assetpack_stylus.rb @@ -0,0 +1,11 @@ +module Sinatra::AssetPack + class StylusEngine < Engine + def css(str, options={}) + Tilt.new("stylus", {:style => :compressed}) { str }.render + rescue LoadError + nil + end + end + + Compressor.register :css, :stylus, StylusEngine +end diff --git a/config/syntax.yml b/config/syntax.yml deleted file mode 120000 index 1e31d3f..0000000 --- a/config/syntax.yml +++ /dev/null @@ -1 +0,0 @@ -examples/syntax.yml \ No newline at end of file diff --git a/lib/assets.rb b/lib/assets.rb deleted file mode 100644 index 3c95564..0000000 --- a/lib/assets.rb +++ /dev/null @@ -1,21 +0,0 @@ -class CoffeeAssets < Sinatra::Base - set :views, File.expand_path('../../app/assets/javascripts', __FILE__) - - get '/assets/:name.js' do - path = "#{settings.views}/#{params[:name]}.coffee" - return not_found unless File.exists?(path) - - coffee params[:name].to_sym - end -end - -class StylusAssets < Sinatra::Base - set :views, File.expand_path('../../app/assets/stylesheets', __FILE__) - - get '/assets/:name.css' do - path = "#{settings.views}/#{params[:name]}.styl" - return not_found unless File.exists?(path) - - stylus params[:name].to_sym - end -end diff --git a/pastemaster.rb b/pastemaster.rb index e5bdad4..13b26da 100644 --- a/pastemaster.rb +++ b/pastemaster.rb @@ -6,6 +6,7 @@ require 'yaml' require 'bundler/setup' require 'sinatra' +require 'sinatra/assetpack' require 'sequel' require 'encryptor' require 'slim' @@ -18,20 +19,39 @@ require 'app/models/configuration' require 'app/models/paste' require 'config/initializers/configuration' require 'config/initializers/database' +require 'config/initializers/sinatra_assetpack_stylus' require 'lib/error_pages' -require 'lib/assets' class Pastemaster < Sinatra::Application + set :root, File.dirname(__FILE__) set :server, 'unicorn' set :public_folder, 'public' set :views, File.expand_path('../app/views', __FILE__) + register Sinatra::AssetPack + + assets do + serve '/assets/js', from: 'app/assets/js' + serve '/assets/css', from: 'app/assets/css' + + css :application, '/assets/css/application.css', [ + '/assets/css/pastemaster.css', + '/assets/css/dropdown.css', + '/assets/css/pygments_solarized_modified.css' + ] + js :application, '/assets/js/application.js', [ + '/assets/js/pastemaster.js', + '/assets/js/dropdown.js' + ] + + js_compression :jsmin + css_compression :simple + end + set :slim, pretty: true use ErrorPages helpers ErrorPages::Forbidden - use CoffeeAssets - use StylusAssets get '/' do @syntaxes = CONFIG.syntaxes_map @@ -40,6 +60,8 @@ class Pastemaster < Sinatra::Application end post '/' do + redirect '/' if params[:contents].nil? || params[:contents].strip.empty? + paste = Paste.new(params[:contents], params[:syntax]) id = paste.save diff --git a/public/normalize.css b/public/normalize.css deleted file mode 100644 index 6adf56e..0000000 --- a/public/normalize.css +++ /dev/null @@ -1,396 +0,0 @@ -/*! normalize.css v2.1.2 | MIT License | git.io/normalize */ - -/* ========================================================================== - HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined in IE 8/9. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} - -/** - * Correct `inline-block` display not defined in IE 8/9. - */ - -audio, -canvas, -video { - display: inline-block; -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -[hidden] { - display: none; -} - -/* ========================================================================== - Base - ========================================================================== */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* ========================================================================== - Links - ========================================================================== */ - -/** - * Address `outline` inconsistency between Chrome and other browsers. - */ - -a:focus { - outline: thin dotted; -} - -/** - * Improve readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* ========================================================================== - Typography - ========================================================================== */ - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari 5, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9, Safari 5, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari 5 and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Correct font family set oddly in Safari 5 and Chrome. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -/** - * Improve readability of pre-formatted text in all browsers. - */ - -pre { - white-space: pre-wrap; -} - -/** - * Set consistent quote types. - */ - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* ========================================================================== - Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9. - */ - -img { - border: 0; -} - -/** - * Correct overflow displayed oddly in IE 9. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* ========================================================================== - Figures - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari 5. - */ - -figure { - margin: 0; -} - -/* ========================================================================== - Forms - ========================================================================== */ - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * 1. Correct font family not being inherited in all browsers. - * 2. Correct font size not being inherited in all browsers. - * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. - */ - -button, -input, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -button, -input { - line-height: normal; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. - * Correct `select` style inheritance in Firefox 4+ and Opera. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * 1. Address box sizing set to `content-box` in IE 8/9. - * 2. Remove excess padding in IE 8/9. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/** - * Remove inner padding and search cancel button in Safari 5 and Chrome - * on OS X. - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * 1. Remove default vertical scrollbar in IE 8/9. - * 2. Improve readability and alignment in all browsers. - */ - -textarea { - overflow: auto; /* 1 */ - vertical-align: top; /* 2 */ -} - -/* ========================================================================== - Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -}