sinatra-bundles 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/LICENSE +1 -1
- data/README.md +72 -0
- data/Rakefile +4 -1
- data/VERSION +1 -1
- data/lib/sinatra/bundles.rb +62 -0
- data/sinatra-bundles.gemspec +130 -0
- metadata +12 -2
- data/lib/sinatra-bundles.rb +0 -0
data/.gitignore
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,78 @@ sinatra-bundles
|
|
3
3
|
|
4
4
|
An easy way to bundle CSS and Javascript assets in your sinatra application.
|
5
5
|
|
6
|
+
* Tests: [http://runcoderun.com/darkhelmet/sinatra-bundles](http://runcoderun.com/darkhelmet/sinatra-bundles)
|
7
|
+
|
8
|
+
Usage
|
9
|
+
-----
|
10
|
+
|
11
|
+
sinatra-bundles combines Javascript and CSS into one file. Meaning, you can bundle 2 or more Javascript files into one, similar with CSS stylesheets. Any bundled files are expected to be in the public directory, under 'javascripts' and 'stylesheets'
|
12
|
+
|
13
|
+
Assuming you have the following files in public:
|
14
|
+
|
15
|
+
./stylesheets/reset.css
|
16
|
+
./stylesheets/fonts.css
|
17
|
+
./stylesheets/grid.css
|
18
|
+
./javascripts/jquery.js
|
19
|
+
./javascripts/lightbox.js
|
20
|
+
./javascripts/blog.js
|
21
|
+
|
22
|
+
You can bundle these files in your app like this:
|
23
|
+
|
24
|
+
require 'sinatra'
|
25
|
+
require 'sinatra/bundles'
|
26
|
+
|
27
|
+
stylesheet_bundle(:all, %w(reset fonts grid))
|
28
|
+
javascript_bundle(:all, %w(jquery lightbox blog))
|
29
|
+
|
30
|
+
get '/' do
|
31
|
+
'sinatra-bundles rocks!'
|
32
|
+
end
|
33
|
+
|
34
|
+
Then in your view, you can use the view helpers to insert the proper script tags:
|
35
|
+
|
36
|
+
= javascript_bundle_include_tag(:all)
|
37
|
+
= stylesheet_bundle_link_tag(:all)
|
38
|
+
|
39
|
+
All 6 of those files will be served up in 2 files, and they'll be compressed and have headers set for caching.
|
40
|
+
|
41
|
+
Configuration
|
42
|
+
-------------
|
43
|
+
|
44
|
+
The defaults are pretty good. In development/test mode:
|
45
|
+
|
46
|
+
bundle_cache_time # => 60 * 60 * 24 * 365, or 1 year
|
47
|
+
compress_bundles # => false
|
48
|
+
cache_bundles # => false
|
49
|
+
stamp_bundles # => true
|
50
|
+
|
51
|
+
And in production mode, compression and caching is enabled
|
52
|
+
|
53
|
+
compress_bundles # => true
|
54
|
+
cache_bundles # => true
|
55
|
+
|
56
|
+
To change any of these, use set/enable/disable
|
57
|
+
|
58
|
+
require 'sinatra'
|
59
|
+
require 'sinatra/bundles'
|
60
|
+
|
61
|
+
stylesheet_bundle(:all, %w(reset fonts grid))
|
62
|
+
javascript_bundle(:all, %w(jquery lightbox blog))
|
63
|
+
|
64
|
+
disable(:compress_bundles)
|
65
|
+
enable(:cache_bundles)
|
66
|
+
set(:bundle_cache_time, 60 * 60 * 24)
|
67
|
+
disable(:stamp_bundles)
|
68
|
+
|
69
|
+
get '/' do
|
70
|
+
'sinatra-bundles rocks!'
|
71
|
+
end
|
72
|
+
|
73
|
+
Examples
|
74
|
+
--------
|
75
|
+
|
76
|
+
Check out the code for my blog for a real example: [darkblog on github](http://github.com/darkhelmet/darkblog)
|
77
|
+
|
6
78
|
Note on Patches/Pull Requests
|
7
79
|
-----------------------------
|
8
80
|
|
data/Rakefile
CHANGED
@@ -13,6 +13,7 @@ begin
|
|
13
13
|
gem.add_dependency 'rainpress', '>= 0'
|
14
14
|
gem.add_dependency 'packr', '>= 0'
|
15
15
|
gem.add_development_dependency 'rspec', '>= 1.2.9'
|
16
|
+
gem.add_development_dependency 'rack-test', '>= 0.5.3'
|
16
17
|
gem.add_development_dependency 'yard', '>= 0'
|
17
18
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
18
19
|
end
|
@@ -39,7 +40,9 @@ task :default => :spec
|
|
39
40
|
|
40
41
|
begin
|
41
42
|
require 'yard'
|
42
|
-
YARD::Rake::YardocTask.new
|
43
|
+
YARD::Rake::YardocTask.new do |t|
|
44
|
+
t.files = ['lib/**/*.rb']
|
45
|
+
end
|
43
46
|
rescue LoadError
|
44
47
|
task :yardoc do
|
45
48
|
abort 'YARD is not available. In order to run yardoc, you must: sudo gem install yard'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/sinatra/bundles.rb
CHANGED
@@ -2,23 +2,34 @@ require 'rainpress'
|
|
2
2
|
require 'packr'
|
3
3
|
|
4
4
|
module Sinatra
|
5
|
+
# Main Bundles Module
|
5
6
|
module Bundles
|
7
|
+
# The base class for a bundle of files.
|
8
|
+
# The developer user sinatra-bundles should
|
9
|
+
# never have to deal with this directly
|
6
10
|
class Bundle
|
7
11
|
def initialize(app, files)
|
8
12
|
@app = app
|
9
13
|
@files = files
|
10
14
|
end
|
11
15
|
|
16
|
+
# Since we pass Bundles back as the body,
|
17
|
+
# this follows Rack standards and supports an each method
|
18
|
+
# to yield parts of the body, in our case, the files.
|
12
19
|
def each
|
13
20
|
@files.each do |f|
|
14
21
|
content = File.read(path(f))
|
15
22
|
content = compress(content) if @app.compress_bundles
|
23
|
+
# Include a new line to prevent weirdness at file boundaries
|
16
24
|
yield("#{content}\n")
|
17
25
|
end
|
18
26
|
end
|
19
27
|
|
20
28
|
private
|
21
29
|
|
30
|
+
# The timestamp of the bundle, which is the newest file in the bundle.
|
31
|
+
#
|
32
|
+
# @return [Integer] The timestamp of the bundle
|
22
33
|
def stamp
|
23
34
|
@files.map do |f|
|
24
35
|
File.mtime(path(f))
|
@@ -26,64 +37,115 @@ module Sinatra
|
|
26
37
|
end
|
27
38
|
end
|
28
39
|
|
40
|
+
# Bundle for stylesheets
|
29
41
|
class StylesheetBundle < Bundle
|
42
|
+
# Generate the HTML tag for the stylesheet
|
43
|
+
#
|
44
|
+
# @param [String] name The name of a bundle
|
45
|
+
# @return [String] The HTML that can be inserted into the doc
|
30
46
|
def to_html(name)
|
31
47
|
"<link type='text/css' href='/stylesheets/bundle_#{name}.css#{@app.stamp_bundles ? "?#{stamp}" : ''}' rel='stylesheet' media='screen' />"
|
32
48
|
end
|
33
49
|
|
34
50
|
protected
|
35
51
|
|
52
|
+
# Compress CSS
|
53
|
+
#
|
54
|
+
# @param [String] css The CSS to compress
|
55
|
+
# @return [String] Compressed CSS
|
36
56
|
def compress(css)
|
37
57
|
Rainpress.compress(css)
|
38
58
|
end
|
39
59
|
|
60
|
+
# Get the path of the file on disk
|
61
|
+
#
|
62
|
+
# @param [String] filename The name of sheet,
|
63
|
+
# assumed to be in the public directory, under 'stylesheets'
|
64
|
+
# @return [String] The full path to the file
|
40
65
|
def path(filename)
|
41
66
|
File.join(@app.public, 'stylesheets', "#{filename}.css")
|
42
67
|
end
|
43
68
|
end
|
44
69
|
|
70
|
+
# Bundle for javascripts
|
45
71
|
class JavascriptBundle < Bundle
|
72
|
+
# Generate the HTML tag for the script file
|
73
|
+
#
|
74
|
+
# @param [String] name The name of a bundle
|
75
|
+
# @return [String] The HTML that can be inserted into the doc
|
46
76
|
def to_html(name)
|
47
77
|
"<script type='text/javascript' src='/javascripts/bundle_#{name}.js#{@app.stamp_bundles ? "?#{stamp}" : ''}'></script>"
|
48
78
|
end
|
49
79
|
|
50
80
|
protected
|
51
81
|
|
82
|
+
# Compress Javascript
|
83
|
+
#
|
84
|
+
# @param [String] js The Javascript to compress
|
85
|
+
# @return [String] Compressed Javascript
|
52
86
|
def compress(js)
|
53
87
|
Packr.pack(js, :shrink_vars => true)
|
54
88
|
end
|
55
89
|
|
90
|
+
# Get the path of the file on disk
|
91
|
+
#
|
92
|
+
# @param [String] filename The name of sheet,
|
93
|
+
# assumed to be in the public directory, under 'javascripts'
|
94
|
+
# @return [String] The full path to the file
|
56
95
|
def path(filename)
|
57
96
|
File.join(@app.public, 'javascripts', "#{filename}.js")
|
58
97
|
end
|
59
98
|
end
|
60
99
|
|
100
|
+
# View helpers
|
61
101
|
module Helpers
|
102
|
+
# Emit a script tag for a javascript bundle
|
103
|
+
#
|
104
|
+
# @param [Symbol,String] bundle The bundle name
|
105
|
+
# @return [String] HTML script tag
|
62
106
|
def javascript_bundle_include_tag(bundle)
|
63
107
|
options.javascript_bundles[bundle].to_html(bundle)
|
64
108
|
end
|
65
109
|
|
110
|
+
# Emit a script tag for a stylesheet bundle
|
111
|
+
#
|
112
|
+
# @param [Symbol,String] bundle The bundle name
|
113
|
+
# @return [String] HTML link tag
|
66
114
|
def stylesheet_bundle_link_tag(bundle)
|
67
115
|
options.stylesheet_bundles[bundle].to_html(bundle)
|
68
116
|
end
|
69
117
|
end
|
70
118
|
|
119
|
+
# Set a Javascript bundle
|
120
|
+
# javascript_bundle(:all, %w(jquery lightbox))
|
121
|
+
# @param [Symbol,String] key The bundle name
|
122
|
+
# @param [Array(String)] files The list of filenames, without extension,
|
123
|
+
# assumed to be in the public directory, under 'javascripts'
|
71
124
|
def javascript_bundle(key, files)
|
72
125
|
javascript_bundles[key] = JavascriptBundle.new(self, files)
|
73
126
|
end
|
74
127
|
|
128
|
+
# Set a CSS bundle
|
129
|
+
# stylesheet_bundle(:all, %w(reset grid fonts))
|
130
|
+
# @param [Symbol,String] key The bundle name
|
131
|
+
# @param [Array(String)] files The list of filenames, without extension,
|
132
|
+
# assumed to be in the public directory, under 'stylesheets'
|
75
133
|
def stylesheet_bundle(key, files)
|
76
134
|
stylesheet_bundles[key] = StylesheetBundle.new(self, files)
|
77
135
|
end
|
78
136
|
|
79
137
|
def self.registered(app)
|
138
|
+
# Setup empty bundle containers
|
80
139
|
app.set(:javascript_bundles, {})
|
81
140
|
app.set(:stylesheet_bundles, {})
|
141
|
+
|
142
|
+
# Setup defaults
|
82
143
|
app.set(:bundle_cache_time, 60 * 60 * 24 * 365)
|
83
144
|
app.disable(:compress_bundles)
|
84
145
|
app.disable(:cache_bundles)
|
85
146
|
app.enable(:stamp_bundles)
|
86
147
|
|
148
|
+
# Production defaults
|
87
149
|
app.configure :production do
|
88
150
|
app.enable(:compress_bundles)
|
89
151
|
app.enable(:cache_bundles)
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{sinatra-bundles}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Daniel Huckstep"]
|
12
|
+
s.date = %q{2010-01-12}
|
13
|
+
s.description = %q{Bundle CSS and Javascript assets to a single file, compress, and cache them for snappier web experiences.}
|
14
|
+
s.email = %q{darkhelmet@darkhelmetlive.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.md"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.md",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"lib/sinatra/bundles.rb",
|
27
|
+
"sinatra-bundles.gemspec",
|
28
|
+
"spec/app.rb",
|
29
|
+
"spec/production_app.rb",
|
30
|
+
"spec/public/javascripts/test1.js",
|
31
|
+
"spec/public/javascripts/test2.js",
|
32
|
+
"spec/public/stylesheets/test1.css",
|
33
|
+
"spec/public/stylesheets/test2.css",
|
34
|
+
"spec/sinatra-bundles_spec.rb",
|
35
|
+
"spec/spec.opts",
|
36
|
+
"spec/spec_helper.rb",
|
37
|
+
"vendor/cache/sinatra-0.10.1.gem",
|
38
|
+
"vendor/gems/sinatra-0.10.1/AUTHORS",
|
39
|
+
"vendor/gems/sinatra-0.10.1/CHANGES",
|
40
|
+
"vendor/gems/sinatra-0.10.1/LICENSE",
|
41
|
+
"vendor/gems/sinatra-0.10.1/README.jp.rdoc",
|
42
|
+
"vendor/gems/sinatra-0.10.1/README.rdoc",
|
43
|
+
"vendor/gems/sinatra-0.10.1/Rakefile",
|
44
|
+
"vendor/gems/sinatra-0.10.1/lib/sinatra.rb",
|
45
|
+
"vendor/gems/sinatra-0.10.1/lib/sinatra/base.rb",
|
46
|
+
"vendor/gems/sinatra-0.10.1/lib/sinatra/images/404.png",
|
47
|
+
"vendor/gems/sinatra-0.10.1/lib/sinatra/images/500.png",
|
48
|
+
"vendor/gems/sinatra-0.10.1/lib/sinatra/main.rb",
|
49
|
+
"vendor/gems/sinatra-0.10.1/lib/sinatra/showexceptions.rb",
|
50
|
+
"vendor/gems/sinatra-0.10.1/lib/sinatra/tilt.rb",
|
51
|
+
"vendor/gems/sinatra-0.10.1/sinatra.gemspec",
|
52
|
+
"vendor/gems/sinatra-0.10.1/test/base_test.rb",
|
53
|
+
"vendor/gems/sinatra-0.10.1/test/builder_test.rb",
|
54
|
+
"vendor/gems/sinatra-0.10.1/test/contest.rb",
|
55
|
+
"vendor/gems/sinatra-0.10.1/test/erb_test.rb",
|
56
|
+
"vendor/gems/sinatra-0.10.1/test/erubis_test.rb",
|
57
|
+
"vendor/gems/sinatra-0.10.1/test/extensions_test.rb",
|
58
|
+
"vendor/gems/sinatra-0.10.1/test/filter_test.rb",
|
59
|
+
"vendor/gems/sinatra-0.10.1/test/haml_test.rb",
|
60
|
+
"vendor/gems/sinatra-0.10.1/test/helper.rb",
|
61
|
+
"vendor/gems/sinatra-0.10.1/test/helpers_test.rb",
|
62
|
+
"vendor/gems/sinatra-0.10.1/test/mapped_error_test.rb",
|
63
|
+
"vendor/gems/sinatra-0.10.1/test/middleware_test.rb",
|
64
|
+
"vendor/gems/sinatra-0.10.1/test/request_test.rb",
|
65
|
+
"vendor/gems/sinatra-0.10.1/test/response_test.rb",
|
66
|
+
"vendor/gems/sinatra-0.10.1/test/result_test.rb",
|
67
|
+
"vendor/gems/sinatra-0.10.1/test/route_added_hook_test.rb",
|
68
|
+
"vendor/gems/sinatra-0.10.1/test/routing_test.rb",
|
69
|
+
"vendor/gems/sinatra-0.10.1/test/sass_test.rb",
|
70
|
+
"vendor/gems/sinatra-0.10.1/test/server_test.rb",
|
71
|
+
"vendor/gems/sinatra-0.10.1/test/sinatra_test.rb",
|
72
|
+
"vendor/gems/sinatra-0.10.1/test/static_test.rb",
|
73
|
+
"vendor/gems/sinatra-0.10.1/test/templates_test.rb",
|
74
|
+
"vendor/gems/sinatra-0.10.1/test/views/error.builder",
|
75
|
+
"vendor/gems/sinatra-0.10.1/test/views/error.erb",
|
76
|
+
"vendor/gems/sinatra-0.10.1/test/views/error.erubis",
|
77
|
+
"vendor/gems/sinatra-0.10.1/test/views/error.haml",
|
78
|
+
"vendor/gems/sinatra-0.10.1/test/views/error.sass",
|
79
|
+
"vendor/gems/sinatra-0.10.1/test/views/foo/hello.test",
|
80
|
+
"vendor/gems/sinatra-0.10.1/test/views/hello.builder",
|
81
|
+
"vendor/gems/sinatra-0.10.1/test/views/hello.erb",
|
82
|
+
"vendor/gems/sinatra-0.10.1/test/views/hello.erubis",
|
83
|
+
"vendor/gems/sinatra-0.10.1/test/views/hello.haml",
|
84
|
+
"vendor/gems/sinatra-0.10.1/test/views/hello.sass",
|
85
|
+
"vendor/gems/sinatra-0.10.1/test/views/hello.test",
|
86
|
+
"vendor/gems/sinatra-0.10.1/test/views/layout2.builder",
|
87
|
+
"vendor/gems/sinatra-0.10.1/test/views/layout2.erb",
|
88
|
+
"vendor/gems/sinatra-0.10.1/test/views/layout2.erubis",
|
89
|
+
"vendor/gems/sinatra-0.10.1/test/views/layout2.haml",
|
90
|
+
"vendor/gems/sinatra-0.10.1/test/views/layout2.test",
|
91
|
+
"vendor/specifications/sinatra-0.10.1.gemspec"
|
92
|
+
]
|
93
|
+
s.homepage = %q{http://github.com/darkhelmet/sinatra-bundles}
|
94
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
95
|
+
s.require_paths = ["lib"]
|
96
|
+
s.rubygems_version = %q{1.3.5}
|
97
|
+
s.summary = %q{Easy asset bundling for sinatra}
|
98
|
+
s.test_files = [
|
99
|
+
"spec/app.rb",
|
100
|
+
"spec/production_app.rb",
|
101
|
+
"spec/sinatra-bundles_spec.rb",
|
102
|
+
"spec/spec_helper.rb"
|
103
|
+
]
|
104
|
+
|
105
|
+
if s.respond_to? :specification_version then
|
106
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
107
|
+
s.specification_version = 3
|
108
|
+
|
109
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
110
|
+
s.add_runtime_dependency(%q<rainpress>, [">= 0"])
|
111
|
+
s.add_runtime_dependency(%q<packr>, [">= 0"])
|
112
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
113
|
+
s.add_development_dependency(%q<rack-test>, [">= 0.5.3"])
|
114
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
115
|
+
else
|
116
|
+
s.add_dependency(%q<rainpress>, [">= 0"])
|
117
|
+
s.add_dependency(%q<packr>, [">= 0"])
|
118
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
119
|
+
s.add_dependency(%q<rack-test>, [">= 0.5.3"])
|
120
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
121
|
+
end
|
122
|
+
else
|
123
|
+
s.add_dependency(%q<rainpress>, [">= 0"])
|
124
|
+
s.add_dependency(%q<packr>, [">= 0"])
|
125
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
126
|
+
s.add_dependency(%q<rack-test>, [">= 0.5.3"])
|
127
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-bundles
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Huckstep
|
@@ -42,6 +42,16 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 1.2.9
|
44
44
|
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: rack-test
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.5.3
|
54
|
+
version:
|
45
55
|
- !ruby/object:Gem::Dependency
|
46
56
|
name: yard
|
47
57
|
type: :development
|
@@ -68,8 +78,8 @@ files:
|
|
68
78
|
- README.md
|
69
79
|
- Rakefile
|
70
80
|
- VERSION
|
71
|
-
- lib/sinatra-bundles.rb
|
72
81
|
- lib/sinatra/bundles.rb
|
82
|
+
- sinatra-bundles.gemspec
|
73
83
|
- spec/app.rb
|
74
84
|
- spec/production_app.rb
|
75
85
|
- spec/public/javascripts/test1.js
|
data/lib/sinatra-bundles.rb
DELETED
File without changes
|