jammit-sinatra 0.6.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2011 Jacques Crocker
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # Jammit Sinatra
2
+
3
+ ## Introduction
4
+
5
+ Jammit-Sinatra is a jammit wrapper that allows Jammit to work properly in Sinatra/Padrino web apps.
6
+
7
+ It includes middleware and fixed up view helpers (`include_javascripts` and `include_stylesheets`).
8
+
9
+ ## Installation
10
+
11
+ To install jammit-sinatra, just use:
12
+
13
+ gem install jammit-sinatra
14
+
15
+ If you are using bundler, add it to your project's `Gemfile`:
16
+
17
+ gem 'jammit-sinatra'
18
+
19
+
20
+ ## With Sinatra
21
+
22
+ In your app code, you'll need to register Jammit:
23
+
24
+ register Jammit
25
+
26
+ You'll also need to load the jammit configuration file. So in your configure block, run:
27
+
28
+ ::RAILS_ENV = "development" # this is needed to work around a Jammit limitation
29
+ Jammit.load_configuration("/path/to/config/assets.yml")
30
+
31
+ In order to use the `include_javascripts` and `include_stylesheets` you'll need to have working implemetnations of javascript_include_tag and stylesheets_include_tag. You can easily pull these helpers into your existing Sinatra app from Padrino. See instructions [here](http://www.padrinorb.com/guides/standalone-usage-in-sinatra).
32
+
33
+ ## With Padrino
34
+
35
+ padrino-gen plugin jammit
@@ -0,0 +1,23 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'jammit-sinatra'
3
+ s.version = '0.6.0.1'
4
+
5
+ s.homepage = "http://documentcloud.github.com/jammit/"
6
+ s.summary = "Industrial Strength Asset Packaging for Sinatra/Padrino"
7
+ s.description = <<-EOS
8
+ Jammit is an industrial strength asset packaging library for Sinatra/Padrino,
9
+ providing both the CSS and JavaScript concatenation and compression that
10
+ you'd expect, as well as YUI Compressor and Closure Compiler compatibility,
11
+ ahead-of-time gzipping, built-in JavaScript template support, and optional
12
+ Data-URI / MHTML image embedding.
13
+ EOS
14
+
15
+ s.authors = ['Jacques Crocker']
16
+ s.email = 'railsjedi@gmail.com'
17
+
18
+ s.require_paths = ['lib']
19
+
20
+ s.add_dependency 'jammit', '>= 0.6.0'
21
+
22
+ s.files = Dir['lib/**/*', 'jammit-sinatra.gemspec', 'LICENSE', 'README.md']
23
+ end
@@ -0,0 +1,114 @@
1
+ module Jammit
2
+
3
+ # Rack Middle that allows Jammit to integrate with any Rack compatible web
4
+ # framework. It takes responsibility for /assets, and dynamically packages
5
+ # any missing or uncached asset packages.
6
+
7
+ class Middleware
8
+
9
+ VALID_FORMATS = [:css, :js]
10
+
11
+ SUFFIX_STRIPPER = /-(datauri|mhtml)\Z/
12
+
13
+ NOT_FOUND_PATH = "#{PUBLIC_ROOT}/404.html"
14
+
15
+ def initialize(app)
16
+ @app = app
17
+ end
18
+
19
+ def call(env)
20
+ dup._call(env)
21
+ end
22
+
23
+ def _call(env)
24
+ if matches = %r(^/#{Jammit.package_path}/(.*)\.(.*)).match(env['PATH_INFO'])
25
+ package(matches[1].to_s, matches[2] || "none")
26
+ else
27
+ @app.call(env)
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ # The "package" action receives all requests for asset packages that haven't
34
+ # yet been cached. The package will be built, cached, and gzipped.
35
+ def package(package, extension)
36
+ parse_request(package, extension)
37
+ template_ext = Jammit.template_extension.to_sym
38
+ result = []
39
+
40
+ headers = {
41
+ 'Cache-Control' => "public, max-age=#{(60*60*24*365.25*10).to_i}",
42
+ 'Expires' => (Time.now + 60*60*24*365.25*10).httpdate
43
+ }
44
+
45
+ case @extension
46
+ when :js
47
+ @contents = Jammit.packager.pack_javascripts(@package)
48
+ @contents = @contents.to_js if @contents.respond_to?(:to_js)
49
+ result = [
50
+ 200,
51
+ headers.merge({
52
+ 'Content-Type' => Rack::Mime.mime_type(".js")
53
+ }),
54
+ [@contents]
55
+ ]
56
+ when template_ext
57
+ @contents = Jammit.packager.pack_templates(@package)
58
+ @contents = @contents.to_js if @contents.respond_to?(:to_js)
59
+ [
60
+ 200,
61
+ headers.merge({
62
+ 'Content-Type' => Rack::Mime.mime_type(".js")
63
+ }),
64
+ [@contents]
65
+ ]
66
+ when :css
67
+ [
68
+ 200,
69
+ headers.merge({
70
+ 'Content-Type' => Rack::Mime.mime_type(".css")
71
+ }),
72
+ [generate_stylesheets]
73
+ ]
74
+ end
75
+ rescue Jammit::PackageNotFound
76
+ [404, {'Content-Type' => 'text/plain'}, ['Not found']]
77
+ end
78
+
79
+ # Generate the complete, timestamped, MHTML url -- if we're rendering a
80
+ # dynamic MHTML package, we'll need to put one URL in the response, and a
81
+ # different one into the cached package.
82
+ def prefix_url(path)
83
+ host = request.port == 80 ? request.host : request.host_with_port
84
+ "#{request.protocol}#{host}#{path}"
85
+ end
86
+
87
+ # If we're generating MHTML/CSS, return a stylesheet with the absolute
88
+ # request URL to the client, and cache a version with the timestamped cache
89
+ # URL swapped in.
90
+ def generate_stylesheets
91
+ return @contents = Jammit.packager.pack_stylesheets(@package, @variant) unless @variant == :mhtml
92
+ @mtime = Time.now
93
+ request_url = prefix_url(request.fullpath)
94
+ cached_url = prefix_url(Jammit.asset_url(@package, @extension, @variant, @mtime))
95
+ css = Jammit.packager.pack_stylesheets(@package, @variant, request_url)
96
+ # @contents = css.gsub(request_url, cached_url) if perform_caching
97
+ css
98
+ end
99
+
100
+ # Extracts the package name, extension (:css, :js), and variant (:datauri,
101
+ # :mhtml) from the incoming URL.
102
+ def parse_request(pack, extension)
103
+ @extension = extension.to_sym
104
+ raise PackageNotFound unless (VALID_FORMATS + [Jammit.template_extension.to_sym]).include?(@extension)
105
+ if Jammit.embed_assets
106
+ suffix_match = pack.match(SUFFIX_STRIPPER)
107
+ @variant = Jammit.embed_assets && suffix_match && suffix_match[1].to_sym
108
+ pack.sub!(SUFFIX_STRIPPER, '')
109
+ end
110
+ @package = pack.to_sym
111
+ end
112
+
113
+ end
114
+ end
@@ -0,0 +1,35 @@
1
+ require 'jammit'
2
+ require 'jammit/middleware'
3
+
4
+ # allows use to include jammit/helper without exploding
5
+ module ActionView
6
+ class Base
7
+ end
8
+ end
9
+ require 'jammit/helper'
10
+
11
+ module Jammit::HelperOverrides
12
+ def javascript_include_tag(*sources)
13
+ super(*sources.flatten)
14
+ end
15
+
16
+ def stylesheet_link_tag(*sources)
17
+ super(*sources.flatten)
18
+ end
19
+ end
20
+
21
+ # provides hook so you can run
22
+ # register Jammit in your
23
+ module Jammit
24
+ def self.registered(app)
25
+ app.helpers Jammit::Helper
26
+ app.helpers Jammit::HelperOverrides
27
+
28
+ app.use Jammit::Middleware
29
+
30
+ # reload assets after every request (on development only)
31
+ if app.development?
32
+ app.before { Jammit.reload! }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1 @@
1
+ require 'jammit/sinatra'
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jammit-sinatra
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.6.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Jacques Crocker
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-04-10 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: jammit
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.6.0
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *id001
27
+ description: " Jammit is an industrial strength asset packaging library for Sinatra/Padrino,\n providing both the CSS and JavaScript concatenation and compression that\n you'd expect, as well as YUI Compressor and Closure Compiler compatibility,\n ahead-of-time gzipping, built-in JavaScript template support, and optional\n Data-URI / MHTML image embedding.\n"
28
+ email: railsjedi@gmail.com
29
+ executables: []
30
+
31
+ extensions: []
32
+
33
+ extra_rdoc_files: []
34
+
35
+ files:
36
+ - lib/jammit/middleware.rb
37
+ - lib/jammit/sinatra.rb
38
+ - lib/jammit-sinatra.rb
39
+ - jammit-sinatra.gemspec
40
+ - LICENSE
41
+ - README.md
42
+ has_rdoc: true
43
+ homepage: http://documentcloud.github.com/jammit/
44
+ licenses: []
45
+
46
+ post_install_message:
47
+ rdoc_options: []
48
+
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: -3190729303344462550
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ hash: -3190729303344462550
66
+ segments:
67
+ - 0
68
+ version: "0"
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.6.2
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Industrial Strength Asset Packaging for Sinatra/Padrino
76
+ test_files: []
77
+