fontcustom 1.1.0.pre → 1.1.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/TODO.md +20 -5
  3. data/lib/fontcustom.rb +42 -4
  4. data/lib/fontcustom/cli.rb +65 -25
  5. data/lib/fontcustom/generator/font.rb +26 -26
  6. data/lib/fontcustom/generator/template.rb +29 -30
  7. data/lib/fontcustom/options.rb +207 -23
  8. data/lib/fontcustom/templates/_fontcustom-bootstrap-ie7.scss +9 -9
  9. data/lib/fontcustom/templates/_fontcustom-bootstrap.scss +19 -19
  10. data/lib/fontcustom/templates/_fontcustom-rails.scss +28 -0
  11. data/lib/fontcustom/templates/_fontcustom.scss +11 -11
  12. data/lib/fontcustom/templates/fontcustom-bootstrap-ie7.css +9 -9
  13. data/lib/fontcustom/templates/fontcustom-bootstrap.css +19 -19
  14. data/lib/fontcustom/templates/fontcustom-preview.html +34 -7
  15. data/lib/fontcustom/templates/fontcustom.css +11 -11
  16. data/lib/fontcustom/templates/fontcustom.yml +11 -6
  17. data/lib/fontcustom/util.rb +38 -159
  18. data/lib/fontcustom/version.rb +1 -1
  19. data/lib/fontcustom/watcher.rb +16 -14
  20. data/spec/fixtures/generators/.fontcustom-data-corrupted +18 -0
  21. data/spec/fixtures/generators/fontcustom.yml +1 -0
  22. data/spec/fixtures/{util/fontcustom.yml → options/any-file-name.yml} +0 -0
  23. data/spec/fixtures/{util → options}/config-is-in-dir/fontcustom.yml +0 -0
  24. data/spec/fixtures/options/fontcustom-empty.yml +1 -0
  25. data/spec/fixtures/{util → options}/fontcustom-malformed.yml +0 -0
  26. data/spec/fixtures/options/fontcustom.yml +1 -0
  27. data/spec/fixtures/options/no-config-here/.gitkeep +0 -0
  28. data/spec/fixtures/{util → options}/rails-like/config/fontcustom.yml +0 -0
  29. data/spec/fontcustom/generator/font_spec.rb +31 -15
  30. data/spec/fontcustom/generator/template_spec.rb +20 -18
  31. data/spec/fontcustom/options_spec.rb +428 -0
  32. data/spec/fontcustom/util_spec.rb +38 -336
  33. data/spec/fontcustom/watcher_spec.rb +7 -2
  34. data/spec/spec_helper.rb +1 -2
  35. metadata +23 -13
  36. data/lib/fontcustom/actions.rb +0 -28
  37. data/spec/fontcustom/actions_spec.rb +0 -22
@@ -1,3 +1,3 @@
1
1
  module Fontcustom
2
- VERSION = "1.1.0.pre"
2
+ VERSION = "1.1.0.pre2"
3
3
  end
@@ -5,36 +5,38 @@ module Fontcustom
5
5
  class Watcher
6
6
  def initialize(opts)
7
7
  @opts = opts
8
- @vector_listener = Listen.to(@opts[:input][:vectors]).relative_paths(true).filter(/\.(eps|svg)$/).change(&callback)
8
+ @vector_listener = Listen.to(@opts.input[:vectors]).relative_paths(true).filter(/\.(eps|svg)$/).change(&callback)
9
9
 
10
- templates = @opts[:templates].dup
10
+ templates = @opts.templates.dup
11
11
  templates.delete_if do |template|
12
- template.match Util.gem_lib_path
12
+ template.match Fontcustom.gem_lib
13
13
  end
14
14
  unless templates.empty?
15
15
  templates = templates.map do |template|
16
16
  File.basename template
17
17
  end
