sassy 0.0.1

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/.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
+