style_train 0.2.4 → 0.3.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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.4
1
+ 0.3.0
@@ -1,20 +1,29 @@
1
1
  module StyleTrain
2
2
  class Sheet
3
- attr_accessor :output, :indent_level
3
+ attr_accessor :output, :level, :contexts
4
4
 
5
5
  def initialize(opts={})
6
- self.output = ''
7
- self.indent_level = 0
6
+ self.output = []
7
+ self.contexts = []
8
+ self.level = 0
8
9
  end
9
10
 
10
- def render render_method = :content
11
- self.output = header
11
+ def render render_method = :content, opts={}
12
+ self.output = [header]
12
13
  if render_method == :content
13
14
  content
14
15
  else
15
16
  send render_method
16
17
  end
17
- output
18
+ if opts[:type]
19
+ render_type = opts[:type]
20
+ joiner = "\n"
21
+ else
22
+ render_type = :full
23
+ joiner = "\n\n"
24
+ end
25
+
26
+ output.map{|s| s.is_a?(String) ? s : s.render( render_type ) }.join(joiner)
18
27
  end
19
28
 
20
29
  def header
@@ -25,52 +34,44 @@ module StyleTrain
25
34
  CSS
26
35
  end
27
36
 
28
- def style(selector)
29
- self.output << "\n"
30
- if selector.is_a?(String) || TAGS.include?(selector)
31
- self.output << "#{selector}"
32
- else
33
- self.output << ".#{selector}"
34
- end
35
- self.output << " {"
37
+ def style(*selectors)
38
+ s = Style.new(:selectors => selectors, :level => level, :context => context)
39
+ self.output << s
40
+ self.contexts.unshift( s )
36
41
  if block_given?
37
- self.indent_level += 2
38
- yield
39
- self.indent_level -= 2
42
+ self.level += 1
43
+ yield
44
+ self.level -= 1
40
45
  end
41
- self.output << "\n}\n"
42
- end
43
-
44
- TAGS = [
45
- :a, :abbr, :acronym, :address, :area, :b, :base, :bdo,
46
- :big, :blockquote, :body, :br, :button, :caption, :center,
47
- :cite, :code, :col, :colgroup, :dd, :del, :dfn, :div,
48
- :dl, :dt, :em, :embed, :fieldset, :form, :frame, :frameset,
49
- :h1, :h2, :h3, :h4, :h5, :h6, :head, :hr, :html, :i, :iframe,
50
- :img, :input, :ins, :kbd, :label, :legend, :li, :link,
51
- :map, :meta, :noframes, :noscript, :object, :ol, :optgroup,
52
- :option, :p, :param, :pre, :q, :s, :samp, :script, :select,
53
- :small, :span, :strike, :strong, :sub, :sup, :table,
54
- :tbody, :td, :textarea, :tfoot, :th, :thead, :title,
55
- :tr, :tt, :u, :ul, :var
56
- ]
46
+ self.contexts.shift
47
+ end
48
+
49
+ def context
50
+ contexts.first
51
+ end
52
+
53
+ alias :c :style
54
+
55
+ TAGS = StyleTrain::Style::TAGS
57
56
 
58
57
  TAGS.each do |tag|
59
58
  class_eval <<-RUBY
60
- def #{tag} &block
61
- style( '#{tag}', &block )
59
+ def #{tag}(*selectors, &block)
60
+ if selectors.size > 0
61
+ selectors = selectors.map{ |e| '#{tag}' + '.' + e.to_s }
62
+ style( *selectors, &block )
63
+ else
64
+ style( '#{tag}', &block )
65
+ end
62
66
  end
63
67
  RUBY
64
68
  end
65
69
 
66
- def indent
67
- " " * indent_level
68
- end
69
70
 
70
71
  def property( label, value )
71
72
  value = value.join(' ') if value.is_a?(Array)
72
- str = "\n#{indent}#{label}: #{value};"
73
- self.output << str
73
+ str = "#{label}: #{value};"
74
+ self.context.properties << str
74
75
  str
75
76
  end
76
77
 
@@ -366,8 +367,8 @@ CSS
366
367
 
367
368
  def export opts={}
368
369
  name = file_name(opts[:file_name])
369
- render opts[:render_method] || :content
370
- File.open("#{StyleTrain.dir}/#{file_name}.css", 'w'){ |f| f.write(output) }
370
+ str = render (opts[:render_method] || :content), opts
371
+ File.open("#{StyleTrain.dir}/#{file_name}.css", 'w'){ |f| f.write(str) }
371
372
  end
