rack-less 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc ADDED
@@ -0,0 +1,90 @@
1
+ = Rack::Less
2
+
3
+ == Description
4
+
5
+ A better way to use LESS CSS in Ruby web apps.
6
+
7
+ == Installation
8
+
9
+ $ gem install rack-less
10
+
11
+ == Basic Usage
12
+
13
+ Rack::Less is implemented as a piece of Rack middleware and can be used with
14
+ any Rack-based application. If your application includes a rackup (`.ru`) file
15
+ or uses Rack::Builder to construct the application pipeline, simply require
16
+ and use as follows:
17
+
18
+ require 'rack/less'
19
+ use Rack::Less do
20
+ set :source, 'app/less'
21
+ set :hosted_at, '/'
22
+ set :compress, true
23
+ end
24
+ run app
25
+
26
+ == Using with Rails
27
+
28
+ Add this to your `config/environment.rb`:
29
+
30
+ config.middleware.use Rack::Less, :compress => true
31
+
32
+ You should now see `Rack::Less` listed in the middleware pipeline:
33
+
34
+ rake middleware
35
+
36
+ == Available Options
37
+
38
+ * *root*["."]:
39
+ the app root. the reference point for the source and public options. #TODO: default appropriately for Rails/Sinatra.
40
+
41
+ * *source*['app/stylesheets']:
42
+ the path (relative to the root) where LESS files are located
43
+
44
+ * *public*['public']:
45
+ the path (relative to the root) where LESS files are located
46
+
47
+ * *hosted_at*['/stylesheets']:
48
+ the public HTTP root path for stylesheets
49
+
50
+ * *cache*[false]:
51
+ whether to cache the compilation output to a corresponding file in the hosted_root
52
+
53
+ * *compress*[false]:
54
+ whether to remove extraneous whitespace from compilation output
55
+
56
+ * *combinations*[{}]:
57
+ directives for combining the ouput of one or more LESS compilations, for example:
58
+ set :combine, { 'app' => ['one', 'two', 'three'] }
59
+ will direct Rack::Less to respond to a request for app.css with the concatenated output of compiling one.less, two.less, and three.less
60
+
61
+ == Links
62
+
63
+ GitHub: http://github.com/kelredd/rack-less
64
+
65
+ Less: http://lesscss.org
66
+
67
+ == License
68
+
69
+ Copyright (c) 2010 Kelly Redding (mailto:kelly@kelredd.com)
70
+
71
+ Permission is hereby granted, free of charge, to any person
72
+ obtaining a copy of this software and associated documentation
73
+ files (the "Software"), to deal in the Software without
74
+ restriction, including without limitation the rights to use,
75
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
76
+ copies of the Software, and to permit persons to whom the
77
+ Software is furnished to do so, subject to the following
78
+ conditions:
79
+
80
+ The above copyright notice and this permission notice shall be
81
+ included in all copies or substantial portions of the Software.
82
+
83
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
84
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
85
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
86
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
87
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
88
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
89
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
90
+ 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/less/version'
6
+
7
+ spec = Gem::Specification.new do |s|
8
+ s.name = 'rack-less'
9
+ s.version = RackLess::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 = "A better way to use LESS CSS in Ruby web apps."
14
+ s.author = 'Kelly Redding'
15
+ s.email = 'kelly@kelredd.com'
16
+ s.homepage = 'http://github.com/kelredd/rack-less'
17
+ s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib}/**/*")
18
+ # s.executables = ['rack-less']
19
+
20
+ s.add_dependency("rack", [">= 0.4"])
21
+ s.add_dependency("less", [">= 1.2.21"])
22
+
23
+ s.add_development_dependency("shoulda", [">= 2.10.2"])
24
+ s.add_development_dependency("sinatra", [">= 0.9.4"])
25
+ s.add_development_dependency("rack-test", [">= 0.5.3"])
26
+ s.add_development_dependency("webrat", [">= 0.6.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
data/lib/rack/less.rb ADDED
@@ -0,0 +1,34 @@
1
+ require 'rack'
2
+ require 'rack/less/base'
3
+ require 'rack/less/options'
4
+ require 'rack/less/request'
5
+ require 'rack/less/response'
6
+ require 'rack/less/source'
7
+
8
+ # === Usage
9
+ #
10
+ # Create with default configs:
11
+ # require 'rack/less'
12
+ # Rack::Less.new(app, :compress => true)
13
+ #
14
+ # Within a rackup file (or with Rack::Builder):
15
+ # require 'rack/less'
16
+ # use Rack::Less do
17
+ # set :root, "."
18
+ # set :source, 'app/less'
19
+ # set :compress, true
20
+ # end
21
+ # run app
22
+
23
+ module Rack::Less
24
+ MEDIA_TYPE = "text/css"
25
+
26
+ # Create a new Rack::Less middleware component
27
+ # => the +options+ Hash can be used to specify default configuration values
28
+ # => a block can given as an alternate method for setting option values (see example above)
29
+ # => (see Rack::Less::Options for possible key/values)
30
+ def self.new(app, options={}, &block)
31
+ Base.new(app, options, &block)
32
+ end
33
+
34
+ end
@@ -0,0 +1,69 @@
1
+ require 'rack/less/options'
2
+ require 'rack/less/request'
3
+ require 'rack/less/response'
4
+
5
+ module Rack::Less
6
+ class Base
7
+ include Rack::Less::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
+ # ripped from: http://github.com/rtomayko/rack-cache/blob/master/lib/rack/cache/context.rb
20
+ def call(env)
21
+ if env['rack.run_once']
22
+ call! env
23
+ else
24
+ clone.call! env
25
+ end
26
+ end
27
+
28
+ # The real Rack call interface.
29
+ # if LESS CSS is being requested, this is an endpoint:
30
+ # => generate the compiled css
31
+ # => respond appropriately
32
+ # Otherwise, call on up to the app as normal
33
+ def call!(env)
34
+ @default_options.each { |k,v| env[k] ||= v }
35
+ @env = env
36
+ # TODO: get this going
37
+
38
+ if (@request = Request.new(@env.dup.freeze)).for_less?
39
+ Response.new(@env.dup.freeze, @request.source.to_css).to_rack
40
+ else
41
+ @app.call(env)
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def validate_options
48
+ # ensure a root path is specified and does exists
49
+ unless options.has_key?(option_name(:root)) and !options(:root).nil?
50
+ raise(ArgumentError, "no :root option set")
51
+ end
52
+ unless File.exists?(options(:root))
53
+ raise(ArgumentError, "the :root path ('#{options(:root)}') does not exist")
54
+ end
55
+
56
+ set :root, File.expand_path(options(:root))
57
+
58
+ # ensure a source path is specified and does exists
59
+ unless options.has_key?(option_name(:source)) and !options(:source).nil?
60
+ raise(ArgumentError, "no :source option set")
61
+ end
62
+ source_path = File.join(options(:root), options(:source))
63
+ unless File.exists?(source_path)
64
+ raise(ArgumentError, "the :source path ('#{source_path}') does not exist")
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,128 @@
1
+ module Rack::Less
2
+ module Options
3
+
4
+ # Handles options and configuration for Rack::Less
5
+ # Available options:
6
+ # => root
7
+ # the app root. the reference point for the
8
+ # source and public options
9
+ # => source
10
+ # the path (relative to the root) where
11
+ # LESS files are located
12
+ # => public
13
+ # the path (relative to the root) where
14
+ # static files are served
15
+ # => hosted_at
16
+ # the public HTTP root path for stylesheets
17
+ # => cache
18
+ # whether to cache the compilation output to a
19
+ # corresponding file in the hosted_root
20
+ # => compress
21
+ # whether to remove extraneous whitespace from
22
+ # compilation output
23
+ # => combine
24
+ # expects a hash containing directives for combining
25
+ # the ouput of one or more LESS compilations, for example:
26
+ # { 'app' => ['one', 'two', 'three']}
27
+ # will respond to a request for app.css with the concatenated
28
+ # output of compiling one.less, two.less, and three.less
29
+
30
+ # Note: the following code is more or less a rip from:
31
+ # => http://github.com/rtomayko/rack-cache/blob/master/lib/rack/cache/options.rb
32
+ # => thanks to rtomayko, I thought this approach was really smart and the credit is his.
33
+
34
+ RACK_ENV_NS = "rack-less"
35
+
36
+ module ClassMethods
37
+
38
+ def defaults
39
+ {
40
+ option_name(:root) => ".",
41
+ option_name(:source) => 'app/stylesheets',
42
+ option_name(:public) => 'public',
43
+ option_name(:hosted_at) => '/stylesheets',
44
+ option_name(:cache) => false,
45
+ option_name(:compress) => false,
46
+ option_name(:combine) => {}
47
+ }
48
+ end
49
+
50
+ # Rack::Less uses the Rack Environment to store option values. All options
51
+ # are stored in the Rack Environment as "<RACK_ENV_PREFIX>.<option>", where
52
+ # <option> is the option name.
53
+ def option_name(key)
54
+ case key
55
+ when Symbol ; "#{RACK_ENV_NS}.#{key}"
56
+ when String ; key
57
+ else raise ArgumentError
58
+ end
59
+ end
60
+
61
+ end
62
+
63
+ module InstanceMethods
64
+
65
+ # Rack::Less uses the Rack Environment to store option values. All options
66
+ # are stored in the Rack Environment as "<RACK_ENV_PREFIX>.<option>", where
67
+ # <option> is the option name.
68
+ def option_name(key)
69
+ self.class.option_name(key)
70
+ end
71
+
72
+ # The underlying options Hash. During initialization (or outside of a
73
+ # request), this is a default values Hash. During a request, this is the
74
+ # Rack environment Hash. The default values Hash is merged in underneath
75
+ # the Rack environment before each request is processed.
76
+ # => if a key is passed, the option value for the key is returned
77
+ def options(key=nil)
78
+ if key
79
+ (@env || @default_options)[option_name(key)]
80
+ else
81
+ @env || @default_options
82
+ end
83
+ end
84
+
85
+ # Set multiple options at once.
86
+ def options=(hash={})
87
+ hash.each { |key,value| write_option(key, value) }
88
+ end
89
+
90
+ # Set an option. When +option+ is a Symbol, it is set in the Rack
91
+ # Environment as "rack-cache.option". When +option+ is a String, it
92
+ # exactly as specified. The +option+ argument may also be a Hash in
93
+ # which case each key/value pair is merged into the environment as if
94
+ # the #set method were called on each.
95
+ def set(option, value=nil, &block)
96
+ if block_given?
97
+ write_option option, block
98
+ elsif value.nil?
99
+ self.options = option.to_hash
100
+ else
101
+ write_option option, value
102
+ end
103
+ end
104
+
105
+ private
106
+
107
+ def initialize_options(options={})
108
+ @default_options = self.class.defaults
109
+ self.options = options
110
+ end
111
+
112
+ def read_option(key)
113
+ options[option_name(key)]
114
+ end
115
+
116
+ def write_option(key, value)
117
+ options[option_name(key)] = value
118
+ end
119
+
120
+ end
121
+
122
+ def self.included(receiver)
123
+ receiver.extend ClassMethods
124
+ receiver.send :include, InstanceMethods
125
+ end
126
+
127
+ end
128
+ end
@@ -0,0 +1,72 @@
1
+ require 'rack/request'
2
+ require 'rack/less'
3
+ require 'rack/less/options'
4
+ require 'rack/less/source'
5
+
6
+ module Rack::Less
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
+ # => from: http://github.com/rtomayko/rack-cache/blob/master/lib/rack/cache/request.rb
12
+
13
+ class Request < Rack::Request
14
+ include Rack::Less::Options
15
+
16
+ CSS_PATH_REGEX = /\A.*\/(\w+)\.(\w+)\Z/
17
+ CSS_PATH_FORMATS = ['css']
18
+
19
+ # The HTTP request method. This is the standard implementation of this
20
+ # method but is respecified here due to libraries that attempt to modify
21
+ # the behavior to respect POST tunnel method specifiers. We always want
22
+ # the real request method.
23
+ def request_method
24
+ @env['REQUEST_METHOD']
25
+ end
26
+
27
+ def path_info
28
+ @env['PATH_INFO']
29
+ end
30
+
31
+ # TODO: test these
32
+ def path_resource_name
33
+ path_info =~ CSS_PATH_REGEX ? path_info.match(CSS_PATH_REGEX)[1] : nil
34
+ end
35
+
36
+ def path_resource_format
37
+ path_info =~ CSS_PATH_REGEX ? path_info.match(CSS_PATH_REGEX)[2] : nil
38
+ end
39
+
40
+ # The Rack::Less::Source that the request is for
41
+ def source
42
+ @source ||= begin
43
+ cache = if options(:cache)
44
+ File.join(options(:root), options(:public), options(:hosted_at))
45
+ else
46
+ nil
47
+ end
48
+ source_opts = {
49
+ :folder => File.join(options(:root), options(:source)),
50
+ :cache => cache,
51
+ :compress => options(:compress),
52
+ :combine => options(:combine)
53
+ }
54
+ Source.new(path_resource_name, source_opts)
55
+ end
56
+ end
57
+
58
+ def for_css?
59
+ media_type == Rack::Less::MEDIA_TYPE ||
60
+ CSS_PATH_FORMATS.include?(path_resource_format)
61
+ end
62
+
63
+ # Determine if the request is for existing LESS CSS file
64
+ # This will be called on every request so speed is an issue
65
+ # => first check if the request is a GET on a css resource (fast)
66
+ # => then check for less source files that match the request (slow)
67
+ def for_less?
68
+ get? && for_css? && !source.files.empty?
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,45 @@
1
+ require 'rack/response'
2
+ require 'rack/utils'
3
+
4
+ module Rack::Less
5
+
6
+ # Given some generated css, mimicks a Rack::Response
7
+ # => call to_rack to build standard rack response parameters
8
+ class Response
9
+ include Rack::Less::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 css.
30
+ def initialize(env, css)
31
+ @env = env
32
+ @body = css
33
+ @status = 200 # OK
34
+ @headers = Rack::Utils::HeaderHash.new
35
+
36
+ headers["Content-Type"] = Rack::Less::MEDIA_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,98 @@
1
+ require 'less'
2
+
3
+ module Rack::Less
4
+
5
+ # The engine for compiling LESS CSS
6
+ # Given the name of the less source file you want
7
+ # to compile and a path to the source files,
8
+ # will returns corresponding compiled LESS CSS
9
+ class Source
10
+
11
+ # prefer source files with the .less extension
12
+ # but also accept files with the .css extension
13
+ PREFERRED_EXTENSIONS = [:less, :css]
14
+
15
+ attr_reader :css_name
16
+
17
+ def initialize(css_name, options={})
18
+ @css_name = css_name
19
+ @compress = options[:compress]
20
+ @cache = options[:cache]
21
+ @folder = get_required_path(options, :folder)
22
+ @combine = options[:combine] || {}
23
+ end
24
+
25
+ def compress?
26
+ !!@compress
27
+ end
28
+ def cache?
29
+ !@cache.nil?
30
+ end
31
+
32
+ # Use named css sources before using combine directive sources
33
+ def files
34
+ @files ||= (css_sources.empty? ? combined_sources : css_sources)
35
+ end
36
+
37
+ def compiled
38
+ @compiled ||= begin
39
+ compiled_css = files.collect do |file_path|
40
+ Less::Engine.new(File.new(file_path)).to_css
41
+ end.join("\n")
42
+
43
+ compiled_css.delete!("\n") if compress?
44
+ if cache? && !File.exists?(cf = File.join(@cache, "#{@css_name}.css"))
45
+ FileUtils.mkdir_p(@cache)
46
+ File.open(cf, "w") do |file|
47
+ file.write(compiled_css)
48
+ end
49
+ end
50
+
51
+ compiled_css
52
+ end
53
+ end
54
+ alias_method :to_css, :compiled
55
+ alias_method :css, :compiled
56
+
57
+ protected
58
+
59
+ # Preferred, existing source files matching the css name
60
+ def css_sources
61
+ @css_sources ||= preferred_sources([@css_name])
62
+ end
63
+
64
+ # Preferred, existing source files matching a corresponding
65
+ # combine directive, if any
66
+ def combined_sources
67
+ @combined_sources ||= preferred_sources(@combine[@css_name] || [])
68
+ end
69
+
70
+ private
71
+
72
+ # Given a list of file names, return a list of
73
+ # existing source files with the corresponding names
74
+ # honoring the preferred extension list
75
+ def preferred_sources(file_names)
76
+ file_names.collect do |name|
77
+ PREFERRED_EXTENSIONS.inject(nil) do |source_file, extension|
78
+ source_file || begin
79
+ path = File.join(@folder, "#{name}.#{extension}")
80
+ File.exists?(path) ? path : nil
81
+ end
82
+ end
83
+ end.compact
84
+ end
85
+
86
+ def get_required_path(options, path_key)
87
+ unless options.has_key?(path_key)
88
+ raise(ArgumentError, "no :#{path_key} option specified")
89
+ end
90
+ unless File.exists?(options[path_key])
91
+ raise(ArgumentError, "the :#{path_key} ('#{options[path_key]}') does not exist")
92
+ end
93
+ options[path_key]
94
+ end
95
+
96
+ end
97
+
98
+ end
@@ -0,0 +1,13 @@
1
+ module RackLess
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,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-less
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-08 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rack
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0.4"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: less
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.21
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: shoulda
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.10.2
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: sinatra
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.9.4
54
+ version:
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack-test
57
+ type: :development
58
+ version_requirement:
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 0.5.3
64
+ version:
65
+ - !ruby/object:Gem::Dependency
66
+ name: webrat
67
+ type: :development
68
+ version_requirement:
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 0.6.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/less/base.rb
87
+ - lib/rack/less/options.rb
88
+ - lib/rack/less/request.rb
89
+ - lib/rack/less/response.rb
90
+ - lib/rack/less/source.rb
91
+ - lib/rack/less/version.rb
92
+ - lib/rack/less.rb
93
+ has_rdoc: true
94
+ homepage: http://github.com/kelredd/rack-less
95
+ licenses: []
96
+
97
+ post_install_message:
98
+ rdoc_options:
99
+ - --main
100
+ - README.rdoc
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: "0"
108
+ version:
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: "0"
114
+ version:
115
+ requirements: []
116
+
117
+ rubyforge_project:
118
+ rubygems_version: 1.3.5
119
+ signing_key:
120
+ specification_version: 3
121
+ summary: A better way to use LESS CSS in Ruby web apps.
122
+ test_files: []
123
+