rack-sprockets 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,116 @@
1
+ = Rack::Sprockets
2
+
3
+ == Description
4
+
5
+ Sprockets javascript preprocessing for Rack apps.
6
+
7
+ == Installation
8
+
9
+ gem install rack-sprockets
10
+
11
+ # optional, for compression
12
+ gem install yui-compressor
13
+
14
+ == Basic Usage
15
+
16
+ Rack::Sprockets is implemented as a piece of Rack middleware and can be used with
17
+ any Rack-based application. If your application includes a rackup (`.ru`) file
18
+ or uses Rack::Builder to construct the application pipeline, simply require
19
+ and use as follows:
20
+
21
+ require 'rack/sprockets'
22
+
23
+ # optional - use as necessary
24
+ Rack::Sprockets.configure do |config|
25
+ config.compress = true
26
+ # other configs ...
27
+ end
28
+
29
+ use Rack::Sprockets,
30
+ :load_path => 'app/scripts',
31
+ :hosted_at => '/'
32
+ # additional options ...
33
+
34
+ run app
35
+
36
+ == Using with Rails
37
+
38
+ Add this to your `config/environment.rb`:
39
+
40
+ config.middleware.use "Rack::Sprockets"
41
+
42
+ Add any configs in an initializer (optional - use as necessary):
43
+
44
+ Rack::Sprockets.configure do |config|
45
+ config.cache = true
46
+ # additional configs ...
47
+ end
48
+
49
+ You should now see `Rack::Sprockets` listed in the middleware pipeline:
50
+
51
+ rake middleware
52
+
53
+ == Available Options
54
+ These are similar to sprockets options and, where applicable, map directly to a corresponding Sprockets option.
55
+
56
+ * :*root* ['.']
57
+ - The app root. The reference point for the source and public options. Maps to the `:root` Sprockets option.
58
+
59
+ * :*public* ['public']
60
+ - The path where static files are located. Maps to the `:asset_root` Sprockets option.
61
+
62
+ * :*source* ["app/javascripts"]
63
+ - The path where Sprockets source files are located. Notice this does not map to the `:source_files` Sprockets option. It is assumed that any requested resource found in `:source` be treated as a Sprockets source file.
64
+
65
+ * :*hosted_at* ["/javascripts"]
66
+ - The public hosted HTTP path for static javascripts files.
67
+
68
+ * :*load_path* [["app/javascripts/", "vendor/javascripts/"]]
69
+ - An ordered array of directory names to search for dependencies in. Maps to the `:load_path` Sprockets option.
70
+
71
+ * :*expand_paths* [true]
72
+ - Whether or not to expand filenames according to shell glob rules. Maps to the `:expand_paths` Sprockets option.
73
+
74
+ == Available Configurations
75
+ * .*cache* [false]
76
+ - Whether or not to cache the concatenation output to a corresponding static file.
77
+
78
+ * .*compress* [false]
79
+ - Whether or not to apply compression to the concatenation output - uses YUI Compressor if available or will remove extraneous whitespace if not.
80
+
81
+ == Links
82
+
83
+ * *GitHub*
84
+ - http://github.com/kelredd/rack-sprockets
85
+
86
+ * *Sprockets*
87
+ - http://getsprockets.org
88
+
89
+ * *Yui* *Compressor*
90
+ - http://github.com/sstephenson/ruby-yui-compressor
91
+ - http://developer.yahoo.com/yui/compressor
92
+
93
+ == License
94
+
95
+ Copyright (c) 2010 Kelly Redding (mailto:kelly@kelredd.com)
96
+
97
+ Permission is hereby granted, free of charge, to any person
98
+ obtaining a copy of this software and associated documentation
99
+ files (the "Software"), to deal in the Software without
100
+ restriction, including without limitation the rights to use,
101
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
102
+ copies of the Software, and to permit persons to whom the
103
+ Software is furnished to do so, subject to the following
104
+ conditions:
105
+
106
+ The above copyright notice and this permission notice shall be
107
+ included in all copies or substantial portions of the Software.
108
+
109
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
110
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
111
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
112
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
113
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
114
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
115
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
116
+ OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,61 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'rake/testtask'
4
+
5
+ require 'lib/rack/sprockets/version'
6
+
7
+ spec = Gem::Specification.new do |s|
8
+ s.name = 'rack-sprockets'
9
+ s.version = RackSprockets::Version.to_s
10
+ s.has_rdoc = true
11
+ s.extra_rdoc_files = %w(README.rdoc)
12
+ s.rdoc_options = %w(--main README.rdoc)
13
+ s.summary = "Sprockets javascript preprocessing for Rack apps."
14
+ s.author = 'Kelly Redding'
15
+ s.email = 'kelly@kelredd.com'
16
+ s.homepage = 'http://github.com/kelredd/rack-sprockets'
17
+ s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib}/**/*")
18
+ # s.executables = ['rack-sprockets']
19
+
20
+ s.add_development_dependency("shoulda", [">= 2.10.0"])
21
+ s.add_development_dependency("sinatra", [">= 0.9.4"])
22
+ s.add_development_dependency("rack-test", [">= 0.5.3"])
23
+ s.add_development_dependency("webrat", [">= 0.6.0"])
24
+
25
+ s.add_dependency("rack", [">= 0.4"])
26
+ s.add_dependency("sprockets", [">= 1.0.0"])
27
+ end
28
+
29
+ Rake::GemPackageTask.new(spec) do |pkg|
30
+ pkg.gem_spec = spec
31
+ end
32
+
33
+ Rake::TestTask.new do |t|
34
+ t.libs << 'test'
35
+ t.test_files = FileList["test/**/*_test.rb"]
36
+ t.verbose = true
37
+ end
38
+
39
+ begin
40
+ require 'rcov/rcovtask'
41
+
42
+ Rcov::RcovTask.new(:coverage) do |t|
43
+ t.libs = ['test']
44
+ t.test_files = FileList["test/**/*_test.rb"]
45
+ t.verbose = true
46
+ t.rcov_opts = ['--text-report', "-x #{Gem.path}", '-x /Library/Ruby', '-x /usr/lib/ruby']
47
+ end
48
+
49
+ task :default => :coverage
50
+
51
+ rescue LoadError
52
+ warn "\n**** Install rcov (sudo gem install relevance-rcov) to get coverage stats ****\n"
53
+ task :default => :test
54
+ end
55
+
56
+ desc 'Generate the gemspec to serve this gem'
57
+ task :gemspec do
58
+ file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
59
+ File.open(file, 'w') {|f| f << spec.to_ruby }
60
+ puts "Created gemspec: #{file}"
61
+ end
@@ -0,0 +1,51 @@
1
+ require 'rack'
2
+ require 'rack/sprockets/config'
3
+ require 'rack/sprockets/options'
4
+ require 'rack/sprockets/source'
5
+ require 'rack/sprockets/base'
6
+ require 'rack/sprockets/request'
7
+ require 'rack/sprockets/response'
8
+
9
+ # === Usage
10
+ #
11
+ # Create with default configs:
12
+ # require 'rack/sprockets'
13
+ # Rack::Sprockets.new(app, :compress => true)
14
+ #
15
+ # Within a rackup file (or with Rack::Builder):
16
+ # require 'rack/sprockets'
17
+ #
18
+ # use Rack::Sprockets,
19
+ # :source => 'app/scripts'
20
+ # :compress => true
21
+ #
22
+ # run app
23
+
24
+ module Rack::Sprockets
25
+ MIME_TYPE = "text/javascript"
26
+ @@config = Config.new
27
+
28
+ class << self
29
+
30
+ # Configuration accessors for Rack::Sprockets
31
+ # (see config.rb for details)
32
+ def configure
33
+ yield @@config if block_given?
34
+ end
35
+ def config
36
+ @@config
37
+ end
38
+ def config=(value)
39
+ @@config = value
40
+ end
41
+
42
+ end
43
+
44
+ # Create a new Rack::Sprockets middleware component
45
+ # => the +options+ Hash can be used to specify default option values
46
+ # => (see Rack::Sprockets::Options for possible key/values)
47
+ def self.new(app, options={}, &block)
48
+ Base.new(app, options, &block)
49
+ end
50
+
51
+ end
@@ -0,0 +1,67 @@
1
+ require 'rack/sprockets/options'
2
+ require 'rack/sprockets/request'
3
+ require 'rack/sprockets/response'
4
+
5
+ module Rack::Sprockets
6
+ class Base
7
+ include Rack::Sprockets::Options
8
+
9
+ def initialize(app, options={})
10
+ @app = app
11
+ initialize_options options
12
+ yield self if block_given?
13
+ validate_options
14
+ end
15
+
16
+ # The Rack call interface. The receiver acts as a prototype and runs
17
+ # each request in a clone object unless the +rack.run_once+ variable is
18
+ # set in the environment.
19
+ def call(env)
20
+ if env['rack.run_once']
21
+ call! env
22
+ else
23
+ clone.call! env
24
+ end
25
+ end
26
+
27
+ # The real Rack call interface.
28
+ # if Sprockets JS is being requested, this is an endpoint:
29
+ # => generate the compiled javascripts
30
+ # => respond appropriately
31
+ # Otherwise, call on up to the app as normal
32
+ def call!(env)
33
+ @default_options.each { |k,v| env[k] ||= v }
34
+ @env = env
35
+
36
+ if (@request = Request.new(@env.dup.freeze)).for_sprockets?
37
+ Response.new(@env.dup.freeze, @request.source.to_js).to_rack
38
+ else
39
+ @app.call(env)
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def validate_options
46
+ # ensure a root path is specified and does exists
47
+ unless options.has_key?(option_name(:root)) and !options(:root).nil?
48
+ raise(ArgumentError, "no :root option set")
49
+ end
50
+ unless File.exists?(options(:root))
51
+ raise(ArgumentError, "the :root path ('#{options(:root)}') does not exist")
52
+ end
53
+
54
+ set :root, File.expand_path(options(:root))
55
+
56
+ # ensure a source path is specified and does exists
57
+ unless options.has_key?(option_name(:source)) and !options(:source).nil?
58
+ raise(ArgumentError, "no :source option set")
59
+ end
60
+ source_path = File.join(options(:root), options(:source))
61
+ unless File.exists?(source_path)
62
+ raise(ArgumentError, "the :source path ('#{source_path}') does not exist")
63
+ end
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,40 @@
1
+ module Rack::Sprockets
2
+
3
+ # Handles configuration for Rack::Sprockets
4
+ # Available config settings:
5
+ # :cache
6
+ # whether to cache the compilation output to
7
+ # a corresponding static file. Also determines
8
+ # what value config#combinations(:key) returns
9
+ # :compress
10
+ # Whether or not to apply compression to the
11
+ # concatenation output - uses YUI Compressor
12
+ # if available or will remove extraneous
13
+ # whitespace if not.
14
+
15
+ class Config
16
+
17
+ ATTRIBUTES = [:cache, :compress]
18
+ attr_accessor *ATTRIBUTES
19
+
20
+ DEFAULTS = {
21
+ :cache => false,
22
+ :compress => false
23
+ }
24
+
25
+ def initialize(settings={})
26
+ ATTRIBUTES.each do |a|
27
+ instance_variable_set("@#{a}", settings[a] || DEFAULTS[a])
28
+ end
29
+ end
30
+
31
+ def cache?
32
+ !!@cache
33
+ end
34
+
35
+ def compress?
36
+ !!@compress
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,131 @@
1
+ module Rack::Sprockets
2
+ module Options
3
+
4
+ # Handles options for Rack::Sprockets
5
+ # Available options:
6
+ # => root
7
+ # The app root. The reference point for
8
+ # the source and public options. Maps to
9
+ # the `:root` Sprockets option.
10
+ # => public
11
+ # The path where static files are located.
12
+ # Maps to the `:asset_root` Sprockets option.
13
+ # => source
14
+ # The path where Sprockets source files are
15
+ # located. Notice this does not map to the
16
+ # `:source_files` Sprockets option. It is
17
+ # assumed that any requested resource found
18
+ # in `:source` be treated as a Sprockets
19
+ # source file.
20
+ # => hosted_at
21
+ # The public hosted HTTP path for static
22
+ # javascripts files.
23
+ # => load_path
24
+ # An ordered array of directory names to
25
+ # search for dependencies in. Maps to the
26
+ # `:load_path` Sprockets option.
27
+ # => expand_paths
28
+ # Whether or not to expand filenames according
29
+ # to shell glob rules. Maps to the
30
+ # `:expand_paths` Sprockets option.
31
+
32
+ RACK_ENV_NS = "rack-sprockets"
33
+ COLLECTION_OPTS = ["#{RACK_ENV_NS}.load_path"]
34
+
35
+ module ClassMethods
36
+
37
+ def defaults
38
+ {
39
+ option_name(:root) => ".",
40
+ option_name(:public) => 'public',
41
+ option_name(:source) => 'app/javascripts',
42
+ option_name(:hosted_at) => '/javascripts',
43
+ option_name(:load_path) => [
44
+ "app/javascripts/",
45
+ "vendor/javascripts/"
46
+ ],
47
+ option_name(:expand_paths) => true
48
+ }
49
+ end
50
+
51
+ # Rack::Sprockets uses the Rack Environment to store option values. All options
52
+ # are stored in the Rack Environment as "<RACK_ENV_PREFIX>.<option>", where
53
+ # <option> is the option name.
54
+ def option_name(key)
55
+ case key
56
+ when Symbol ; "#{RACK_ENV_NS}.#{key}"
57
+ when String ; key
58
+ else raise ArgumentError
59
+ end
60
+ end
61
+
62
+ end
63
+
64
+ module InstanceMethods
65
+
66
+ # Rack::Sprockets uses the Rack Environment to store option values. All options
67
+ # are stored in the Rack Environment as "<RACK_ENV_PREFIX>.<option>", where
68
+ # <option> is the option name.
69
+ def option_name(key)
70
+ self.class.option_name(key)
71
+ end
72
+
73
+ # The underlying options Hash. During initialization (or outside of a
74
+ # request), this is a default values Hash. During a request, this is the
75
+ # Rack environment Hash. The default values Hash is merged in underneath
76
+ # the Rack environment before each request is processed.
77
+ # => if a key is passed, the option value for the key is returned
78
+ def options(key=nil)
79
+ if key
80
+ (@env || @default_options)[option_name(key)]
81
+ else
82
+ @env || @default_options
83
+ end
84
+ end
85
+
86
+ # Set multiple options at once.
87
+ def options=(hash={})
88
+ hash.each { |key,value| write_option(key, value) }
89
+ end
90
+
91
+ # Set an option. When +option+ is a Symbol, it is set in the Rack
92
+ # Environment as "rack-cache.option". When +option+ is a String, it
93
+ # exactly as specified. The +option+ argument may also be a Hash in
94
+ # which case each key/value pair is merged into the environment as if
95
+ # the #set method were called on each.
96
+ def set(option, value=nil)
97
+ if value.nil?
98
+ self.options = option.to_hash
99
+ else
100
+ write_option option, value
101
+ end
102
+ end
103
+
104
+ private
105
+
106
+ def initialize_options(options={})
107
+ @default_options = self.class.defaults
108
+ self.options = options
109
+ end
110
+
111
+ def read_option(key)
112
+ options[option_name(key)]
113
+ end
114
+
115
+ def write_option(key, value)
116
+ if COLLECTION_OPTS.include?(opt_name = option_name(key))
117
+ options[opt_name] = [*value]
118
+ else
119
+ options[opt_name] = value
120
+ end
121
+ end
122
+
123
+ end
124
+
125
+ def self.included(receiver)
126
+ receiver.extend ClassMethods
127
+ receiver.send :include, InstanceMethods
128
+ end
129
+
130
+ end
131
+ end
@@ -0,0 +1,78 @@
1
+ require 'rack/request'
2
+ require 'rack/sprockets'
3
+ require 'rack/sprockets/options'
4
+ require 'rack/sprockets/source'
5
+
6
+ module Rack::Sprockets
7
+
8
+ # Provides access to the HTTP request.
9
+ # Request objects respond to everything defined by Rack::Request
10
+ # as well as some additional convenience methods defined here
11
+
12
+ class Request < Rack::Request
13
+ include Rack::Sprockets::Options
14
+
15
+ JS_PATH_FORMATS = ['.js']
16
+
17
+ # The HTTP request method. This is the standard implementation of this
18
+ # method but is respecified here due to libraries that attempt to modify
19
+ # the behavior to respect POST tunnel method specifiers. We always want
20
+ # the real request method.
21
+ def request_method
22
+ @env['REQUEST_METHOD']
23
+ end
24
+
25
+ def path_info
26
+ @env['PATH_INFO']
27
+ end
28
+
29
+ def http_accept
30
+ @env['HTTP_ACCEPT']
31
+ end
32
+
33
+ def path_resource_name
34
+ File.basename(path_info, path_resource_format)
35
+ end
36
+
37
+ def path_resource_format
38
+ File.extname(path_info)
39
+ end
40
+
41
+ # The Rack::Sprockets::Source that the request is for
42
+ def source
43
+ @source ||= begin
44
+ cache = if Rack::Sprockets.config.cache?
45
+ File.join(options(:root), options(:public), options(:hosted_at))
46
+ else
47
+ nil
48
+ end
49
+ source_opts = {
50
+ :folder => File.join(options(:root), options(:source)),
51
+ :cache => cache,
52
+ :compress => Rack::Sprockets.config.compress,
53
+ :secretary => {
54
+ :root => options(:root),
55
+ :load_path => options(:load_path),
56
+ :expand_paths => options(:expand_paths)
57
+ }
58
+ }
59
+ Source.new(path_resource_name, source_opts)
60
+ end
61
+ end
62
+
63
+ def for_js?
64
+ (http_accept && http_accept.include?(Rack::Sprockets::MIME_TYPE)) ||
65
+ (media_type && media_type.include?(Rack::Sprockets::MIME_TYPE )) ||
66
+ JS_PATH_FORMATS.include?(path_resource_format)
67
+ end
68
+
69
+ # Determine if the request is for an existing Sprockets source file
70
+ # This will be called on every request so speed is an issue
71
+ # => first check if the request is a GET on a js resource (fast)
72
+ # => then check for sprockets source files that match the request (slow)
73
+ def for_sprockets?
74
+ get? && for_js? && !source.files.empty?
75
+ end
76
+
77
+ end
78
+ end
@@ -0,0 +1,45 @@
1
+ require 'rack/response'
2
+ require 'rack/utils'
3
+
4
+ module Rack::Sprockets
5
+
6
+ # Given some generated js, mimicks a Rack::Response
7
+ # => call to_rack to build standard rack response parameters
8
+ class Response
9
+ include Rack::Sprockets::Options
10
+ include Rack::Response::Helpers
11
+
12
+ # Rack response tuple accessors.
13
+ attr_accessor :status, :headers, :body
14
+
15
+ class << self
16
+
17
+ # Calculate appropriate content_length
18
+ def content_length(body)
19
+ if body.respond_to?(:bytesize)
20
+ body.bytesize
21
+ else
22
+ body.size
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ # Create a Response instance given the env
29
+ # and some generated js.
30
+ def initialize(env, js)
31
+ @env = env
32
+ @body = js
33
+ @status = 200 # OK
34
+ @headers = Rack::Utils::HeaderHash.new
35
+
36
+ headers["Content-Type"] = Rack::Sprockets::MIME_TYPE
37
+ headers["Content-Length"] = self.class.content_length(body).to_s
38
+ end
39
+
40
+ def to_rack
41
+ [status, headers.to_hash, body]
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,118 @@
1
+ require 'sprockets'
2
+
3
+ begin
4
+ require "yui/compressor"
5
+ rescue LoadError
6
+ # only error about missing yui compressor if
7
+ # :yui compression is requested
8
+ end
9
+
10
+ module Rack::Sprockets
11
+
12
+ class Source
13
+
14
+ PREFERRED_EXTENSIONS = [:js]
15
+ SECRETARY_DEFAULTS = {
16
+ :expand_paths => true
17
+ }
18
+ YUI_OPTS = {
19
+ :munge => true
20
+ }
21
+
22
+ attr_reader :js_name
23
+
24
+ def initialize(js_name, options={})
25
+ @js_name = js_name
26
+ @compress = options[:compress]
27
+ @cache = options[:cache]
28
+
29
+ @folder = get_required_path(options, :folder)
30
+ @secretary = SECRETARY_DEFAULTS.merge(options[:secretary] || {})
31
+ end
32
+
33
+ def compress?
34
+ !!@compress
35
+ end
36
+ def cache?
37
+ !@cache.nil?
38
+ end
39
+ def cache
40
+ @cache
41
+ end
42
+
43
+ def files
44
+ @files ||= js_sources
45
+ end
46
+
47
+ def secretary
48
+ @secretary_obj ||= Sprockets::Secretary.new(@secretary.merge({
49
+ :source_files => files
50
+ }))
51
+ end
52
+
53
+ def compiled
54
+ @compiled ||= begin
55
+ compiled_js = secretary.concatenation.to_s
56
+
57
+ compiled_js = case @compress
58
+ when :whitespace
59
+ compiled_js.delete("\n")
60
+ when :yui
61
+ if defined?(YUI::JavaScriptCompressor)
62
+ YUI::JavaScriptCompressor.new(YUI_OPTS).compress(compiled_js)
63
+ else
64
+ raise LoadError, "YUI::JavaScriptCompressor is not available. Install it with: gem install yui-compressor"
65
+ end
66
+ else
67
+ compiled_js
68
+ end
69
+
70
+ if cache? && !File.exists?(cf = File.join(@cache, "#{@js_name}.js"))
71
+ FileUtils.mkdir_p(@cache)
72
+ File.open(cf, "w") do |file|
73
+ file.write(compiled_js)
74
+ end
75
+ end
76
+
77
+ compiled_js
78
+ end
79
+ end
80
+ alias_method :to_js, :compiled
81
+ alias_method :js, :compiled
82
+
83
+ protected
84
+
85
+ # Source files matching the js name
86
+ def js_sources
87
+ @js_sources ||= preferred_sources([*@js_name])
88
+ end
89
+
90
+ private
91
+
92
+ # Given a list of file names, return a list of
93
+ # existing source files with the corresponding names
94
+ # honoring the preferred extension list
95
+ def preferred_sources(file_names)
96
+ file_names.collect do |name|
97
+ PREFERRED_EXTENSIONS.inject(nil) do |source_file, extension|
98
+ source_file || begin
99
+ path = File.join(@folder, "#{name}.#{extension}")
100
+ File.exists?(path) ? path : nil
101
+ end
102
+ end
103
+ end.compact
104
+ end
105
+
106
+ def get_required_path(options, path_key)
107
+ unless options.has_key?(path_key)
108
+ raise(ArgumentError, "no :#{path_key} option specified")
109
+ end
110
+ unless File.exists?(options[path_key])
111
+ raise(ArgumentError, "the :#{path_key} ('#{options[path_key]}') does not exist")
112
+ end
113
+ options[path_key]
114
+ end
115
+
116
+ end
117
+
118
+ end
@@ -0,0 +1,13 @@
1
+ module RackSprockets
2
+ module Version
3
+
4
+ MAJOR = 0
5
+ MINOR = 1
6
+ TINY = 0
7
+
8
+ def self.to_s # :nodoc:
9
+ [MAJOR, MINOR, TINY].join('.')
10
+ end
11
+
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-sprockets
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Kelly Redding
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-02-14 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: shoulda
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.10.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: sinatra
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.4
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rack-test
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.5.3
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: webrat
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.6.0
54
+ version:
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack
57
+ type: :runtime
58
+ version_requirement:
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0.4"
64
+ version:
65
+ - !ruby/object:Gem::Dependency
66
+ name: sprockets
67
+ type: :runtime
68
+ version_requirement:
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 1.0.0
74
+ version:
75
+ description:
76
+ email: kelly@kelredd.com
77
+ executables: []
78
+
79
+ extensions: []
80
+
81
+ extra_rdoc_files:
82
+ - README.rdoc
83
+ files:
84
+ - README.rdoc
85
+ - Rakefile
86
+ - lib/rack/sprockets/base.rb
87
+ - lib/rack/sprockets/config.rb
88
+ - lib/rack/sprockets/options.rb
89
+ - lib/rack/sprockets/request.rb
90
+ - lib/rack/sprockets/response.rb
91
+ - lib/rack/sprockets/source.rb
92
+ - lib/rack/sprockets/version.rb
93
+ - lib/rack/sprockets.rb
94
+ has_rdoc: true
95
+ homepage: http://github.com/kelredd/rack-sprockets
96
+ licenses: []
97
+
98
+ post_install_message:
99
+ rdoc_options:
100
+ - --main
101
+ - README.rdoc
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: "0"
109
+ version:
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: "0"
115
+ version:
116
+ requirements: []
117
+
118
+ rubyforge_project:
119
+ rubygems_version: 1.3.5
120
+ signing_key:
121
+ specification_version: 3
122
+ summary: Sprockets javascript preprocessing for Rack apps.
123
+ test_files: []
124
+