rack-less 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,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
+