372
373
 
373
374
  def file_name name=nil
@@ -0,0 +1,84 @@
1
+ module StyleTrain
2
+ class Style
3
+ attr_accessor :selectors, :level, :properties
4
+
5
+ def initialize(opts)
6
+ self.level = opts[:level].to_i
7
+ self.selectors = []
8
+ self.properties = []
9
+ set_selectors opts[:selectors], opts[:context] && opts[:context].selectors
10
+ end
11
+
12
+ def set_selectors values, contexts
13
+ if contexts
14
+ contexts.each do |context|
15
+ values.each do |value|
16
+ self.selectors << "#{context} #{make_selector(value)}"
17
+ end
18
+ end
19
+ else
20
+ values.each do |value|
21
+ self.selectors << make_selector(value)
22
+ end
23
+ end
24
+ end
25
+
26
+ TAGS = [
27
+ :a, :abbr, :acronym, :address, :area, :b, :base, :bdo,
28
+ :big, :blockquote, :body, :br, :button, :caption, :center,
29
+ :cite, :code, :col, :colgroup, :dd, :del, :dfn, :div,
30
+ :dl, :dt, :em, :embed, :fieldset, :form, :frame, :frameset,
31
+ :h1, :h2, :h3, :h4, :h5, :h6, :head, :hr, :html, :i, :iframe,
32
+ :img, :input, :ins, :kbd, :label, :legend, :li, :link,
33
+ :map, :meta, :noframes, :noscript, :object, :ol, :optgroup,
34
+ :option, :p, :param, :pre, :q, :s, :samp, :script, :select,
35
+ :small, :span, :strike, :strong, :sub, :sup, :table,
36
+ :tbody, :td, :textarea, :tfoot, :th, :thead, :title,
37
+ :tr, :tt, :u, :ul, :var
38
+ ]
39
+
40
+ def make_selector(value)
41
+ value.is_a?(String) || TAGS.include?(value) ? "#{value}" : ".#{value}"
42
+ end
43
+
44
+ INDENT = ' '
45
+
46
+ def render(type=:full)
47
+ type == :full ? render_full : render_linear
48
+ end
49
+
50
+ alias :to_s :render
51
+
52
+ def render_full
53
+ str = ""
54
+
55
+ # selectors
56
+ array = selectors.dup
57
+ last_selector = array.pop
58
+ array.each do |selector|
59
+ str << "#{indent}#{selector},\n"
60
+ end
61
+ str << "#{indent}#{last_selector} {"
62
+
63
+ # properties
64
+ properties.each do |property|
65
+ str << "\n#{indent(1)}#{property}"
66
+ end
67
+ str << "\n#{indent}}"
68
+
69
+ str
70
+ end
71
+
72
+ def render_linear
73
+ str = "#{indent}"
74
+ str << selectors.join(', ')
75
+ str << " { "
76
+ str << properties.join(' ')
77
+ str << " }"
78
+ end
79
+
80
+ def indent(plus=0)
81
+ INDENT * (level+plus)
82
+ end
83
+ end
84
+ end
data/lib/style_train.rb CHANGED
@@ -24,6 +24,7 @@ require 'style_train/color_types/hex_color'
24
24
  require "style_train/color"
25
25
 
26
26
  # Big Picture Stuff, sheets, themes, etc
27
+ require 'style_train/style'
27
28
  require "style_train/sheet"
28
29
  require 'style_train/theme'
29
30
  require 'style_train/themed_sheet'
