sassy 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ .AppleDouble
2
+ .rvmrc
3
+ .rspec
4
+ sassy*.gem
data/LICENSE ADDED
@@ -0,0 +1 @@
1
+ Sassy by Austin Schneider is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License (http://creativecommons.org/licenses/by-sa/3.0/).
@@ -0,0 +1,31 @@
1
+ module Sassy
2
+ module SCSS
3
+ class Builder
4
+
5
+ def initialize(&block)
6
+ instance_eval(&block)
7
+ end
8
+
9
+ delegate :to_scss, :to => :rule_set
10
+
11
+ def r(selector, &block)
12
+ rule_set.add(selector, &block)
13
+ end
14
+
15
+ private
16
+
17
+ def rule_set
18
+ @rule_set ||= RuleSet.new
19
+ end
20
+
21
+ def method_missing(method, *args, &block)
22
+ if block_given?
23
+ rule_set.add(Rule.new(method, &block))
24
+ else
25
+ super
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ require Sassy.root.join('scss', 'is_scss')
2
+
3
+ module Sassy
4
+ module SCSS
5
+ class Declaration
6
+
7
+ include IsSCSS
8
+
9
+ def initialize(property, value)
10
+ raise ArgumentError if [property, value].any?(&:blank?)
11
+ @property = property
12
+ @value = value
13
+ end
14
+
15
+ def to_scss
16
+ "#{@property}: #{@value};"
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ require 'set'
2
+ require Sassy.root.join('scss', 'is_scss')
3
+
4
+ module Sassy
5
+ module SCSS
6
+ class DeclarationSet
7
+
8
+ include IsSCSS
9
+
10
+ def add(*args)
11
+ set << if args.size == 1 && args[0].is_a?(Declaration)
12
+ args[0]
13
+ else
14
+ Declaration.new(*args)
15
+ end
16
+ end
17
+
18
+ def to_scss
19
+ set.to_a.map(&:to_scss).sort.join(" ")
20
+ end
21
+
22
+ delegate :empty?, :to => :set
23
+
24
+ private
25
+
26
+ def set
27
+ @set ||= Set.new
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,26 @@
1
+ module Sassy
2
+ module SCSS
3
+ module IsSCSS
4
+
5
+ def self.included(base)
6
+ base.send(:include, Comparable)
7
+ base.send(:include, InstanceMethods)
8
+ end
9
+
10
+ module InstanceMethods
11
+ def <=>(other)
12
+ to_scss <=> other.to_scss
13
+ end
14
+
15
+ def eql?(other)
16
+ to_scss.eql?(other.to_scss)
17
+ end
18
+
19
+ def hash
20
+ to_scss.hash
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,52 @@
1
+ require 'set'
2
+ require Sassy.root.join('scss', 'is_scss')
3
+
4
+ module Sassy
5
+ module SCSS
6
+ class Rule
7
+
8
+ include IsSCSS
9
+
10
+ def initialize(selector, &block)
11
+ raise ArgumentError if selector.blank?
12
+ @selector = selector
13
+ instance_eval(&block) if block_given?
14
+ end
15
+
16
+ def declarations
17
+ @declarations ||= DeclarationSet.new
18
+ end
19
+
20
+ def rules
21
+ @rules ||= RuleSet.new
22
+ end
23
+
24
+ def r(selector, &block)
25
+ rules.add(selector, &block)
26
+ end
27
+
28
+ def d(property, value)
29
+ declarations.add(property, value)
30
+ end
31
+
32
+ def to_scss
33
+ a = ["#{@selector} {"]
34
+ a << declarations.to_scss unless declarations.empty?
35
+ a << rules.to_scss unless rules.empty?
36
+ a << "}"
37
+ a.join(" ")
38
+ end
39
+
40
+ private
41
+
42
+ def method_missing(method, *args, &block)
43
+ if block_given?
44
+ r(method, &block)
45
+ else
46
+ d(method.to_s.gsub('_', '-'), args[0])
47
+ end
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,40 @@
1
+ require 'set'
2
+ require Sassy.root.join('scss', 'is_scss')
3
+
4
+ module Sassy
5
+ module SCSS
6
+ class RuleSet
7
+
8
+ include IsSCSS
9
+
10
+ def initialize(&block)
11
+ instance_eval(&block) if block_given?
12
+ end
13
+
14
+ def add(rule_or_selector, &block)
15
+ set << case rule_or_selector
16
+ when Rule
17
+ rule_or_selector
18
+ else
19
+ Rule.new(rule_or_selector, &block)
20
+ end
21
+ end
22
+
23
+ # TODO: test this
24
+ def to_scss
25
+ set.to_a.map(&:to_scss).sort.join(" ")
26
+ end
27
+
28
+ # TODO: test this
29
+ delegate :empty?, :to => :set
30
+
31
+ private
32
+
33
+ # TODO: test this
34
+ def set
35
+ @set ||= Set.new
36
+ end
37
+
38
+ end
39
+ end
40
+ end
data/lib/sassy/scss.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'rubygems'
2
+ require 'active_support/core_ext/object'
3
+ require Sassy.root.join('scss', 'builder')
4
+
5
+ module Sassy
6
+ module SCSS
7
+ class << self
8
+ def build(&block)
9
+ Builder.new(&block).to_scss
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ %w(rule declaration declaration_set rule_set).each do |f|
16
+ require Sassy.root.join('scss', f)
17
+ end
data/lib/sassy.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'pathname'
2
+
3
+ module Sassy
4
+ class << self
5
+ def root
6
+ @@root ||= Pathname(File.dirname(__FILE__)).expand_path.join('sassy')
7
+ end
8
+ end
9
+ end
10
+
11
+ require Sassy.root.join('scss')
data/sassy.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'sassy'
3
+ s.version = '0.0.1'
4
+ s.authors = ["Austin Schneider"]
5
+ s.email = "soccer022483@gmail.com"
6
+ s.description = 'Sassy'
7
+ s.homepage = ""
8
+ s.summary = "Sassy; copyright 2010 Austin Schneider"
9
+ s.post_install_message = "Thanks for installing Sassy!"
10
+ s.files = Dir[
11
+ '.gitignore',
12
+ 'lib/**/*',
13
+ 'LICENSE',
14
+ 'README',
15
+ 'sassy.gemspec',
16
+ 'spec/**/*'
17
+ ].to_a
18
+ s.test_files = []
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency 'activesupport', '>= 3.0.0'
22
+ s.add_development_dependency 'rspec', '>= 2.0.0.beta.22'
23
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sassy::SCSS::DeclarationSet do
4
+
5
+ describe ".new" do
6
+ it "returns an instance of Sassy::SCSS::DeclarationSet" do
7
+ Sassy::SCSS::DeclarationSet.new.should be_an_instance_of(Sassy::SCSS::DeclarationSet)
8
+ end
9
+ end
10
+
11
+ describe "instance methods" do
12
+ before { @ds = Sassy::SCSS::DeclarationSet.new }
13
+
14
+ describe "#add" do
15
+ it "creates a declaration with the args" do
16
+ args = ["background", "green"]
17
+ Sassy::SCSS::Declaration.should_receive(:new).with(*args)
18
+ @ds.add(*args)
19
+ end
20
+
21
+ it "adds the declaration to the set" do
22
+ declaration = mock(Sassy::SCSS::Declaration)
23
+ Sassy::SCSS::Declaration.stub!(:new => declaration)
24
+ @ds.add
25
+ @ds.send(:set).should be_include(declaration)
26
+ end
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sassy::SCSS::Declaration do
4
+
5
+ describe ".new" do
6
+ [
7
+ [],
8
+ [nil],
9
+ [nil, nil],
10
+ ['property'],
11
+ ['property', nil],
12
+ [nil, 'value'],
13
+ [nil, nil]
14
+ ].each do |args|
15
+ context "when the args are #{args.inspect}" do
16
+ before { @args = args }
17
+
18
+ it "raises an error" do
19
+ lambda { Sassy::SCSS::Declaration.new(*@args) }.should raise_error(ArgumentError)
20
+ end
21
+ end
22
+ end
23
+
24
+ [
25
+ ['property', 'value']
26
+ ].each do |args|
27
+ context "when the args are #{args.inspect}" do
28
+ before { @args = args }
29
+
30
+ it "returns an instance of Sassy::SCSS::Declaration" do
31
+ Sassy::SCSS::Declaration.new(*@args).should be_an_instance_of(Sassy::SCSS::Declaration)
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ describe "instance methods" do
38
+ before do
39
+ @d = Sassy::SCSS::Declaration.new('color', 'red')
40
+ end
41
+
42
+ describe "#to_scss" do
43
+ context "when the property is 'color' and the value is 'red'" do
44
+ it("returns 'color: red;'") { @d.to_scss.should == 'color: red;' }
45
+ end
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ class TestClass
4
+ include Sassy::SCSS::IsSCSS
5
+
6
+ def to_scss
7
+ "c: d;"
8
+ end
9
+ end
10
+
11
+ describe TestClass do
12
+ describe "instance methods" do
13
+ before { @tc = TestClass.new }
14
+
15
+ describe "#<=>" do
16
+ it "compares the to_scss" do
17
+ other = mock(TestClass, :to_scss => "a: b;")
18
+ @tc.stub!(:to_scss => @tc.to_scss)
19
+ @tc.to_scss.should_receive(:<=>).with(other.to_scss)
20
+ @tc <=> other
21
+ end
22
+ end
23
+
24
+ describe "#eql?" do
25
+ it "compares the to_scss" do
26
+ other = mock(TestClass, :to_scss => "a: b;")
27
+ @tc.stub!(:to_scss => @tc.to_scss)
28
+ @tc.to_scss.should_receive(:eql?).with(other.to_scss)
29
+ @tc.eql?(other)
30
+ end
31
+ end
32
+
33
+ describe "#hash" do
34
+ it "returns the scss hash" do
35
+ @tc.hash.should == @tc.to_scss.hash
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sassy::SCSS::RuleSet do
4
+
5
+ describe ".new" do
6
+ it "returns an instance of Sassy::SCSS::RuleSet" do
7
+ Sassy::SCSS::RuleSet.new.should be_an_instance_of(Sassy::SCSS::RuleSet)
8
+ end
9
+
10
+ context "given a block" do
11
+ it "calls instance_eval" do
12
+ Sassy::SCSS::RuleSet.new do
13
+ self.class.should == Sassy::SCSS::RuleSet
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ describe "instance methods" do
20
+ before { @rs = Sassy::SCSS::RuleSet.new }
21
+
22
+ describe "#add" do
23
+ context "with a non-rule" do
24
+ before { @selector = "body" }
25
+
26
+ it "creates a rule" do
27
+ Sassy::SCSS::Rule.should_receive(:new).with(@selector)
28
+ @rs.add(@selector)
29
+ end
30
+
31
+ it "adds the rule to the set" do
32
+ rule = Sassy::SCSS::Rule.new(@selector)
33
+ Sassy::SCSS::Rule.stub!(:new => rule)
34
+ @rs.add(rule)
35
+ @rs.send(:set).should be_include(rule)
36
+ end
37
+ end
38
+
39
+ context "with a rule" do
40
+ it "adds the rule to the set" do
41
+ rule = Sassy::SCSS::Rule.new(".header")
42
+ @rs.add(rule)
43
+ @rs.send(:set).should be_include(rule)
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sassy::SCSS::Rule do
4
+
5
+ describe ".new" do
6
+ [[], [nil]].each do |args|
7
+ context "when the args are #{args.inspect}" do
8
+ before { @args = args }
9
+
10
+ it "raises an ArgumentError" do
11
+ lambda { Sassy::SCSS::Rule.new(*@args) }.should raise_error(ArgumentError)
12
+ end
13
+ end
14
+ end
15
+
16
+ [[".header"]].each do |args|
17
+ context "when the args are #{args.inspect}" do
18
+ before { @args = args }
19
+
20
+ it "returns an instance of Sassy::SCSS::Rule" do
21
+ Sassy::SCSS::Rule.new(@args).should be_an_instance_of(Sassy::SCSS::Rule)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ describe "instance methods" do
28
+ before { @r = Sassy::SCSS::Rule.new('body') }
29
+
30
+ describe "#declarations" do
31
+ context "when hasn't been called before" do
32
+ it "returns a DeclarationSet" do
33
+ @r.declarations.should be_an_instance_of(Sassy::SCSS::DeclarationSet)
34
+ end
35
+
36
+ it("the returned set is empty") { @r.declarations.should be_empty }
37
+ end
38
+
39
+ context "after being called once" do
40
+ before { @ds = @r.declarations }
41
+
42
+ it("returns the same Set") { @r.declarations.should equal(@ds) }
43
+ end
44
+ end
45
+
46
+ describe "#rules" do
47
+ context "when hasn't been called before" do
48
+ it("returns a RuleSet") { @r.rules.should be_an_instance_of(Sassy::SCSS::RuleSet) }
49
+
50
+ it("the returned set is empty") { @r.rules.should be_empty }
51
+ end
52
+
53
+ context "after being called once" do
54
+ before { @rs = @r.rules }
55
+
56
+ it("returns the same Set") { @r.rules.should equal(@rs) }
57
+ end
58
+ end
59
+
60
+ describe "#to_scss" do
61
+ it "returns scss" do
62
+ @r.to_scss.should == "body { }"
63
+ end
64
+
65
+ context "after adding a rule" do
66
+ before { @r.rules.add(".header") }
67
+
68
+ it "return scss" do
69
+ @r.to_scss.should == "body { .header { } }"
70
+ end
71
+ end
72
+
73
+ context "after adding a declaration" do
74
+ before { @r.declarations.add("color", "green") }
75
+
76
+ it "returns scss" do
77
+ @r.to_scss.should == "body { color: green; }"
78
+ end
79
+
80
+ context "after adding a rule" do
81
+ before { @r.rules.add(".header") }
82
+
83
+ it "return scss" do
84
+ @r.to_scss.should == "body { color: green; .header { } }"
85
+ end
86
+ end
87
+
88
+ context "after adding another declaration" do
89
+ before { @r.declarations.add("font-weight", "bold") }
90
+
91
+ it "returns scss" do
92
+ @r.to_scss.should == "body { color: green; font-weight: bold; }"
93
+ end
94
+ end
95
+
96
+ context "after adding the same declaration" do
97
+ before { @r.declarations.add("color", "green") }
98
+
99
+ it "returns scss" do
100
+ @r.to_scss.should == "body { color: green; }"
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sassy::SCSS do
4
+
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sassy do
4
+
5
+ end
@@ -0,0 +1,8 @@
1
+ require 'rspec'
2
+ # optionally add autorun support
3
+ # require 'rspec/autorun'
4
+ require 'sassy'
5
+
6
+ Rspec.configure do |c|
7
+ c.mock_with :rspec
8
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sassy
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Austin Schneider
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-06 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: activesupport
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 3
32
+ - 0
33
+ - 0
34
+ version: 3.0.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 62196431
46
+ segments:
47
+ - 2
48
+ - 0
49
+ - 0
50
+ - beta
51
+ - 22
52
+ version: 2.0.0.beta.22
53
+ type: :development
54
+ version_requirements: *id002
55
+ description: Sassy
56
+ email: soccer022483@gmail.com
57
+ executables: []
58
+
59
+ extensions: []
60
+
61
+ extra_rdoc_files: []
62
+
63
+ files:
64
+ - .gitignore
65
+ - lib/sassy/scss/declaration.rb
66
+ - lib/sassy/scss/builder.rb
67
+ - lib/sassy/scss/rule.rb
68
+ - lib/sassy/scss/is_scss.rb
69
+ - lib/sassy/scss/declaration_set.rb
70
+ - lib/sassy/scss/rule_set.rb
71
+ - lib/sassy/scss.rb
72
+ - lib/sassy.rb
73
+ - LICENSE
74
+ - sassy.gemspec
75
+ - spec/spec_helper.rb
76
+ - spec/lib/sassy/scss_spec.rb
77
+ - spec/lib/sassy/scss/is_scss_spec.rb
78
+ - spec/lib/sassy/scss/declaration_spec.rb
79
+ - spec/lib/sassy/scss/rule_spec.rb
80
+ - spec/lib/sassy/scss/declaration_set_spec.rb
81
+ - spec/lib/sassy/scss/rule_set_spec.rb
82
+ - spec/lib/sassy_spec.rb
83
+ has_rdoc: true
84
+ homepage: ""
85
+ licenses: []
86
+
87
+ post_install_message: Thanks for installing Sassy!
88
+ rdoc_options: []
89
+
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ hash: 3
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ hash: 3
107
+ segments:
108
+ - 0
109
+ version: "0"
110
+ requirements: []
111
+
112
+ rubyforge_project:
113
+ rubygems_version: 1.3.7
114
+ signing_key:
115
+ specification_version: 3
116
+ summary: Sassy; copyright 2010 Austin Schneider
117
+ test_files: []
118
+