style_train 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/style_train/sheet.rb +14 -0
- data/lib/style_train/theme.rb +37 -0
- data/lib/style_train/themed_sheet.rb +35 -0
- data/lib/style_train.rb +10 -7
- data/spec/generated_files/.gitkeep +0 -0
- data/spec/sheet_spec.rb +43 -14
- data/spec/style_train_spec.rb +8 -0
- data/spec/theme_spec.rb +80 -0
- data/spec/themed_sheet_spec.rb +111 -0
- data/style_train.gemspec +14 -3
- metadata +29 -6
- data/lib/style_train/support/string.rb +0 -24
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/style_train/sheet.rb
CHANGED
@@ -230,5 +230,19 @@ module StyleTrain
|
|
230
230
|
def self.render(render_method=:content)
|
231
231
|
new.render(render_method)
|
232
232
|
end
|
233
|
+
|
234
|
+
def self.export opts={}
|
235
|
+
new.export opts
|
236
|
+
end
|
237
|
+
|
238
|
+
def export opts={}
|
239
|
+
name = file_name(opts[:file_name])
|
240
|
+
render opts[:render_method] || :content
|
241
|
+
File.open("#{StyleTrain.dir}/#{file_name}.css", 'w'){ |f| f.write(output) }
|
242
|
+
end
|
243
|
+
|
244
|
+
def file_name name=nil
|
245
|
+
name || self.class.to_s.underscore
|
246
|
+
end
|
233
247
|
end
|
234
248
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module StyleTrain
|
2
|
+
class Theme
|
3
|
+
attr_accessor :value_hash, :name
|
4
|
+
|
5
|
+
def self.required_keys *args
|
6
|
+
if args.empty?
|
7
|
+
@required_keys ||= []
|
8
|
+
else
|
9
|
+
@required_keys = args.map{ |v| v.to_sym }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.themes
|
14
|
+
@themes ||= Gnash.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(name, value_hash)
|
18
|
+
raise ArgumentError, "Unique name is required as first argument" if !name || self.class.themes[name]
|
19
|
+
missing_keys = self.class.required_keys - value_hash.keys
|
20
|
+
raise ArgumentError, "Required keys not provided: #{missing_keys.map{|k| k.inspect}.join(", ")}" if !missing_keys.empty?
|
21
|
+
self.value_hash = Gnash.new(value_hash)
|
22
|
+
self.name = name
|
23
|
+
self.class.themes[name] = self
|
24
|
+
end
|
25
|
+
|
26
|
+
def [](key)
|
27
|
+
value_hash[key]
|
28
|
+
end
|
29
|
+
|
30
|
+
def []=(key, value)
|
31
|
+
if (value.nil? || value.to_s.empty?) && self.class.required_keys.include?(key.to_sym)
|
32
|
+
raise "Cannot set a required key to nothing"
|
33
|
+
end
|
34
|
+
value_hash[key] = value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module StyleTrain
|
2
|
+
class ThemedSheet < Sheet
|
3
|
+
def self.themes(klass=nil)
|
4
|
+
if klass
|
5
|
+
if !klass.ancestors.include?(StyleTrain::Theme)
|
6
|
+
raise ArgumentError, "themes must be a StyleTrain::Theme class"
|
7
|
+
end
|
8
|
+
@themes = klass
|
9
|
+
else
|
10
|
+
raise ArgumentError, "No themes class is defined. Please add one with the class method #themes" unless @themes
|
11
|
+
@themes
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def theme
|
16
|
+
@theme || self.class.themes.themes[:default] || raise( "No theme has been set" )
|
17
|
+
end
|
18
|
+
|
19
|
+
def theme=(key)
|
20
|
+
(@theme = self.class.themes.themes[key]) || raise( ArgumentError, "Theme #{key.inspect} not found in #{self.class.themes}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.export
|
24
|
+
sheet = new
|
25
|
+
themes.themes.keys.each do |key|
|
26
|
+
sheet.theme = key
|
27
|
+
sheet.export
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def file_name name=nil
|
32
|
+
(name || self.class.to_s.underscore) + "_#{theme.name.to_s.underscore}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/style_train.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
$LOAD_PATH.unshift( File.dirname(__FILE__) )
|
2
2
|
|
3
|
-
# ruby libs
|
4
|
-
require 'singleton'
|
5
|
-
|
6
3
|
# Support stuff
|
4
|
+
require 'active_support/inflector'
|
7
5
|
require 'style_train/support/gnash'
|
8
|
-
require 'style_train/support/string'
|
9
6
|
require 'style_train/support/numbers'
|
10
7
|
|
8
|
+
module StyleTrain
|
9
|
+
class << self
|
10
|
+
attr_accessor :dir
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
11
14
|
# The color load!
|
12
15
|
require 'style_train/color_types/color_type'
|
13
16
|
require 'style_train/color_types/rgb_color'
|
@@ -15,8 +18,8 @@ require 'style_train/color_types/hsl_color'
|
|
15
18
|
require 'style_train/color_types/keyword_color'
|
16
19
|
require 'style_train/color_types/hex_color'
|
17
20
|
require "style_train/color"
|
18
|
-
# require 'lib/palette'
|
19
21
|
|
22
|
+
# Big Picture Stuff, sheets, themes, etc
|
20
23
|
require "style_train/sheet"
|
21
|
-
|
22
|
-
|
24
|
+
require 'style_train/theme'
|
25
|
+
require 'style_train/themed_sheet'
|
File without changes
|
data/spec/sheet_spec.rb
CHANGED
@@ -514,22 +514,22 @@ describe Sheet do
|
|
514
514
|
end
|
515
515
|
end
|
516
516
|
end
|
517
|
+
|
518
|
+
class StyleSheet < StyleTrain::Sheet
|
519
|
+
def content
|
520
|
+
body {
|
521
|
+
background :color => '#666'
|
522
|
+
text :font => 'verdana'
|
523
|
+
}
|
524
|
+
|
525
|
+
style('#wrapper'){
|
526
|
+
background :color => :white
|
527
|
+
margin [1.em, :auto]
|
528
|
+
}
|
529
|
+
end
|
530
|
+
end
|
517
531
|
|
518
532
|
describe 'subclassing' do
|
519
|
-
class StyleSheet < StyleTrain::Sheet
|
520
|
-
def content
|
521
|
-
body {
|
522
|
-
background :color => '#666'
|
523
|
-
text :font => 'verdana'
|
524
|
-
}
|
525
|
-
|
526
|
-
style('#wrapper'){
|
527
|
-
background :color => :white
|
528
|
-
margin [1.em, :auto]
|
529
|
-
}
|
530
|
-
end
|
531
|
-
end
|
532
|
-
|
533
533
|
it 'works' do
|
534
534
|
StyleSheet.render.should include(
|
535
535
|
<<-CSS
|
@@ -546,4 +546,33 @@ CSS
|
|
546
546
|
)
|
547
547
|
end
|
548
548
|
end
|
549
|
+
|
550
|
+
describe 'export' do
|
551
|
+
before :all do
|
552
|
+
@dir = File.dirname(__FILE__) + "/generated_files"
|
553
|
+
StyleTrain.dir = @dir
|
554
|
+
Dir.chdir(@dir)
|
555
|
+
end
|
556
|
+
|
557
|
+
before do
|
558
|
+
Dir.glob('*.css').each do |file|
|
559
|
+
File.delete(file)
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
it 'exports to the StyleTrain dir location' do
|
564
|
+
StyleSheet.export
|
565
|
+
Dir.glob('*.css').size.should == 1
|
566
|
+
end
|
567
|
+
|
568
|
+
it 'uses the class name underscored by default' do
|
569
|
+
StyleSheet.export
|
570
|
+
File.exist?(@dir + '/style_sheet.css').should == true
|
571
|
+
end
|
572
|
+
|
573
|
+
it 'uses an alternate name when provided' do
|
574
|
+
StyleSheet.new.export(:file_name => 'foo')
|
575
|
+
File.exists?(@dir + 'foo')
|
576
|
+
end
|
577
|
+
end
|
549
578
|
end
|
data/spec/theme_spec.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
Theme = StyleTrain::Theme unless defined?( Theme )
|
4
|
+
|
5
|
+
describe Theme do
|
6
|
+
class MyTheme < Theme
|
7
|
+
required_keys :foo, :bar
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'Theme.required_keys' do
|
11
|
+
it 'stores the values' do
|
12
|
+
MyTheme.instance_eval('@required_keys').should == [:foo, :bar]
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'retreives the keys when no argument is supplied' do
|
16
|
+
MyTheme.required_keys.should == [:foo, :bar]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'initialize' do
|
21
|
+
it 'should work if all the right arguments are provided' do
|
22
|
+
lambda { MyTheme.new(:default, :foo => '#666', :bar => 'white') }.should_not raise_error
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'requires a name' do
|
26
|
+
lambda { MyTheme.new(nil, :foo => '#666', :bar => 'white') }.should raise_error(
|
27
|
+
ArgumentError, "Unique name is required as first argument"
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'requires a unique name' do
|
32
|
+
MyTheme.new(:orange, :foo => 'orange', :bar => 'white')
|
33
|
+
lambda{ MyTheme.new(:orange, :foo => 'orange', :bar => 'cream') }.should raise_error(
|
34
|
+
ArgumentError, "Unique name is required as first argument"
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'requires a values hash contains required keys' do
|
39
|
+
lambda { MyTheme.new(:red, :foo => 'red') }.should raise_error(
|
40
|
+
ArgumentError, "Required keys not provided: :bar"
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'adds the theme to the themes hash' do
|
45
|
+
theme = MyTheme.new(:yellow, :foo => 'lightyellow', :bar => 'white')
|
46
|
+
MyTheme.themes[:yellow].should == theme
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'sets the value hash to value_hash accessor' do
|
50
|
+
theme = MyTheme.new(:maroon, :foo => 'maroon', :bar => 'white')
|
51
|
+
theme.value_hash.should == Gnash.new({:foo => 'maroon', :bar => 'white'})
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe 'usage' do
|
56
|
+
before :all do
|
57
|
+
@theme = MyTheme.new(:blue, :foo => 'blue', :bar => 'white', :extra => 'lightyellow')
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'values can be accessed via []' do
|
61
|
+
@theme[:foo].should == 'blue'
|
62
|
+
@theme[:bar].should == 'white'
|
63
|
+
@theme[:extra].should == 'lightyellow'
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'values can be set with []=' do
|
67
|
+
@theme[:bar] = 'cream'
|
68
|
+
@theme[:bar].should == 'cream'
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'raises an error if a required key is set to nil' do
|
72
|
+
lambda{ @theme[:foo] = nil }.should raise_error("Cannot set a required key to nothing")
|
73
|
+
lambda{ @theme[:extra] = nil }.should_not raise_error
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'raises an error if a required key is set to a blank string' do
|
77
|
+
lambda{ @theme[:foo] = '' }.should raise_error("Cannot set a required key to nothing")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
ThemedSheet = StyleTrain::ThemedSheet unless defined?( ThemedSheet )
|
4
|
+
|
5
|
+
describe ThemedSheet do
|
6
|
+
class FooeyTheme < StyleTrain::Theme
|
7
|
+
required_keys :foo, :bar
|
8
|
+
end
|
9
|
+
|
10
|
+
FooeyTheme.new(:default, {
|
11
|
+
:foo => '#666',
|
12
|
+
:bar => 'white'
|
13
|
+
})
|
14
|
+
|
15
|
+
FooeyTheme.new(:inverted, {
|
16
|
+
:foo => '#CCC',
|
17
|
+
:bar => 'black'
|
18
|
+
})
|
19
|
+
|
20
|
+
class FooeySheet < ThemedSheet
|
21
|
+
themes FooeyTheme
|
22
|
+
|
23
|
+
def content
|
24
|
+
style(:fooey){
|
25
|
+
color theme[:foo]
|
26
|
+
background :color => theme[:bar]
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "self.themes" do
|
32
|
+
it 'has a setter' do
|
33
|
+
ThemedSheet.instance_eval("@themes").should == nil
|
34
|
+
ThemedSheet.themes FooeyTheme
|
35
|
+
ThemedSheet.instance_eval("@themes").should == FooeyTheme
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'requires that it be set with a Theme class' do
|
39
|
+
lambda{ ThemedSheet.themes String }.should raise_error(
|
40
|
+
ArgumentError, "themes must be a StyleTrain::Theme class"
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'returns the class when no argument is given' do
|
45
|
+
ThemedSheet.themes FooeyTheme
|
46
|
+
ThemedSheet.themes.should == FooeyTheme
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'raises an error when no class exists' do
|
50
|
+
ThemedSheet.instance_eval "@themes = nil"
|
51
|
+
lambda{ ThemedSheet.themes }.should raise_error(
|
52
|
+
ArgumentError, "No themes class is defined. Please add one with the class method #themes"
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#theme' do
|
58
|
+
before :all do
|
59
|
+
@sheet = FooeySheet.new
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'throws an error if a theme class is not defined' do
|
63
|
+
ThemedSheet.instance_eval "@themes = nil"
|
64
|
+
sheet = ThemedSheet.new
|
65
|
+
lambda {sheet.theme}.should raise_error(
|
66
|
+
ArgumentError, "No themes class is defined. Please add one with the class method #themes"
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'will get the default theme if none is found' do
|
71
|
+
@sheet.theme.should == FooeyTheme.themes[:default]
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'can be set via any name in the theme class' do
|
75
|
+
@sheet.theme = :inverted
|
76
|
+
@sheet.theme.should == FooeyTheme.themes[:inverted]
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'will raise an error if the name is not found in the class' do
|
80
|
+
lambda{ @sheet.theme = :not_in_fooey }.should raise_error(
|
81
|
+
ArgumentError, "Theme :not_in_fooey not found in FooeyTheme"
|
82
|
+
)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'export' do
|
87
|
+
before :all do
|
88
|
+
@dir = File.dirname(__FILE__) + "/generated_files"
|
89
|
+
StyleTrain.dir = @dir
|
90
|
+
Dir.chdir(@dir)
|
91
|
+
end
|
92
|
+
|
93
|
+
before do
|
94
|
+
Dir.glob('*.css').each do |file|
|
95
|
+
File.delete(file)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'exports a file for each theme in the theme class' do
|
100
|
+
Dir.glob('*.css').size.should == 0
|
101
|
+
FooeySheet.export
|
102
|
+
Dir.glob('*.css').size.should == 2
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'uses the theme name when constructing the css file name' do
|
106
|
+
FooeySheet.export
|
107
|
+
File.exist?(@dir + '/fooey_sheet_default.css').should == true
|
108
|
+
File.exist?(@dir + '/fooey_sheet_inverted.css').should == true
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/style_train.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{style_train}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.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"]
|
@@ -30,16 +30,21 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/style_train/sheet.rb",
|
31
31
|
"lib/style_train/support/gnash.rb",
|
32
32
|
"lib/style_train/support/numbers.rb",
|
33
|
-
"lib/style_train/
|
33
|
+
"lib/style_train/theme.rb",
|
34
|
+
"lib/style_train/themed_sheet.rb",
|
34
35
|
"spec/color/color_spec.rb",
|
35
36
|
"spec/color/color_type_spec.rb",
|
36
37
|
"spec/color/hex_color_spec.rb",
|
37
38
|
"spec/color/keyword_color_spec.rb",
|
38
39
|
"spec/color/rgb_color_spec.rb",
|
40
|
+
"spec/generated_files/.gitkeep",
|
39
41
|
"spec/numbers_spec.rb",
|
40
42
|
"spec/sheet_spec.rb",
|
41
43
|
"spec/spec.opts",
|
42
44
|
"spec/spec_helper.rb",
|
45
|
+
"spec/style_train_spec.rb",
|
46
|
+
"spec/theme_spec.rb",
|
47
|
+
"spec/themed_sheet_spec.rb",
|
43
48
|
"style_train.gemspec",
|
44
49
|
"utils/alexch_color_gist/color.rb",
|
45
50
|
"utils/alexch_color_gist/color_test.rb",
|
@@ -58,7 +63,10 @@ Gem::Specification.new do |s|
|
|
58
63
|
"spec/color/rgb_color_spec.rb",
|
59
64
|
"spec/numbers_spec.rb",
|
60
65
|
"spec/sheet_spec.rb",
|
61
|
-
"spec/spec_helper.rb"
|
66
|
+
"spec/spec_helper.rb",
|
67
|
+
"spec/style_train_spec.rb",
|
68
|
+
"spec/theme_spec.rb",
|
69
|
+
"spec/themed_sheet_spec.rb"
|
62
70
|
]
|
63
71
|
|
64
72
|
if s.respond_to? :specification_version then
|
@@ -66,9 +74,12 @@ Gem::Specification.new do |s|
|
|
66
74
|
s.specification_version = 3
|
67
75
|
|
68
76
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
77
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 3.0.0"])
|
69
78
|
else
|
79
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.0"])
|
70
80
|
end
|
71
81
|
else
|
82
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.0"])
|
72
83
|
end
|
73
84
|
end
|
74
85
|
|
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:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kane Baccigalupi
|
@@ -17,8 +17,23 @@ cert_chain: []
|
|
17
17
|
|
18
18
|
date: 2011-02-17 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
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
|
22
37
|
description: 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.
|
23
38
|
email: baccigalupi@gmail.com
|
24
39
|
executables: []
|
@@ -42,16 +57,21 @@ files:
|
|
42
57
|
- lib/style_train/sheet.rb
|
43
58
|
- lib/style_train/support/gnash.rb
|
44
59
|
- lib/style_train/support/numbers.rb
|
45
|
-
- lib/style_train/
|
60
|
+
- lib/style_train/theme.rb
|
61
|
+
- lib/style_train/themed_sheet.rb
|
46
62
|
- spec/color/color_spec.rb
|
47
63
|
- spec/color/color_type_spec.rb
|
48
64
|
- spec/color/hex_color_spec.rb
|
49
65
|
- spec/color/keyword_color_spec.rb
|
50
66
|
- spec/color/rgb_color_spec.rb
|
67
|
+
- spec/generated_files/.gitkeep
|
51
68
|
- spec/numbers_spec.rb
|
52
69
|
- spec/sheet_spec.rb
|
53
70
|
- spec/spec.opts
|
54
71
|
- spec/spec_helper.rb
|
72
|
+
- spec/style_train_spec.rb
|
73
|
+
- spec/theme_spec.rb
|
74
|
+
- spec/themed_sheet_spec.rb
|
55
75
|
- style_train.gemspec
|
56
76
|
- utils/alexch_color_gist/color.rb
|
57
77
|
- utils/alexch_color_gist/color_test.rb
|
@@ -100,3 +120,6 @@ test_files:
|
|
100
120
|
- spec/numbers_spec.rb
|
101
121
|
- spec/sheet_spec.rb
|
102
122
|
- spec/spec_helper.rb
|
123
|
+
- spec/style_train_spec.rb
|
124
|
+
- spec/theme_spec.rb
|
125
|
+
- spec/themed_sheet_spec.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# From ActiveSupport
|
2
|
-
|
3
|
-
unless String.instance_methods.include?( 'constantize' )
|
4
|
-
class String
|
5
|
-
# Constantize tries to find a declared constant with the name specified
|
6
|
-
# in the string. It raises a NameError when the name is not in CamelCase
|
7
|
-
# or is not initialized.
|
8
|
-
#
|
9
|
-
# @example
|
10
|
-
# "Module".constantize #=> Module
|
11
|
-
# "Class".constantize #=> Class
|
12
|
-
def constantize
|
13
|
-
unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ self
|
14
|
-
raise NameError, "#{self.inspect} is not a valid constant name!"
|
15
|
-
end
|
16
|
-
|
17
|
-
Object.module_eval("::#{$1}", __FILE__, __LINE__)
|
18
|
-
end
|
19
|
-
|
20
|
-
def dasherize
|
21
|
-
self.gsub('_', '-') || self
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|