File without changes
File without changes
@@ -0,0 +1,34 @@
1
+ class Contexting
2
+ attr_accessor :context, :last_context
3
+
4
+ def style(*selectors)
5
+ self.last_context = context
6
+ self.context = Style.new(selectors)
7
+ yield if block_given?
8
+ self.context = last_context
9
+ end
10
+
11
+ def render
12
+ style(:outer) {
13
+ puts context
14
+ style(:inner){
15
+ puts context
16
+ }
17
+ puts context
18
+ }
19
+ end
20
+ end
21
+
22
+ class Style
23
+ attr_accessor :selectors
24
+
25
+ def initialize(selectors)
26
+ self.selectors = selectors
27
+ end
28
+
29
+ def to_s
30
+ "<Style selectors=#{selectors.inspect}>"
31
+ end
32
+ end
33
+
34
+ Contexting.new.render
File without changes
File without changes
@@ -0,0 +1,89 @@
1
+ /*
2
+ Generated by StlyeTrain CSS generator via the class Cohuman
3
+ */
4
+ body {
5
+ font-family: Verdana Sans;
6
+ font-size: 13px;
7
+ line-height: 1.5;
8
+ }
9
+
10
+ h1 {
11
+ font-size: 25px;
12
+ }
13
+
14
+ h2 {
15
+ font-size: 23px;
16
+ }
17
+
18
+ h3 {
19
+ font-size: 18px;
20
+ }
21
+
22
+ h3 {
23
+ margin-left: 0;
24
+ margin-top: 0;
25
+ margin-bottom: 0;
26
+ margin-right: 0;
27
+ }
28
+
29
+ h4 {
30
+ font-size: 16px;
31
+ }
32
+
33
+ h5 {
34
+ font-size: 11px;
35
+ }
36
+
37
+ h6 {
38
+ font-size: 10px;
39
+ }
40
+
41
+ hr {
42
+ border: none;
43
+ height: 1px;
44
+ color: gray;
45
+ background-color: gray;
46
+ }
47
+
48
+ .create_button {
49
+ font-weight: bold;
50
+ font-size: 8em;
51
+ border: 1px solid black;
52
+ color: gray;
53
+ cursor: pointer;
54
+ padding: 0 0.5em;
55
+ }
56
+
57
+ .activity_button {
58
+ display: inline-block;
59
+ position: relative;
60
+ overflow: visible;
61
+ padding-left: 0;
62
+ padding-top: 0;
63
+ padding-bottom: 0;
64
+ padding-right: 0;
65
+ font-weight: bold;
66
+ font-size: 0.8em;
67
+ cursor: pointer;
68
+ color: gray;
69
+ border: 1px solid black;
70
+ }
71
+
72
+ .user_info {
73
+ padding: 10px 10px 0px 10px;
74
+ width: 500px;
75
+ overflow-x: hidden;
76
+ }
77
+
78
+ .user_info h1 {
79
+ margin: -4px 0 -2px 0;
80
+ font-size: 1.5em;
81
+ }
82
+
83
+ .user_info .my_class {
84
+ padding: 2em;
85
+ }
86
+
87
+ .user_info < p {
88
+ padding: 1em;
89
+ }
@@ -0,0 +1,66 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ class Cohuman < StyleTrain::Sheet
4
+ def content
5
+ body {
6
+ font :size => 13.px, :family => "Verdana Sans", :height => 1.5
7
+ }
8
+
9
+ h1 { font :size => 25.px}
10
+ h2 { font :size => 23.px}
11
+ h3 { font :size => 18.px}
12
+ h3 { margin 0 }
13
+ h4 { font :size => 16.px}
14
+ h5 { font :size => 11.px}
15
+ h6 { font :size => 10.px}
16
+
17
+ hr {
18
+ border :none
19
+ height 1.px
20
+ color :gray
21
+ background :color => :gray
22
+ }
23
+
24
+ c(:create_button) {
25
+ font :weight => :bold, :size => 8.em
26
+ border :color => :black
27
+ color :gray
28
+ cursor :pointer
29
+ padding 0, 0.5.em
30
+ }
31
+
32
+ c(:activity_button) {
33
+ display 'inline-block'
34
+ position :relative
35
+ overflow :visible
36
+ padding 0
37
+ font :weight => :bold, :size => 0.8.em
38
+ cursor :pointer
39
+ color :gray
40
+ border :color => :black
41
+ }
42
+
43
+ c(:user_info) {
44
+ padding 10.px, 10.px, 0.px, 10.px
45
+ width 500.px;
46
+ overflow :x => :hidden
47
+
48
+ h1 {
49
+ margin -4.px, 0, -2.px, 0
50
+ font :size => 1.5.em
51
+ }
52
+
53
+ c(:my_class){
54
+ padding 2.em
55
+ }
56
+
57
+ c('< p'){
58
+ padding 1.em
59
+ }
60
+ }
61
+ end
62
+ end
63
+
64
+ @dir = File.dirname(__FILE__) + "/generated_files"
65
+ StyleTrain.dir = @dir
66
+ Cohuman.export
data/spec/sheet_spec.rb CHANGED
@@ -14,6 +14,10 @@ describe Sheet do
14
14
  background :color => :white