18
- @template_listener = Listen.to(@opts[:input][:templates]).relative_paths(true).filter(/(#{templates.join("|")})/).change(&callback)
18
+ @template_listener = Listen.to(@opts.input[:templates]).relative_paths(true).filter(/(#{templates.join("|")})/).change(&callback)
19
19
  end
20
20
 
21
- @opts[:blocking] = @opts[:blocking] == false ? false : true
22
- unless @opts[:blocking]
23
- @vector_listener = @vector_listener.polling_fallback_message(false)
24
- @template_listener = @template_listener.polling_fallback_message(false) if @template_listener
21
+ # Modified to allow testing
22
+ @is_test = @opts.instance_variable_get :@is_test
23
+ if @is_test
24
+ @vector_listener = @vector_listener.polling_fallback_message(false)
25
+ @template_listener = @template_listener.polling_fallback_message(false) if @template_listener
25
26
  end
26
27
  end
27
28
 
28
29
  def watch
29
- puts "Font Custom is watching your icons at #{@opts[:input][:vectors]}. Press Ctrl + C to stop."
30
- compile unless @opts[:skip_first]
30
+ puts "Font Custom is watching your icons at #{@opts.input[:vectors]}. Press Ctrl + C to stop."
31
+ compile unless @opts.skip_first
31
32
 
32
- if @opts[:blocking]
33
- @vector_listener.start!
34
- @template_listener.start! if @template_listener
35
- else
33
+ # Non-blocking if test
34
+ if @is_test
36
35
  @vector_listener.start
37
36
  @template_listener.start if @template_listener
37
+ else
38
+ @vector_listener.start!
39
+ @template_listener.start! if @template_listener
38
40
  end
39
41
 
40
42
  rescue Fontcustom::Error => e
@@ -0,0 +1,18 @@
1
+ 'Totally invalid JSON.'
2
+ {
3
+ 'fonts": [
4
+ "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.woff",
5
+ "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.ttf",
6
+ "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.eot",
7
+ "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.svg"
8
+ ],
9
+ "templates": [
10
+ "fontcustom.css"
11
+ ],
12
+ "file_name": "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e",
13
+ "glyphs": [
14
+ "a_r3ally-exotic-f1le-name",
15
+ "c",
16
+ "d"
17
+ ]
18
+ }
@@ -0,0 +1 @@
1
+ # noop
@@ -0,0 +1 @@
1
+ # nothing
@@ -0,0 +1 @@
1
+ font_name: Custom Name From Config
File without changes
@@ -1,8 +1,13 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Fontcustom::Generator::Font do
4
+ # Silence messages without passing :verbose => false to everything
5
+ before(:each) do
6
+ Fontcustom::Options.any_instance.stub :say_message
7
+ end
8
+
4
9
  def generator(options)
5
- opts = Fontcustom::Util.collect_options options
10
+ opts = Fontcustom::Options.new(options)
6
11
  Fontcustom::Generator::Font.new([opts])
7
12
  end
8
13
 
@@ -39,7 +44,8 @@ describe Fontcustom::Generator::Font do
39
44
  it "should assign empty data model if data file is empty or missing" do
40
45
  options = {
41
46
  :project_root => fixture,
42
- :input => "shared/vectors"
47
+ :input => "shared/vectors",
48
+ :verbose => false
43
49
  }
44
50
  gen = generator options
45
51
  gen.get_data
@@ -50,13 +56,28 @@ describe Fontcustom::Generator::Font do
50
56
  it "should assign @data from data file" do
51
57
  options = {
52
58
  :project_root => fixture,
59
+ :config => "generators",
53
60
  :input => "shared/vectors",
54
- :output => "mixed-output"
61
+ :output => "mixed-output",
62
+ :verbose => false
55
63
  }
56
64
  gen = generator options
57
65
  gen.get_data
58
66
  data = gen.instance_variable_get("@data")
59
- data[:fonts] =~ data_file_contents[:fonts]
67
+ data.should_not == Fontcustom::DATA_MODEL
68
+ end
69
+
70
+ it "should throw an error if the data file is corrupted." do
71
+ options = {
72
+ :project_root => fixture,
73
+ :config => "generators",
74
+ :data_cache => "generators/.fontcustom-data-corrupted",
75
+ :input => "shared/vectors",
76
+ :output => "mixed-output",
77
+ :verbose => false
78
+ }
79
+ gen = generator options
80
+ expect { gen.get_data }.to raise_error Fontcustom::Error, /corrupted/
60
81
  end
61
82
  end
62
83
 
@@ -70,8 +91,7 @@ describe Fontcustom::Generator::Font do
70
91
  }
71
92
  gen = generator options
72
93
  gen.stub :remove_file
73
- gen.stub :append_to_file
74
- gen.stub :clear_file
94
+ gen.stub :overwrite_file
75
95
  gen.instance_variable_set(:@data, data_file_contents)
76
96
  gen
77
97
  end
@@ -95,8 +115,7 @@ describe Fontcustom::Generator::Font do
95
115
 
96
116
  it "should update the data file" do
97
117
  file = fixture(".fontcustom-data")
98
- subject.should_receive(:clear_file).once.with(file)
99
- subject.should_receive(:append_to_file).once.with(file, /"fonts":/, :verbose => false)
118
+ subject.should_receive(:overwrite_file).once.with(file, /"fonts":/)
100
119
  subject.reset_output
101
120
  end
102
121
 
@@ -175,7 +194,7 @@ describe Fontcustom::Generator::Font do
175
194
  )
176
195
  gen.instance_variable_set :@data, data_file_contents
177
196
  stdout = capture(:stdout) { gen.announce_files }
178
- stdout.should =~ /created.+\.(woff|ttf|eot|svg)/
197
+ stdout.should =~ /create.+\.(woff|ttf|eot|svg)/
179
198
  end
180
199
 
181
200
  it "should print nothing if verbose is false" do
@@ -198,12 +217,10 @@ describe Fontcustom::Generator::Font do
198
217
  :input => "shared/vectors",
199
218
  :output => "output"
200
219
  )
