erikhansson-precssious 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/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ pkg
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Erik Hansson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,71 @@
1
+ = precssious
2
+
3
+ This is just a hack to allow me to write nested CSS. I had trouble finding
4
+ a CSS preprocessor that actually allowed nested styles without breaking my
5
+ stylesheets.
6
+
7
+ Although I am under no illusions of the general applicability of this code
8
+ (the current implementation is very naïve), it appears to do OK with how I
9
+ write CSS.
10
+
11
+ See spec/snippets.rb for a quick list of the features it supports.
12
+
13
+
14
+ == On performance / configuration
15
+
16
+ It's probably not a good idea to serve stylesheets using precssious under
17
+ normal conditions. However, caching them in development can be a real drag.
18
+ I've used the following approach.
19
+
20
+ (1) I add a precssious dependency, and make sure it isn't loaded by default.
21
+
22
+ /config/environment.rb
23
+
24
+ config.gem 'precssious', :lib => false
25
+
26
+ (2) I add an initializer with the following code, to load precssious in
27
+ development:
28
+
29
+ /config/initializers/precssious.rb
30
+
31
+ if RAILS_ENV == 'development'
32
+ require 'precssious'
33
+ Precssious.start_rails_controller
34
+ end
35
+
36
+ This catches requests to "/stylesheets/xxx/xxx.css", and serves the content
37
+ of all stylesheets in that directory, merged into a single file. The web path
38
+ ("stylesheets") and the source directory ("public/stylesheets") can both be
39
+ configured.
40
+
41
+ (3) For production, I don't want Precssious loaded at all -- instead, I
42
+ generate the stylesheets on deploy:
43
+
44
+ /lib/tasks/precssious.rake
45
+
46
+ desc 'Generates the stylesheets as static resources'
47
+ task :precssious do
48
+ require 'precssious'
49
+ Precssious.perform_preprocessing
50
+ end
51
+
52
+ /config/deploy.rb
53
+
54
+ after "deploy:update_code" do
55
+ run "cd #{current_path} && rake precssious"
56
+ end
57
+
58
+ == Note on Patches/Pull Requests
59
+
60
+ * Fork the project.
61
+ * Make your feature addition or bug fix.
62
+ * Add tests for it. This is important so I don't break it in a
63
+ future version unintentionally.
64
+ * Commit, do not mess with rakefile, version, or history.
65
+ (if you want to have your own version, that is fine but
66
+ bump version in a commit by itself I can ignore when I pull)
67
+ * Send me a pull request. Bonus points for topic branches.
68
+
69
+ == Copyright
70
+
71
+ Copyright (c) 2009 Erik Hansson. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "precssious"
8
+ gem.summary = %Q{Merges CSS files and allows nested declarations}
9
+ gem.description = %Q{}
10
+ gem.email = "erik@bits2life.com"
11
+ gem.homepage = "http://github.com/erikhansson/precssious"
12
+ gem.authors = ["Erik Hansson"]
13
+ gem.add_development_dependency "rspec"
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+ rescue LoadError
17
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
18
+ end
19
+
20
+ require 'spec/rake/spectask'
21
+ Spec::Rake::SpecTask.new(:spec) do |spec|
22
+ spec.libs << 'lib' << 'spec'
23
+ spec.spec_files = FileList['spec/**/*_spec.rb']
24
+ end
25
+
26
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
27
+ spec.libs << 'lib' << 'spec'
28
+ spec.pattern = 'spec/**/*_spec.rb'
29
+ spec.rcov = true
30
+ end
31
+
32
+ task :spec => :check_dependencies
33
+
34
+ task :default => :spec
35
+
36
+ require 'rake/rdoctask'
37
+ Rake::RDocTask.new do |rdoc|
38
+ if File.exist?('VERSION')
39
+ version = File.read('VERSION')
40
+ else
41
+ version = ""
42
+ end
43
+
44
+ rdoc.rdoc_dir = 'rdoc'
45
+ rdoc.title = "precssious #{version}"
46
+ rdoc.rdoc_files.include('README*')
47
+ rdoc.rdoc_files.include('lib/**/*.rb')
48
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/bin/precssious ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'precssious'
5
+
6
+ puts Precssious.process_files(Dir["#{ARGV[0]}/*.css"])
@@ -0,0 +1,95 @@
1
+
2
+ module Precssious
3
+
4
+ class Preprocessor
5
+
6
+ def initialize(input)
7
+ @tokens = []
8
+
9
+ Preprocessor.tokenize(Preprocessor.strip_comments(input)) do |t|
10
+ @tokens << t
11
+ end
12
+ end
13
+
14
+
15
+ def pull(type = nil)
16
+ result = @tokens.shift
17
+ if type && result.type != type
18
+ raise 'Unexpected token (#{result}, #{@tokens[0]}, #{@tokens[1]}, #{@tokens[2]}, #{@tokens[3]})'
19
+ end
20
+ result
21
+ end
22
+ def peek; @tokens[0]; end
23
+ def peek2; @tokens[1] if @tokens.length > 1; end
24
+ def consume(type)
25
+ t = pull
26
+ if t.type != type
27
+ raise "Unexpected token (#{t.data}, #{@tokens[0]}, #{@tokens[1]}, #{@tokens[2]}, #{@tokens[3]}) #{t.type}, expected #{type}"
28
+ end
29
+ end
30
+
31
+
32
+ def rules
33
+ result = []
34
+ while peek
35
+ result << rule
36
+ end
37
+ result
38
+ end
39
+
40
+ def rule
41
+ Rule.new pull(:text).data, rule_value
42
+ end
43
+
44
+ def rule_value
45
+ consume :lbrace
46
+ result = any
47
+ consume :rbrace
48
+ result
49
+ end
50
+
51
+ def any
52
+ result = []
53
+ while (peek.type != :rbrace)
54
+ if peek2 && peek2.type == :lbrace
55
+ result << rule
56
+ else
57
+ if peek2 && peek2.type == :semicolon
58
+ result << value
59
+ else
60
+ raise 'Unexpected CSS syntax (missing ;?)'
61
+ end
62
+ end
63
+ end
64
+ result
65
+ end
66
+
67
+ def value
68
+ l = pull(:text)
69
+ consume(:semicolon)
70
+ Value.new l.data
71
+ end
72
+
73
+ def self.tokenize(input)
74
+ current = []
75
+ input.each_char do |c|
76
+ if %W({ } ;).include? c.to_s
77
+ prev = current.join('').strip
78
+ current.clear
79
+
80
+ yield Token.new(:text, prev) if prev.length > 0
81
+ yield Token.new(:lbrace, nil) if c.to_s == '{'
82
+ yield Token.new(:rbrace, nil) if c.to_s == '}'
83
+ yield Token.new(:semicolon, nil) if c.to_s == ';'
84
+ else
85
+ current << c
86
+ end
87
+ end
88
+ end
89
+
90
+ def self.strip_comments(input)
91
+ input.gsub /\/\*.*?\*\//, ''
92
+ end
93
+
94
+ end
95
+ end
@@ -0,0 +1,9 @@
1
+ class PrecssiousController < ActionController::Base
2
+
3
+ def show
4
+ css = Precssious.process_files(Dir["#{Precssious.directory}/#{params[:id]}/*.css"].sort, true)
5
+ response.content_type = 'text/css'
6
+ render :text => css
7
+ end
8
+
9
+ end
@@ -0,0 +1,4 @@
1
+
2
+ ActionController::Routing::Routes.draw do |map|
3
+ map.connect "#{Precssious.web_path}/:id/:filename.css", :controller => 'precssious', :action => 'show'
4
+ end
@@ -0,0 +1,51 @@
1
+
2
+ module Precssious
3
+
4
+ Rule = Struct.new :selector, :values
5
+
6
+ class Rule
7
+ def to_s(context = nil)
8
+ @context = context
9
+ r, v = values.partition { |x| Rule === x }
10
+
11
+ result = []
12
+ result << "#{selector_string} { #{v.map { |x| x.to_s }.join ' '} }" if v.length > 0
13
+
14
+ r.each do |nested|
15
+ result << nested.to_s(self)
16
+ end
17
+
18
+ result.join "\n"
19
+ end
20
+
21
+ def is_hack?
22
+ raw_selector_string =~ /\[[a-z0-9]*\]/
23
+ end
24
+
25
+ def selector_string
26
+ raw_selector_string.gsub /\[[a-z0-9]*\] /, ''
27
+ end
28
+
29
+ def raw_selector_string
30
+ selectors.join(', ').gsub(/\s+-/, '')
31
+ end
32
+
33
+ def selectors
34
+ reverse, current = selector.split(',').map { |x| x.strip }.partition { |s| s =~ /<>/ }
35
+
36
+ return current unless @context
37
+
38
+ result = []
39
+
40
+ @context.selectors.map do |cs|
41
+ current.map { |s| result << "#{cs} #{s}" }
42
+ end
43
+ reverse.map do |rs|
44
+ @context.selectors.map { |cs| result << "#{rs.gsub('<>', '').strip} #{cs}" }
45
+ end
46
+
47
+ result
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,12 @@
1
+
2
+ module Precssious
3
+
4
+ Token = Struct.new :type, :data
5
+
6
+ class Token
7
+ def to_s
8
+ type == :text ? "[#{data}]" : ":#{type}"
9
+ end
10
+ end
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+
2
+ module Precssious
3
+
4
+ Value = Struct.new :rule
5
+
6
+ class Value
7
+ def to_s
8
+ "#{rule};"
9
+ end
10
+ end
11
+
12
+ end
data/lib/precssious.rb ADDED
@@ -0,0 +1,69 @@
1
+
2
+ require File.dirname(__FILE__) + "/precssious/rule"
3
+ require File.dirname(__FILE__) + "/precssious/value"
4
+ require File.dirname(__FILE__) + "/precssious/token"
5
+ require File.dirname(__FILE__) + "/precssious/preprocessor"
6
+
7
+
8
+ module Precssious
9
+
10
+ def self.directory=(value); @directory = value; end
11
+ def self.directory; @directory; end
12
+ def self.web_path=(value); @web_path = value; end
13
+ def self.web_path; @web_path; end
14
+
15
+
16
+ ##
17
+ # Loads the Precssious controller and adds routes to it. This route matches
18
+ # [directory]/:id/:filename.css, which by default is stylesheets/:id/:filename.css.
19
+ #
20
+ def self.start_rails_controller
21
+ yield self if block_given?
22
+
23
+ @directory ||= Rails.root.join('public', 'stylesheets')
24
+ @web_path ||= 'stylesheets'
25
+
26
+ require "precssious/rails/controller"
27
+ ActionController::Routing::Routes.add_configuration_file(File.join(File.dirname(__FILE__), 'precssious', 'rails', 'routes.rb'))
28
+ end
29
+
30
+ ##
31
+ # Generates CSS with names matching the directory names from all the CSS files
32
+ # included in that directory. By default searches public/stylesheets for directories
33
+ # to process (set Precssious.directory to change this).
34
+ #
35
+ def self.perform_preprocessing
36
+ yield self if block_given?
37
+
38
+ Dir["#{@directory}/*"].each do |dir|
39
+ if File.directory?(dir)
40
+ css = process_files(Dir["#{dir}/*.css"].sort, true)
41
+ File.open "#{dir}/#{File.basename(dir)}.css", 'w' do |file|
42
+ file.write css
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+
49
+ def self.process(input)
50
+ Preprocessor.new(input).rules.map { |x| x.to_s }.join "\n"
51
+ end
52
+
53
+ def self.process_files(files, zero = false)
54
+ result = zero ? [zero_css] : []
55
+ files.each do |filename|
56
+ File.open filename, 'r' do |file|
57
+ result << '' << "/* #{File.basename(filename)} */"
58
+ result << process(file.read)
59
+ end
60
+ end
61
+ result.join "\n"
62
+ end
63
+
64
+ def self.zero_css
65
+ "html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;font-variant:normal;}sup {vertical-align:text-top;}sub {vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}"
66
+ end
67
+
68
+
69
+ end
@@ -0,0 +1,63 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{precssious}
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 = ["Erik Hansson"]
12
+ s.date = %q{2009-08-22}
13
+ s.default_executable = %q{precssious}
14
+ s.description = %q{}
15
+ s.email = %q{erik@bits2life.com}
16
+ s.executables = ["precssious"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "README.rdoc"
20
+ ]
21
+ s.files = [
22
+ ".document",
23
+ ".gitignore",
24
+ "LICENSE",
25
+ "README.rdoc",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "bin/precssious",
29
+ "lib/precssious.rb",
30
+ "lib/precssious/preprocessor.rb",
31
+ "lib/precssious/rails/controller.rb",
32
+ "lib/precssious/rails/routes.rb",
33
+ "lib/precssious/rule.rb",
34
+ "lib/precssious/token.rb",
35
+ "lib/precssious/value.rb",
36
+ "precssious.gemspec",
37
+ "spec/precssious_spec.rb",
38
+ "spec/spec_helper.rb"
39
+ ]
40
+ s.has_rdoc = true
41
+ s.homepage = %q{http://github.com/erikhansson/precssious}
42
+ s.rdoc_options = ["--charset=UTF-8"]
43
+ s.require_paths = ["lib"]
44
+ s.rubygems_version = %q{1.3.1}
45
+ s.summary = %q{Merges CSS files and allows nested declarations}
46
+ s.test_files = [
47
+ "spec/precssious_spec.rb",
48
+ "spec/spec_helper.rb"
49
+ ]
50
+
51
+ if s.respond_to? :specification_version then
52
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
53
+ s.specification_version = 2
54
+
55
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
56
+ s.add_development_dependency(%q<rspec>, [">= 0"])
57
+ else
58
+ s.add_dependency(%q<rspec>, [">= 0"])
59
+ end
60
+ else
61
+ s.add_dependency(%q<rspec>, [">= 0"])
62
+ end
63
+ end
@@ -0,0 +1,117 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Precssious do
4
+ describe :process do
5
+ it "should handle regular styles" do
6
+ Precssious.process(%Q(
7
+ a {
8
+ color: black;
9
+ text-decoration: none;
10
+ }
11
+ )).should == "a { color: black; text-decoration: none; }"
12
+ end
13
+
14
+ it "should handle nested styles" do
15
+ Precssious.process(%Q(
16
+ a {
17
+ b {
18
+ color: blue;
19
+ }
20
+ }
21
+ )).should == "a b { color: blue; }"
22
+ end
23
+
24
+ it "should handle mixed nested and regular styles" do
25
+ Precssious.process(%Q(
26
+ a {
27
+ color: black;
28
+
29
+ b { color: blue; }
30
+ }
31
+ )).should == "a { color: black; }\na b { color: blue; }"
32
+ end
33
+
34
+ it "should handle listed (comma delimited) styles" do
35
+ Precssious.process(%Q(
36
+ a, b {
37
+ c {
38
+ font-weight: bold;
39
+ }
40
+ }
41
+ )).should == "a c, b c { font-weight: bold; }"
42
+ end
43
+
44
+ it "should handle nested listed styles" do
45
+ Precssious.process(%Q(
46
+ a, b {
47
+ c, d {
48
+ font-weight: bold;
49
+ }
50
+ }
51
+ )).should == "a c, a d, b c, b d { font-weight: bold; }"
52
+ end
53
+
54
+ it "should provide a reverse-order nesting using <>" do
55
+ Precssious.process(%Q(
56
+ a {
57
+ .outer <> { color: red; }
58
+ }
59
+ )).should == ".outer a { color: red; }"
60
+ end
61
+
62
+ it "should handle pseudoclasses" do
63
+ Precssious.process(%Q(
64
+ a { .to_movie1:hover { background-position: 0 -96px; } }
65
+ )).should == "a .to_movie1:hover { background-position: 0 -96px; }"
66
+ end
67
+
68
+ it "should handle regular listed classes" do
69
+ Precssious.process(%Q(
70
+ html, body { height: 100%; background: #c0c0c0; text-aling: center; }
71
+ )).should == "html, body { height: 100%; background: #c0c0c0; text-aling: center; }"
72
+ end
73
+
74
+ it "should allow for nested pseudoclass selectors" do
75
+ Precssious.process(%Q(
76
+ a { -:hover { text-decoration: underline; } }
77
+ )).should == "a:hover { text-decoration: underline; }"
78
+ end
79
+
80
+ it "should allow nesting on arbitrary 'same-selector' basis" do
81
+ Precssious.process(%Q(
82
+ img {
83
+ -.mood1 { background-position: 0 0; }
84
+ -.mood2 { background-position: -70px 0; }
85
+ }
86
+ )).should == "img.mood1 { background-position: 0 0; }\nimg.mood2 { background-position: -70px 0; }"
87
+ end
88
+
89
+ it "should allow nesting on arbitrary 'same-selector' basis, with nesting" do
90
+ Precssious.process(%Q(
91
+ img, p {
92
+ -.mood1 { background-position: 0 0; }
93
+ -.mood2 { background-position: -70px 0; }
94
+ }
95
+ )).should == "img.mood1, p.mood1 { background-position: 0 0; }\nimg.mood2, p.mood2 { background-position: -70px 0; }"
96
+ end
97
+
98
+ it "should ignore CSS comments" do
99
+ Precssious.process(%Q(
100
+ /* Prestyle comment. */
101
+ a {
102
+ color: black; /* One in here, too */
103
+ text-decoration: none;
104
+ }
105
+ )).should == "a { color: black; text-decoration: none; }"
106
+ end
107
+
108
+ it "should allow a special [ie6] selector" do
109
+ Precssious.process(%Q(
110
+ [ie6] a {
111
+ color: black;
112
+ text-decoration: none;
113
+ }
114
+ )).should == "a { color: black; text-decoration: none; }"
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,10 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'precssious'
5
+ require 'spec'
6
+ require 'spec/autorun'
7
+
8
+ Spec::Runner.configure do |config|
9
+
10
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: erikhansson-precssious
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Erik Hansson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-08-22 00:00:00 -07:00
13
+ default_executable: precssious
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: ""
26
+ email: erik@bits2life.com
27
+ executables:
28
+ - precssious
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - LICENSE
33
+ - README.rdoc
34
+ files:
35
+ - .document
36
+ - .gitignore
37
+ - LICENSE
38
+ - README.rdoc
39
+ - Rakefile
40
+ - VERSION
41
+ - bin/precssious
42
+ - lib/precssious.rb
43
+ - lib/precssious/preprocessor.rb
44
+ - lib/precssious/rails/controller.rb
45
+ - lib/precssious/rails/routes.rb
46
+ - lib/precssious/rule.rb
47
+ - lib/precssious/token.rb
48
+ - lib/precssious/value.rb
49
+ - precssious.gemspec
50
+ - spec/precssious_spec.rb
51
+ - spec/spec_helper.rb
52
+ has_rdoc: true
53
+ homepage: http://github.com/erikhansson/precssious
54
+ licenses:
55
+ post_install_message:
56
+ rdoc_options:
57
+ - --charset=UTF-8
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: "0"
71
+ version:
72
+ requirements: []
73
+
74
+ rubyforge_project:
75
+ rubygems_version: 1.3.5
76
+ signing_key:
77
+ specification_version: 2
78
+ summary: Merges CSS files and allows nested declarations
79
+ test_files:
80
+ - spec/precssious_spec.rb
81
+ - spec/spec_helper.rb