15
15
  margin [1.em, :auto]
16
16
  }
17
+
18
+ style(:foo){
19
+ color :red
20
+ }
17
21
  end
18
22
  end
19
23
 
@@ -28,12 +32,16 @@ describe Sheet do
28
32
  @sheet.output.should == 'foo'
29
33
  end
30
34
 
31
- it 'output gets set to an empty string on initialize' do
32
- Sheet.new.output.should == ''
35
+ it 'output gets set to an empty array on initialize' do
36
+ Sheet.new.output.should == []
37
+ end
38
+
39
+ it 'should have contexts' do
40
+ Sheet.new.contexts.should == []
33
41
  end
34
42
 
35
- it 'should have an indent_level that is initialized to 0' do
36
- Sheet.new.indent_level.should == 0
43
+ it 'should have an indent level that is initialized to 0' do
44
+ Sheet.new.level.should == 0
37
45
  end
38
46
  end
39
47
 
@@ -52,7 +60,7 @@ CSS
52
60
 
53
61
  it 'resets the output' do
54
62
  @sheet.stub(:header).and_return('HEADER')
55
- @sheet.should_receive(:output=).with('HEADER')
63
+ @sheet.should_receive(:output=).with(['HEADER'])
56
64
  @sheet.render
57
65
  end
58
66
 
@@ -67,11 +75,18 @@ CSS
67
75
  @sheet.render :foo
68
76
  end
69
77
 
70
- it 'returns the output' do
71
- @sheet.output = "bar"
78
+ it 'returns the output joined by 2 line ends' do
79
+ @sheet.output = ["bar", "baz"]
72
80
  @sheet.stub(:output=)
73
- @sheet.stub(:content).and_return('foo')
74
- @sheet.render.should == "bar"
81
+ @sheet.stub(:content)
82
+ @sheet.render.should == "bar\n\nbaz"
83
+ end
84
+
85
+ it 'joins with one line break when a render type is specified' do
86
+ @sheet.output = ['bar', 'baz']
87
+ @sheet.stub!(:output=)
88
+ @sheet.stub!(:content)
89
+ @sheet.render(:content, :type => :linear).should == "bar\nbaz"
75
90
  end
76
91
  end
77
92
 
@@ -80,37 +95,31 @@ CSS
80
95
  @sheet = Sheet.new
81
96
  end
82
97
 
83
- it 'adds an entry to the output' do
84
- @sheet.output.should == ""
98
+ it 'adds an Style object to the output' do
99
+ @sheet.output.size.should == 0
85
100
  @sheet.style(:foo)
86
- @sheet.output.should_not == ""
87
- end
88
-
89
- it 'renders the right style when passed a string' do
90
- @sheet.style('.foo')
91
- @sheet.output.should include '.foo'
101
+ @sheet.output.size.should == 1
102
+ @sheet.output.first.class.should == StyleTrain::Style
92
103
  end
93
104
 
94
- it 'renders the right selecter when passed a non-tag symbol' do
95
- @sheet.style(:bar)
96
- @sheet.output.should include '.bar'
97
- end
98
-
99
- it 'renders the right style when passed a tag symbol' do
100
- @sheet.style(:body)
101
- @sheet.output.should include 'body'
102
- @sheet.output.should_not include '.body'
103
- end
104
-
105
- it 'renders {} when not passed a block' do
106
- @sheet.style(:body)
107
- @sheet.output.should include "body {\n}"
108
- end
105
+ describe 'Style object selector' do
106
+ it 'is correct when passed a string' do
107
+ @sheet.style('.foo')
108
+ style = @sheet.output.first
109
+ style.should_not be_nil
110
+ style.selectors.should == ['.foo']
111
+ style.render.should include '.foo'
112
+ end
109
113
 
110
- describe 'receiving a block' do
111
- end
114
+ it 'is correct when passed a non-tag symbol' do
115
+ @sheet.style(:bar)
116
+ @sheet.output.first.selectors.should == ['.bar']
117
+ end
112
118
 
113
- describe 'nesting' do
119
+ it 'is correct when passed a tag symbol' do
120
+ @sheet.style(:body)
121
+ @sheet.output.first.selectors.should == ['body']
122
+ end
114
123
  end
115
124
  end