201
- gen.stub :clear_file
202
- gen.stub :append_to_file
220
+ gen.stub :overwrite_file
203
221
  gen.instance_variable_set(:@data, data_file_contents)
204
222
  file = File.join fixture(".fontcustom-data")
205
- gen.should_receive(:clear_file).once.with(file)
206
- gen.should_receive(:append_to_file).once.with do |path, content|
223
+ gen.should_receive(:overwrite_file).once.with do |path, content|
207
224
  path.should == file
208
225
  content.should match(/"fonts":/)
209
226
  content.should match(/"glyphs":/)
@@ -218,8 +235,7 @@ describe Fontcustom::Generator::Font do
218
235
  :output => "output",
219
236
  :verbose => false
220
237
  )
221
- gen.stub :clear_file
222
- gen.stub :append_to_file
238
+ gen.stub :overwrite_file
223
239
  gen.instance_variable_set(:@data, data_file_contents)
224
240
  stdout = capture(:stdout) { gen.save_data }
225
241
  stdout.should == ""
@@ -1,8 +1,13 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Fontcustom::Generator::Template do
4
+ # Silence messages without passing :verbose => false to everything
5
+ before(:each) do
6
+ Fontcustom::Options.any_instance.stub :say_message
7
+ end
8
+
4
9
  def generator(options)
5
- opts = Fontcustom::Util.collect_options options
10
+ opts = Fontcustom::Options.new(options)
6
11
  Fontcustom::Generator::Template.new([opts])
7
12
  end
8
13
 
@@ -10,16 +15,18 @@ describe Fontcustom::Generator::Template do
10
15
  it "should raise error if data file doesn't exist" do
11
16
  gen = generator(
12
17
  :project_root => fixture,
13
- :input => "shared/vectors"
18
+ :input => "shared/vectors",
19
+ :verbose => false
14
20
  )
15
- expect { gen.get_data }.to raise_error Fontcustom::Error, /no \.fontcustom-data/
21
+ expect { gen.get_data }.to raise_error Fontcustom::Error, /\.fontcustom-data is required/
16
22
  end
17
23
 
18
24
  # TODO ensure data file is correct
19
25
  it "should assign @data from data file" do
20
26
  gen = generator(
21
27
  :project_root => fixture("generators"),
22
- :input => "../shared/vectors"
28
+ :input => "../shared/vectors",
29
+ :verbose => false
23
30
  )
24
31
  gen.get_data
25
32
  gen.instance_variable_get(:@data)[:templates].should =~ data_file_contents[:templates]
@@ -35,8 +42,7 @@ describe Fontcustom::Generator::Template do
35
42
  :verbose => false
36
43
  )
37
44
  gen.stub :remove_file
38
- gen.stub :clear_file
39
- gen.stub :append_to_file
45
+ gen.stub :overwrite_file
40
46
  gen.instance_variable_set(:@data, data_file_contents)
41
47
  gen
42
48
  end
@@ -60,8 +66,7 @@ describe Fontcustom::Generator::Template do
60
66
 
61
67
  it "should update the data file" do