116
125
 
@@ -126,28 +135,21 @@ CSS
126
135
 
127
136
  it "should add a style for '#{tag}'" do
128
137
  @sheet.send(tag)
129
- @sheet.output.should include "#{tag} {\n}"
138
+ @sheet.output.first.render.should include "#{tag} {\n}"
130
139
  end
131
140
  end
132
-
133
- it 'should pass the block on to the style method' do
134
- str = @sheet.instance_eval <<-RUBY
135
- body do
136
- margin [2.em, :auto]
137
- end
138
- RUBY
139
- str.should include 'margin: 2em auto'
140
- end
141
141
  end
142
142
 
143
143
  describe 'properties' do
144
144
  before :all do
145
145
  @sheet = Sheet.new
146
+ @style = StyleTrain::Style.new(:selectors => ['body'], :level => 2)
147
+ @sheet.contexts << @style
148
+ @sheet.output << @style
146
149
  end
147
150
 
148
151
  describe '#property' do
149
152
  before :all do
150
- @sheet.indent_level = 4
151
153
  @property = @sheet.property('border', '1px solid #ccc' )
152
154
  end
153
155
 
@@ -155,10 +157,6 @@ CSS
155
157
  @property.is_a?(String).should be_true
156
158
  end
157
159
 
158
- it 'adds a line break and an indent to the front of the string' do
159
- @property.match(/^\W{5}/).should_not be_nil
160
- end
161
-
162
160
  it 'includes the property name' do
163
161
  @property.should include 'border'
164
162
  end
@@ -172,11 +170,11 @@ CSS
172
170
  end
173
171
 
174
172
  it 'puts it all together correctly' do
175
- @property.should == "\n border: 1px solid #ccc;"
173
+ @property.should == "border: 1px solid #ccc;"
176
174
  end
177
175
 
178
- it 'adds the string to the output' do
179
- @sheet.output.should include @property
176
+ it 'adds the string the style object' do
177
+ @sheet.output.map{|e| e.render }.join(' ').should include @property
180
178
  end
181
179
 
182
180
  it 'converts an array to a space separated string' do
@@ -583,6 +581,9 @@ CSS
583
581
  describe 'css 3 goodies' do
584
582
  before :all do
585
583
  @sheet = Sheet.new
584
+ @style = StyleTrain::Style.new(:selectors => ['body'], :level => 2)
585
+ @sheet.contexts << @style
586
+ @sheet.output << @style
586
587
  end
587
588
 
588
589
  describe '#corners' do
@@ -757,8 +758,7 @@ CSS
757
758
  describe 'subclassing' do
758
759
  it 'works' do
759
760
  StyleSheet.render.should include(
760
- <<-CSS
761
- body {
761
+ "body {
762
762
  background-color: #666;
763
763
  font-family: verdana;
764
764
  }
@@ -767,7 +767,10 @@ body {
767
767
  background-color: white;
768
768
  margin: 1em auto;
769
769
  }
770
- CSS
770
+
771
+ .foo {
772
+ color: red;
773
+ }"
771
774
  )
772
775
  end
773
776
  end
@@ -801,26 +804,113 @@ CSS
801
804
  end
802
805
  end
803
806
 
804
- describe 'alternative syntax' do
805
- # Available operators for overloading
806
- # |, ^, &, <=>, ==, ===, =~, >, >=, <, <=, +, -, *, /, %, **, <<, >>, ~, +@, -@, [], []= (2 args)
807
+ describe 'expanded syntax' do
808
+ class Expanded < Sheet
809
+ def content
810
+ c( :abridged_syntax )
811
+
812
+ c( :first, :second, :third ) {
813
+ background :color => :black
814
+ }
815
+
816
+ div( :next, :again ){
817
+ color :red
818
+ }
819
+ end
820
+ end
807
821
 
808
- # input[:readonly]{ ... }
809
- # input['type=text']{ ... }
810
- # div :input { ... }
822
+ before :all do
823
+ @sheet = Expanded.new
824
+ end
811
825
 
826
+ it 'aliases #style to #s' do
827
+ @sheet.render.should match /^\.abridged_syntax/
828
+ end
812
829
 
813
- # how to handle :hover and other psuedo selectors
830
+ it 'assigns multiple arguments to comma separated' do
831
+ @sheet.render.should include <<-CSS
832
+ .first,
833
+ .second,
834
+ .third {
835
+ background-color: black;
836
+ }
837
+ CSS
838
+ end
814
839
 