62
68
  file = fixture("generators/.fontcustom-data")
63
- subject.should_receive(:clear_file).once.with(file)
64
- subject.should_receive(:append_to_file).once.with(file, /"templates":/, :verbose => false)
69
+ subject.should_receive(:overwrite_file).once.with(file, /"templates":/)
65
70
  subject.reset_output
66
71
  end
67
72
 
@@ -72,17 +77,17 @@ describe Fontcustom::Generator::Template do
72
77
  end
73
78
 
74
79
  context "#make_relative_paths" do
75
- it "should assign :css_to_fonts and :preview_to_css" do
80
+ it "should assign :css_to_fonts, :preview_to_fonts, and :preprocessor_to_fonts" do
76
81
  gen = generator(
77
82
  :project_root => fixture,
78
83
  :input => "shared/vectors",
79
- :output => {:fonts => "foo/fonts", :css => "output/css", :preview => ""}
84
+ :output => {:fonts => "foo/fonts", :css => "output/css", :preview => "views/"}
80
85
  )
81
86
  gen.instance_variable_set "@data", data_file_contents
82
87
  gen.make_relative_paths
83
88
  data = gen.instance_variable_get("@data")
84
89
  data[:paths][:css_to_fonts].should match("../../foo/fonts")
85
- data[:paths][:preview_to_css].should match("output/css/")
90
+ data[:paths][:preview_to_fonts].should match("../foo/fonts")
86
91
  data[:paths][:preprocessor_to_fonts].should eq(data[:paths][:css_to_fonts])
87
92
  end
88
93
 
@@ -109,7 +114,6 @@ describe Fontcustom::Generator::Template do
109
114
  gen.make_relative_paths
110
115
  data = gen.instance_variable_get("@data")
111
116
  data[:paths][:css_to_fonts].should match("./")
112
- data[:paths][:preview_to_css].should match("./")
113
117
  end
114
118
  end
115
119
 
@@ -124,8 +128,7 @@ describe Fontcustom::Generator::Template do
124
128
  )
125
129
  gen.instance_variable_set :@data, data_file_contents
126
130
  gen.stub :template
127
- gen.stub :clear_file
128
- gen.stub :append_to_file
131
+ gen.stub :overwrite_file
129
132
  gen
130
133
  end
131
134
 
@@ -138,8 +141,7 @@ describe Fontcustom::Generator::Template do
138
141
 
139
142
  it "should update data file with generated templates" do
140
143
  file = fixture("generators/.fontcustom-data")
141
- subject.should_receive(:clear_file).once.with(file)
142
- subject.should_receive(:append_to_file).once.with do |path, content|
144
+ subject.should_receive(:overwrite_file).once.with do |path, content|
143
145
  path.should == file
144
146
  content.should match(/fontcustom\.css/)
145
147
  content.should match(/_fontcustom\.scss/)
@@ -164,11 +166,11 @@ describe Fontcustom::Generator::Template do
164
166
  )
165
167
  gen.instance_variable_set :@data, data_file_contents
166
168
  gen.stub :template
167
- gen.stub :clear_file
168
- gen.stub :append_to_file
169
+ gen.stub :overwrite_file
169
170
  gen
170
171
  end
171
172
 
173
+ # 6 times because preview also includes preview-css
172
174
  it "should output custom templates to their matching :output paths" do
173
175
  subject.should_receive(:template).exactly(5).times do |*args|
174
176
  if File.basename(args[0]) == "custom.css"
@@ -0,0 +1,428 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fontcustom::Options do
4
+ def options(args = {})
5
+ Fontcustom::Options.new(args)
6
+ end
7
+
8
+ def silent
9
+ Fontcustom::Options.any_instance.stub :say_message
10
+ end
11
+
12
+ before(:each) { Fontcustom::Options.any_instance.stub(:set_options) }
13
+
14
+ context "#initialize" do
15
+ it "should overwite example defaults with real defaults" do
16
+ # imitates the default hash passed by thor
17
+ options = Fontcustom::Options.new(Fontcustom::EXAMPLE_OPTIONS.dup)
18
+ options = options.instance_variable_get(:@cli_options)
19
+ Fontcustom::EXAMPLE_OPTIONS.keys.each do |key|
20
+ options[key].should == Fontcustom::DEFAULT_OPTIONS[key]
21
+ end
22
+ end
23
+ end
24
+
25
+ context ".set_config_path" do
26
+ context "when :config is set" do
27
+ # TODO abstract this into Util?
28
+ it "should follow ../../ relative paths" do
29
+ args = {
30
+ :project_root => fixture("shared/vectors"),
31
+ :config => "../../options"
32
+ }
33
+ o = options args
34
+ o.send :set_config_path
35
+ o.instance_variable_get(:@config).should == fixture("options/fontcustom.yml")
36
+ end
37
+
38
+ it "should use options[:config] if it's a file" do
39
+ args = {
40
+ :project_root => fixture,
41
+ :config => "options/any-file-name.yml"
42
+ }
43
+ o = options args
44
+ o.send :set_config_path
45
+ o.instance_variable_get(:@config).should == fixture("options/any-file-name.yml")
46
+ end
47
+
48
+ it "should search for fontcustom.yml if options[:config] is a dir" do
49
+ args = {
50
+ :project_root => fixture,
51
+ :config => "options/config-is-in-dir"
52
+ }
53
+ o = options args
54
+ o.send :set_config_path
55
+ o.instance_variable_get(:@config).should == fixture("options/config-is-in-dir/fontcustom.yml")
56
+ end
57
+
58
+ it "should raise error if :config doesn't exist" do
59
+ args = {
60
+ :project_root => fixture,
61
+ :config => "does-not-exist"
62
+ }
63
+ o = options args
64
+ expect { o.send :set_config_path }.to raise_error Fontcustom::Error, /configuration file was not found/
65
+ end
66
+ end
67
+
68
+ context "when :config is not set" do
69
+ it "should find fontcustom.yml at :project_root/fontcustom.yml" do
70
+ args = { :project_root => fixture("options") }
71
+ o = options args
72
+ o.send :set_config_path
73
+ o.instance_variable_get(:@config).should == fixture("options/fontcustom.yml")
74
+ end
75
+
76
+ it "should find fontcustom.yml at :project_root/config/fontcustom.yml" do
77
+ args = { :project_root => fixture("options/rails-like") }
78
+ o = options args
79
+ o.send :set_config_path
80
+ o.instance_variable_get(:@config).should == fixture("options/rails-like/config/fontcustom.yml")
81
+ end
82
+
83
+ it "should be false if nothing is found" do
84
+ args = { :project_root => fixture("options/no-config-here") }
85
+ o = options args
86
+ o.send :set_config_path
87
+ o.instance_variable_get(:@config).should == false
88
+ end
89
+ end
90
+ end
91
+
92
+ context ".load_config" do
93
+ def args
94
+ { :project_root => fixture, :verbose => false }
95
+ end
96
+
97
+ it "should raise error if fontcustom.yml isn't valid" do
98
+ o = options args
99
+ o.instance_variable_set :@config, fixture("options/fontcustom-malformed.yml")
100
+ expect { o.send :load_config }.to raise_error Fontcustom::Error, /failed to load/
101
+ end
102
+
103
+ it "should assign empty hash :config is false" do
104
+ o = options args
105
+ o.instance_variable_set :@config, false
106
+ o.send :load_config
107
+ o.instance_variable_get(:@config_options).should == {}
108
+ end
109
+
110
+ it "should assign empty hash if fontcustom.yml is blank" do
111
+ o = options args
112
+ o.instance_variable_set :@config, fixture("options/fontcustom-empty.yml")
113
+ o.send :load_config
114
+ o.instance_variable_get(:@config_options).should == {}
115
+ end
116
+ end
117
+
118
+ context ".merge_options" do
119
+ before(:each) { silent }
120
+
121
+ it "should set instance variables for each option key" do
122
+ o = options
123
+ o.instance_variable_set :@config_options, {}
124
+ o.send :merge_options
125
+ o.instance_variables.length.should == Fontcustom::DEFAULT_OPTIONS.length + 2 # @shell, @mock_proxy (rspec)
126
+ end
127
+
128
+ it "should overwrite defaults with config file" do
129
+ o = options
130
+ o.instance_variable_set :@config_options, { :input => "config" }
131
+ o.send :merge_options
132
+ o.instance_variable_get(:@input).should == "config"
133
+ end
134
+
135
+ it "should overwrite config file and defaults with CLI options" do
136
+ o = options
137
+ cli = o.instance_variable_get :@cli_options
138
+ o.instance_variable_set :@config_options, { :input => "config", :output => "output" }
139
+ o.instance_variable_set :@cli_options, cli.merge( :input => "cli" )
140
+ o.send :merge_options
141
+ o.instance_variable_get(:@input).should == "cli"
142
+ o.instance_variable_get(:@output).should == "output"
143
+ end
144
+
145
+ it "should normalize the font name" do
146
+ o = options
147
+ o.instance_variable_set :@config_options, { :input => "config", :font_name => " A_stR4nG3 nAm3 Ø& " }
148
+ o.send :merge_options
149
+ o.instance_variable_get(:@font_name).should == "A_stR4nG3--nAm3---"
150
+ end
151
+ end
152
+
153
+ context ".set_data_path" do
154
+ it "should set :data_cache in the config dir by default" do
155
+ silent
156
+ o = options
157
+ o.instance_variable_set :@config, "path/to/config/fontcustom.yml"
158
+ o.instance_variable_set :@data_cache, nil
159
+ o.send :set_data_path
160
+ o.instance_variable_get(:@data_cache).should == "path/to/config/.fontcustom-data"
161
+ end
162
+ end
163
+
164
+ context "#send :set_input_paths" do
165
+ it "should raise error if input[:vectors] doesn't contain vectors" do
166
+ o = options
167
+ o.instance_variable_set :@project_root, fixture
168
+ o.instance_variable_set :@input, "shared/vectors-empty"
169
+ expect { o.send :set_input_paths }.to raise_error Fontcustom::Error, /doesn't contain any vectors/
170
+ end
171
+
172
+ context "when @input is a hash" do
173
+ it "should set :templates as :vectors if :templates isn't set" do
174
+ hash = { :vectors => "shared/vectors" }
175
+ o = options
176
+ o.instance_variable_set :@project_root, fixture
177
+ o.instance_variable_set :@input, hash
178
+ o.send :set_input_paths
179
+ input = o.instance_variable_get :@input
180
+ input[:templates].should == fixture("shared/vectors")
181
+ end
182
+
183
+ it "should preserve :templates if it's set" do
184
+ hash = { :vectors => "shared/vectors", :templates => "shared/templates" }
185
+ o = options
186
+ o.instance_variable_set :@project_root, fixture
187
+ o.instance_variable_set :@input, hash
188
+ o.send :set_input_paths
189
+ input = o.instance_variable_get :@input
190
+ input[:templates].should == fixture("shared/templates")
191
+ end
192
+
193
+ it "should raise an error if :vectors isn't set" do
194
+ hash = { :templates => "shared/templates" }
195
+ o = options
196
+ o.instance_variable_set :@project_root, fixture
197
+ o.instance_variable_set :@input, hash
198
+ expect { o.send :set_input_paths }.to raise_error Fontcustom::Error, /contain a "vectors" key/
199
+ end
200
+
201
+ it "should raise an error if :vectors doesn't point to an existing directory" do
202
+ hash = { :vectors => "shared/not-a-dir" }
203
+ o = options
204
+ o.instance_variable_set :@project_root, fixture
205
+ o.instance_variable_set :@input, hash
206
+ expect { o.send :set_input_paths }.to raise_error Fontcustom::Error, /should be a directory/
207
+ end
208
+
209
+ it "should follow ../../ relative paths" do
210
+ hash = { :vectors => "../../shared/vectors", :templates => "../../shared/templates" }
211
+ o = options
212
+ o.instance_variable_set :@project_root, fixture("generators/mixed-output")
213
+ o.instance_variable_set :@input, hash
214
+ o.send :set_input_paths
215
+ input = o.instance_variable_get(:@input)
216
+ input[:vectors].should == fixture("shared/vectors")
217
+ input[:templates].should == fixture("shared/templates")
218
+ end
219
+ end
220
+
221
+ context "when @input is a string" do
222
+ it "should return a hash of locations" do
223
+ o = options
224
+ o.instance_variable_set :@project_root, fixture
225
+ o.instance_variable_set :@input, "shared/vectors"
226
+ o.send :set_input_paths
227
+ input = o.instance_variable_get :@input
228
+ input.should have_key("vectors")
229
+ input.should have_key("templates")
230
+ end
231
+
232
+ it "should set :templates to match :vectors" do
233
+ o = options
234
+ o.instance_variable_set :@project_root, fixture
235
+ o.instance_variable_set :@input, "shared/vectors"
236
+ o.send :set_input_paths
237
+ input = o.instance_variable_get :@input
238
+ input[:templates].should == fixture("shared/vectors")
239
+ end
240
+
241
+ it "should raise an error if :vectors doesn't point to a directory" do
242
+ o = options
243
+ o.instance_variable_set :@project_root, fixture
244
+ o.instance_variable_set :@input, "shared/not-a-dir"
245
+ expect { o.send :set_input_paths }.to raise_error Fontcustom::Error, /should be a directory/
246
+ end
247
+
248
+ it "should follow ../../ relative paths" do
249
+ o = options
250
+ o.instance_variable_set :@project_root, fixture("generators/mixed-output")
251
+ o.instance_variable_set :@input, "../../shared/vectors"
252
+ o.send :set_input_paths
253
+ input = o.instance_variable_get(:@input)
254
+ input[:vectors].should == fixture("shared/vectors")
255
+ input[:templates].should == fixture("shared/vectors")
256
+ end
257
+ end
258
+ end
259
+
260
+ context ".set_output_paths" do
261
+ context "when @output is nil" do
262
+ it "should default to :project_root/:font_name" do
263
+ silent
264
+ o = options
265
+ o.instance_variable_set :@project_root, fixture
266
+ o.instance_variable_set :@font_name, "Test-Font"
267
+ o.instance_variable_set :@output, nil
268
+ o.send :set_output_paths
269
+ output = o.instance_variable_get :@output
270
+ output[:fonts].should == fixture("Test-Font")
271
+ end
272
+
273
+ it "should print a warning" do
274
+ o = options
275
+ o.instance_variable_set :@project_root, fixture
276
+ o.instance_variable_set :@font_name, "Test-Font"
277
+ o.instance_variable_set :@output, nil
278
+ stdout = capture(:stdout) { o.send :set_output_paths }
279
+ stdout.should match("Test-Font")
280
+ end
281
+ end
282
+
283
+ context "when @output is a hash" do
284
+ it "should set :css and :preview to match :fonts if either aren't set" do
285
+ hash = { :fonts => "output/fonts" }
286
+ o = options
287
+ o.instance_variable_set :@project_root, fixture
288
+ o.instance_variable_set :@output, hash
289
+ o.send :set_output_paths
290
+ output = o.instance_variable_get :@output
291
+ output[:css].should == fixture("output/fonts")
292
+ output[:preview].should == fixture("output/fonts")
293
+ end
294
+
295
+ it "should preserve :css and :preview if they do exist" do
296
+ hash = {
297
+ :fonts => "output/fonts",
298
+ :css => "output/styles",
299
+ :preview => "output/preview"
300
+ }
301
+ o = options
302
+ o.instance_variable_set :@project_root, fixture
303
+ o.instance_variable_set :@output, hash
304
+ o.send :set_output_paths
305
+ output = o.instance_variable_get :@output
306
+ output[:css].should == fixture("output/styles")
307
+ output[:preview].should == fixture("output/preview")
308
+ end
309
+
310
+ it "should create additional paths if they are given" do
311
+ hash = {
312
+ :fonts => "output/fonts",
313
+ "special.js" => "assets/javascripts"
314
+ }
315
+ o = options
316
+ o.instance_variable_set :@project_root, fixture
317
+ o.instance_variable_set :@output, hash
318
+ o.send :set_output_paths
319
+ output = o.instance_variable_get :@output
320
+ output["special.js"].should == fixture("assets/javascripts")
321
+ end
322
+
323
+ it "should raise an error if :fonts isn't set" do
324
+ hash = { :css => "output/styles" }
325
+ o = options
326
+ o.instance_variable_set :@project_root, fixture
327
+ o.instance_variable_set :@output, hash
328
+ expect { o.send :set_output_paths }.to raise_error Fontcustom::Error, /contain a "fonts" key/
329
+ end
330
+
331
+ it "should follow ../../ relative paths" do
332
+ hash = {
333
+ :fonts => "../../output/fonts",
334
+ :css => "../../output/css",
335
+ :preview => "../../output/views"
336
+ }
337
+ o = options
338
+ o.instance_variable_set :@project_root, fixture("generators/mixed-output")
339
+ o.instance_variable_set :@output, hash
340
+ o.send :set_output_paths
341
+ output = o.instance_variable_get :@output
342
+ output[:fonts].should == fixture("output/fonts")
343
+ output[:css].should == fixture("output/css")
344
+ output[:preview].should == fixture("output/views")
345
+ end
346
+ end
347
+
348
+ context "when @output is a string" do
349
+ it "should return a hash of output locations" do
350
+ o = options
351
+ o.instance_variable_set :@project_root, fixture
352
+ o.instance_variable_set :@output, "output/fonts"
353
+ o.send :set_output_paths
354
+ output = o.instance_variable_get :@output
355
+ output.should be_a(Hash)
356
+ output.should have_key("fonts")
357
+ output.should have_key("css")
358
+ output.should have_key("preview")
359
+ end
360
+
361
+ it "should set :css and :preview to match :fonts" do
362
+ o = options
363
+ o.instance_variable_set :@project_root, fixture
364
+ o.instance_variable_set :@output, "output/fonts"
365
+ o.send :set_output_paths
366
+ output = o.instance_variable_get :@output
367
+ output[:css].should == fixture("output/fonts")
368
+ output[:preview].should == fixture("output/fonts")
369
+ end
370
+
371
+ it "should raise an error if :fonts exists but isn't a directory" do
372
+ o = options
373
+ o.instance_variable_set :@project_root, fixture
374
+ o.instance_variable_set :@output, "shared/not-a-dir"
375
+ expect { o.send :set_output_paths }.to raise_error Fontcustom::Error, /directory, not a file/
376
+ end
377
+
378
+ it "should follow ../../ relative paths" do
379
+ o = options
380
+ o.instance_variable_set :@project_root, fixture("generators/mixed-output")
381
+ o.instance_variable_set :@output, "../../something/else"
382
+ o.send :set_output_paths
383
+ output = o.instance_variable_get :@output
384
+ output[:fonts].should == fixture("something/else")
385
+ output[:css].should == fixture("something/else")
386
+ output[:preview].should == fixture("something/else")
387
+ end
388
+ end
389
+ end
390
+
391
+ context ".set_template_paths" do
392
+ it "should expand shorthand for packaged templates" do
393
+ o = options
394
+ o.instance_variable_set :@project_root, fixture
395
+ o.instance_variable_set :@input, { :templates => "shared/templates" }
396
+ o.instance_variable_set :@templates, %w|preview css scss bootstrap bootstrap-scss bootstrap-ie7 bootstrap-ie7-scss|
397
+ o.send :set_template_paths
398
+ templates = o.instance_variable_get :@templates
399
+ templates.should =~ [
400
+ File.join(Fontcustom.gem_lib, "templates", "fontcustom-preview.html"),
401
+ File.join(Fontcustom.gem_lib, "templates", "fontcustom.css"),
402
+ File.join(Fontcustom.gem_lib, "templates", "_fontcustom.scss"),
403
+ File.join(Fontcustom.gem_lib, "templates", "fontcustom-bootstrap.css"),
404
+ File.join(Fontcustom.gem_lib, "templates", "_fontcustom-bootstrap.scss"),
405
+ File.join(Fontcustom.gem_lib, "templates", "fontcustom-bootstrap-ie7.css"),
406
+ File.join(Fontcustom.gem_lib, "templates", "_fontcustom-bootstrap-ie7.scss")
407
+ ]
408
+ end
409
+
410
+ it "should find custom templates in :template_path" do
411
+ o = options
412
+ o.instance_variable_set :@project_root, fixture
413
+ o.instance_variable_set :@input, { :templates => fixture("shared/templates") }
414
+ o.instance_variable_set :@templates, %w|custom.css|
415
+ o.send :set_template_paths
416
+ templates = o.instance_variable_get :@templates
417
+ templates.should =~ [fixture("shared/templates/custom.css")]
418
+ end
419
+
420
+ it "should raise an error if a template does not exist" do
421
+ o = options
422
+ o.instance_variable_set :@project_root, fixture
423
+ o.instance_variable_set :@input, { :templates => "shared/templates" }
424
+ o.instance_variable_set :@templates, %w|fake-template.txt|
425
+ expect { o.send :set_template_paths }.to raise_error Fontcustom::Error, /does not exist/
426
+ end
427
+ end
428
+ end