815
- # o :create_button {
816
- #
817
- # o :hover {
818
- #
819
- # }
840
+ it 'tags take arguments too' do
841
+ @sheet.render.should include "
842
+ div.next,
843
+ div.again {
844
+ color: red;
845
+ }"
846
+ end
847
+
848
+ describe 'nesting' do
849
+ class Nested < Sheet
850
+ def content
851
+ style(:form){
852
+ border :color => '#666'
853
+ padding 1.em
854
+
855
+ # first level nesting
856
+ style(:label){
857
+ display :block
858
+ width 10.em
859
+
860
+ # second level nesting
861
+ style(:input){
862
+ color '#111'
863
+ }
864
+ }
865
+
866
+ # property after the nesting
867
+ color :blue
868
+ }
869
+
870
+ style(:a) {
871
+ text :decoration => :none
872
+ }
873
+ end
874
+ end
875
+
876
+ before :all do
877
+ @output = Nested.render
878
+ end
820
879
 
821
- # < :active {
822
- #
823
- # }
824
- # }
880
+ it 'makes a separate declaration for the first level nested style' do
881
+ @output.should match /^form \{$/
882
+ @output.should match /^\W*form label \{$/
883
+ end
884
+
885
+ it 'makes a separate declaration for deeply nested styles' do
886
+ @output.should match /^\W*form label input \{$/
887
+ end
888
+
889
+ it 'should indent the nested style to the right level' do
890
+ @output.should match /^\W{2}*form label \{$/
891
+ @output.should match /^\W{4}*form label \{$/
892
+ end
893
+
894
+ it 'puts property declarations after a nested style in the right place' do
895
+ @output.should include
896
+ "
897
+ form {
898
+ border: 1px solid #666;
899
+ padding: 1em;
900
+ color: blue;
901
+ }
902
+ "
903
+ end
904
+
905
+ it 'makes base level declarations correctly after nesting' do
906
+ @output.should match /^a \{$/
907
+ end
908
+ end
909
+
910
+ # input[:readonly]{ ... }
911
+ # input['type=text']{ ... }
912
+ # how to handle :hover and other psuedo selectors
913
+ # p.classy < a
914
+ # #css method on objects that allows instance eval of blocks globally
825
915
  end
826
916
  end
@@ -0,0 +1,139 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ Style = StyleTrain::Style unless defined?( Style )
4
+
5
+ describe Style do
6
+ before :all do
7
+ @selectors = [:p, :classy]
8
+ @context = Style.new( :selectors =>['a.special'] )
9
+ end
10
+
11
+ describe 'level' do
12
+ it 'is 0 by default' do
13
+ Style.new(:selectors => @selectors).level.should == 0
14
+ end
15
+
16
+ it 'can be initialized to something else' do
17
+ Style.new(:level => 3, :selectors => @selectors).level.should == 3
18
+ end
19
+ end
20
+
21
+ describe 'selectors' do
22
+ it 'makes the correct selectors' do
23
+ Style.new(:selectors => @selectors).selectors.should == ['p', '.classy']
24
+ end
25
+
26
+ it 'takes into account the context' do
27
+ Style.new(:selectors => @selectors, :context => @context).selectors.should == ['a.special p', 'a.special .classy']
28
+ end
29
+ end
30
+
31
+ describe 'properties' do
32
+ it 'is an empty array after initialization' do
33
+ Style.new(:selectors => @selectors, :properties => ["some: thing;"]).properties.should == []
34
+ end
35
+
36
+ it 'adds property declarations' do
37
+ style = Style.new(:selectors => @selectors)
38
+ style.properties << "background-color: red"
39
+ style.properties.size.should == 1
40
+ style.properties.first.should == "background-color: red"
41
+ end
42
+ end
43
+
44
+ describe 'rendering' do
45
+ describe 'types' do
46
+ before :all do
47
+ @style = Style.new(:selectors => @selectors)
48
+ end
49
+
50
+ it 'renders full by default' do
51
+ @style.should_receive(:render_full)
52
+ @style.render
53
+ end
54
+
55
+ it 'renders minimized if an argument is passed in' do
56
+ @style.should_receive(:render_linear)
57
+ @style.render(:something_else)
58
+ end
59
+ end
60
+
61
+ describe 'full' do
62
+ before :all do
63
+ style = Style.new(:selectors => @selectors)
64
+ style.properties << 'background-color: yellow;' << 'color: maroon;'
65
+ @first_level = style.render
66
+
67
+ style = Style.new(:selectors => @selectors, :context => @context, :level => 3)
68
+ style.properties << 'background-color: yellow;' << 'color: maroon;'
69
+ @indented = style.render
70
+ end
71
+
72
+ it 'puts the selectors at the correct indent level on a new line' do
73
+ @first_level.should match(/^p,/)
74
+ @first_level.should match(/^\.classy/)
75
+
76
+ @indented.should match(/^\W{6}a\.special p,/)
77
+ @indented.should match(/^\W{6}a\.special \.classy/)
78
+ end
79
+
80
+ it 'brackets the properties' do
81
+ @first_level.should match(/\{$/)
82
+ @first_level.should match(/^\}/)
83
+
84
+ @indented.should match(/\{$/)
85
+ @indented.should match(/^\W{6}\}/)
86
+ end
87
+
88
+ it 'puts each property on a new line' do
89
+ @first_level.should match(/^\W*background-color: yellow;$/)
90
+ @first_level.should match(/^\W*color: maroon;$/)
91
+
92
+ @indented.should match(/^\W*background-color: yellow;$/)
93
+ @indented.should match(/^\W*color: maroon;$/)
94
+ end
95
+
96
+ it 'puts the properties at the correct level' do
97
+ @first_level.should match(/^\W{2}background/)
98
+ @first_level.should match(/^\W{2}color/)
99
+
100
+ @indented.should match(/^\W{8}background/)
101
+ @indented.should match(/^\W{8}color/)
102
+ end
103
+ end
104
+
105
+ describe 'linear' do
106
+ before :all do
107
+ style = Style.new(:selectors => @selectors)
108
+ style.properties << 'background-color: yellow;' << 'color: maroon;'
109
+ @first_level = style.render(:linear)
110
+
111
+ style = Style.new(:selectors => @selectors, :context => @context, :level => 3)
112
+ style.properties << 'background-color: yellow;' << 'color: maroon;'
113
+ @indented = style.render(:linear)
114
+
115
+ @properties = 'background-color: yellow; color: maroon;'
116
+ end
117
+
118
+ it 'puts the selectors at the correct indent level' do
119
+ @first_level.should match(/\Ap,/)
120
+ @indented.should match(/\A\W{6}a\.special p,/)
121
+ end
122
+
123
+ it 'separates the selectors with a comma and a space' do
124
+ @first_level.should match /p, \.classy /
125
+ @indented.should match /a\.special p, a\.special \.classy /
126
+ end
127
+
128
+ it 'separates the properties with a space' do
129
+ @first_level.should include @properties
130
+ @indented.should include @properties
131
+ end
132
+
133
+ it 'puts the bracketed properties on the same line as the selectors' do
134
+ @first_level.should match /\Ap.*\}\z/
135
+ @indented.should match /\A\W*a\.special.*\}\z/
136
+ end
137
+ end
138
+ end
139
+ end
data/style_train.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{style_train}
8
- s.version = "0.2.4"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kane Baccigalupi"]
12
- s.date = %q{2011-02-25}
12
+ s.date = %q{2011-02-28}
13
13
  s.description = %q{style_train builds CSS using pure Ruby, not a DSL interpreted via Ruby. This allows inheritance, modules, instance level calculations and all the goodness Ruby can offer.}
14
14
  s.email = %q{baccigalupi@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -28,28 +28,33 @@ Gem::Specification.new do |s|
28
28
  "lib/style_train/color_types/keyword_color.rb",
29
29
  "lib/style_train/color_types/rgb_color.rb",
30
30
  "lib/style_train/sheet.rb",
31
+ "lib/style_train/style.rb",
31
32
  "lib/style_train/support/gnash.rb",
32
33
  "lib/style_train/support/numbers.rb",
33
34
  "lib/style_train/theme.rb",
34
35
  "lib/style_train/themed_sheet.rb",
36
+ "research/alexch_color_gist/color.rb",
37
+ "research/alexch_color_gist/color_test.rb",
38
+ "research/contexting.rb",
39
+ "research/overview.txt",
40
+ "research/stylesheet.txt",
35
41
  "spec/color/color_spec.rb",
36
42
  "spec/color/color_type_spec.rb",
37
43
  "spec/color/hex_color_spec.rb",
38
44
  "spec/color/keyword_color_spec.rb",
39
45
  "spec/color/rgb_color_spec.rb",
40
46
  "spec/generated_files/.gitkeep",
47
+ "spec/integration.css",
48
+ "spec/integration_spec.rb",
41
49
  "spec/numbers_spec.rb",
42
50
  "spec/sheet_spec.rb",
43
51
  "spec/spec.opts",
44
52
  "spec/spec_helper.rb",
53
+ "spec/style_spec.rb",
45
54
  "spec/style_train_spec.rb",
46
55
  "spec/theme_spec.rb",
47
56
  "spec/themed_sheet_spec.rb",
48
- "style_train.gemspec",
49
- "utils/alexch_color_gist/color.rb",
50
- "utils/alexch_color_gist/color_test.rb",
51
- "utils/overview.txt",
52
- "utils/stylesheet.txt"
57
+ "style_train.gemspec"
53
58
  ]
54
59
  s.homepage = %q{http://github.com/baccigalupi/style_train}
55
60
  s.require_paths = ["lib"]
@@ -61,9 +66,11 @@ Gem::Specification.new do |s|
61
66
  "spec/color/hex_color_spec.rb",
62
67
  "spec/color/keyword_color_spec.rb",
63
68
  "spec/color/rgb_color_spec.rb",
69
+ "spec/integration_spec.rb",
64
70
  "spec/numbers_spec.rb",
65
71
  "spec/sheet_spec.rb",
66
72
  "spec/spec_helper.rb",
73
+ "spec/style_spec.rb",
67
74
  "spec/style_train_spec.rb",
68
75
  "spec/theme_spec.rb",
69
76
  "spec/themed_sheet_spec.rb"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: style_train
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 4
10
- version: 0.2.4
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kane Baccigalupi
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-25 00:00:00 -08:00
18
+ date: 2011-02-28 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -53,28 +53,33 @@ files:
53
53
  - lib/style_train/color_types/keyword_color.rb
54
54
  - lib/style_train/color_types/rgb_color.rb
55
55
  - lib/style_train/sheet.rb
56
+ - lib/style_train/style.rb
56
57
  - lib/style_train/support/gnash.rb
57
58
  - lib/style_train/support/numbers.rb
58
59
  - lib/style_train/theme.rb
59
60
  - lib/style_train/themed_sheet.rb
61
+ - research/alexch_color_gist/color.rb
62
+ - research/alexch_color_gist/color_test.rb
63
+ - research/contexting.rb
64
+ - research/overview.txt
65
+ - research/stylesheet.txt
60
66
  - spec/color/color_spec.rb
61
67
  - spec/color/color_type_spec.rb
62
68
  - spec/color/hex_color_spec.rb
63
69
  - spec/color/keyword_color_spec.rb
64
70
  - spec/color/rgb_color_spec.rb
65
71
  - spec/generated_files/.gitkeep
72
+ - spec/integration.css
73
+ - spec/integration_spec.rb
66
74
  - spec/numbers_spec.rb
67
75
  - spec/sheet_spec.rb
68
76
  - spec/spec.opts
69
77
  - spec/spec_helper.rb
78
+ - spec/style_spec.rb
70
79
  - spec/style_train_spec.rb
71
80
  - spec/theme_spec.rb
72
81
  - spec/themed_sheet_spec.rb
73
82
  - style_train.gemspec
74
- - utils/alexch_color_gist/color.rb
75
- - utils/alexch_color_gist/color_test.rb
76
- - utils/overview.txt
77
- - utils/stylesheet.txt
78
83
  has_rdoc: true
79
84
  homepage: http://github.com/baccigalupi/style_train
80
85
  licenses: []
@@ -115,9 +120,11 @@ test_files:
115
120
  - spec/color/hex_color_spec.rb
116
121
  - spec/color/keyword_color_spec.rb
117
122
  - spec/color/rgb_color_spec.rb
123
+ - spec/integration_spec.rb
118
124
  - spec/numbers_spec.rb
119
125
  - spec/sheet_spec.rb
120
126
  - spec/spec_helper.rb
127
+ - spec/style_spec.rb
121
128
  - spec/style_train_spec.rb
122
129
  - spec/theme_spec.rb
123
130
  - spec/themed_sheet_spec.rb