fontcustom 1.1.0.pre2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- /*
1
+ /*
2
2
  Icon Font: <%= @opts.font_name %>
3
3
  */
4
4
 
@@ -13,6 +13,9 @@
13
13
  font-style: normal;
14
14
  }
15
15
 
16
+ [data-icon]:before { content: attr(data-icon); }
17
+
18
+ [data-icon]:before,
16
19
  <%= @glyphs.map {|name| ".#{@opts.css_prefix + name}:before"}.join(",\n") %> {
17
20
  font-family: "<%= @opts.font_name %>";
18
21
  font-style: normal;
@@ -1,30 +1,30 @@
1
1
  # ---------------------------------------------------------------------------- #
2
2
  # Project Info
3
- # Learn more about these options by running `fontcustom help` or visit
4
- # <http://fontcustom.com>.
3
+ # Default values shown. Learn more about these options by running
4
+ # `fontcustom help` or visit <http://fontcustom.com>.
5
5
  # ---------------------------------------------------------------------------- #
6
6
 
7
- #font_name: My Custom Font
8
- #file_hash: false
9
- #css_prefix: glyph-
10
- #preprocessor_path: fonts/fontcustom
11
- #debug: true
12
- #verbose: false
7
+ #font_name: fontcustom
8
+ #css_prefix: icon-
9
+ #preprocessor_path: ""
10
+ #no_hash: false
11
+ #debug: false
12
+ #quiet: false
13
13
 
14
14
 
15
15
  # ---------------------------------------------------------------------------- #
16
16
  # Project Paths
17
- # All paths are relative to PROJECT_ROOT (default: working directory).
18
- # PROJECT_ROOT can be configured (absolute path recommended).
19
- # For finer control, assign INPUT and OUTPUT as hashes instead of a strings.
17
+ # Relative paths are expanded from PROJECT_ROOT (default: working directory).
18
+ # INPUT and OUTPUT can be assigned as hashes instead of a strings.
20
19
  # The OUPUT hash can route custom templates according to their filename.
21
20
  # ---------------------------------------------------------------------------- #
22
21
 
23
22
  #project_root: some/other/place
23
+ #data_cache: tmp/fontcustom
24
24
 
25
25
  #input:
26
- # vectors: app/assets/fontcustom/vectors
27
- # templates: app/assets/fontcustom/templates
26
+ # vectors: app/assets/fonts/fontcustom/vectors
27
+ # templates: app/assets/fonts/fontcustom/templates
28
28
 
29
29
  #output:
30
30
  # fonts: app/assets/fonts
@@ -36,7 +36,7 @@
36
36
  # ---------------------------------------------------------------------------- #
37
37
  # Templates
38
38
  # Included in Font Custom:
39
- # preview, css, scss, bootstrap, bootstrap-scss, bootstrap-ie7,
39
+ # preview, css, scss, scss-rails, bootstrap, bootstrap-scss, bootstrap-ie7,
40
40
  # bootstrap-ie7-scss
41
41
  # Custom templates should be saved in the INPUT[:templates] directory.
42
42
  # ---------------------------------------------------------------------------- #
@@ -1,35 +1,45 @@
1
1
  ##
2
- # Needs access to @shell and an Options instance
2
+ # Needs access to @shell and an Options instance
3
3
  # (@opts in thor, @cli_options or self in Options)
4
4
  module Fontcustom
5
5
  module Util
6
6
  def check_fontforge
7
7
  fontforge = `which fontforge`
8
8
  if fontforge == "" || fontforge == "fontforge not found"
9
- raise Fontcustom::Error, "Please install fontforge. Visit http://fontcustom.com for instructions."
9
+ raise Fontcustom::Error, "Please install fontforge. Visit <http://fontcustom.com> for instructions."
10
10
  end
11
11
  end
12
12
 
13
13
  def say_changed(status, changed)
14
- return unless base(:verbose)
14
+ return if base(:quiet)
15
15
  message = changed.map { |file| relative_to_root(file) }
16
- @shell.say_status status, message.join(" ")
16
+ @shell.say_status status, message.join("\n#{" " * 14}"), :green # magic number
17
17
  end
18
18
 
19
- def say_message(status, message)
20
- return unless base(:verbose)
21
- @shell.say_status status, message
19
+ def say_message(status, message, color = :yellow)
20
+ return if base(:quiet) && status != :error
21
+ @shell.say_status status, message, color
22
+ end
23
+
24
+ def expand_path(path)
25
+ return path if path[0] == "/"
26
+ File.expand_path File.join(base(:project_root), path)
22
27
  end
23
28
 
24
29
  def relative_to_root(path)
25
30
  path = path.sub(base(:project_root), "")
26
31
  path = path[1..-1] if path[0] == "/"
32
+ path = "." if path.empty?
27
33
  path
28
34
  end
29
35
 
30
36
  def overwrite_file(file, content = "")
31
37
  File.open(file, "w") { |f| f.write(content) }
32
- say_changed :update, [ file ]
38
+ # say_changed :update, [ file ]
39
+ end
40
+
41
+ def symbolize_hash(hash)
42
+ hash.inject({}) { |memo, (k, v)| memo[k.to_sym] = v; memo }
33
43
  end
34
44
 
35
45
  private
@@ -1,3 +1,3 @@
1
1
  module Fontcustom
2
- VERSION = "1.1.0.pre2"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -3,6 +3,8 @@ require "listen"
3
3
 
4
4
  module Fontcustom
5
5
  class Watcher
6
+ include Util
7
+
6
8
  def initialize(opts)
7
9
  @opts = opts
8
10
  @vector_listener = Listen.to(@opts.input[:vectors]).relative_paths(true).filter(/\.(eps|svg)$/).change(&callback)
@@ -27,56 +29,56 @@ module Fontcustom
27
29
  end
28
30
 
29
31
  def watch
30
- puts "Font Custom is watching your icons at #{@opts.input[:vectors]}. Press Ctrl + C to stop."
31
32
  compile unless @opts.skip_first
33
+ start
34
+ rescue SignalException # Catches Ctrl + C
35
+ stop
36
+ end
32
37
 
33
- # Non-blocking if test
34
- if @is_test
38
+ private
39
+
40
+ def start
41
+ if @is_test # Non-blocking listener
35
42
  @vector_listener.start
36
43
  @template_listener.start if @template_listener
37
44
  else
38
45
  @vector_listener.start!
39
46
  @template_listener.start! if @template_listener
40
47
  end
41
-
42
- rescue Fontcustom::Error => e
43
- show_error e
44
-
45
- # Catches Ctrl + C
46
- rescue SignalException
47
- stop
48
48
  end
49
49
 
50
50
  def stop
51
51
  @vector_listener.stop
52
52
  @template_listener.stop if @template_listener
53
- puts "\nFont Custom is signing off. Good night and good luck."
53
+ say "\nFont Custom is signing off. Good night and good luck.", :yellow
54
54
  end
55
55
 
56
- private
57
-
58
56
  def callback
59
57
  Proc.new do |modified, added, removed|
60
58
  begin
61
- puts " >> Changed: " + modified.join(", ") unless modified.empty?
62
- puts " >> Added: " + added.join(", ") unless added.empty?
63
- puts " >> Removed: " + removed.join(", ") unless removed.empty?
64
-
59
+ say_message :changed, modified.join(", ") unless modified.empty?
60
+ say_message :added, added.join(", ") unless added.empty?
61
+ say_message :removed, removed.join(", ") unless removed.empty?
65
62
  changed = modified + added + removed
66
63
  compile unless changed.empty?
67
64
  rescue Fontcustom::Error => e
68
- show_error e
65
+ say_message :error, e.message, :red
69
66
  end
70
67
  end
71
68
  end
72
69
 
73
70
  def compile
74
- Fontcustom::Generator::Font.start [@opts]
75
- Fontcustom::Generator::Template.start [@opts]
71
+ Generator::Font.start [@opts]
72
+ Generator::Template.start [@opts]
73
+ end
74
+
75
+ def say(*args)
76
+ return if @opts.quiet
77
+ @opts.instance_variable_get(:@shell).say *args
76
78
  end
77
79
 
78
- def show_error(err)
79
- puts "ERROR: #{err.message}"
80
+ def say_message(*args)
81
+ @opts.say_message *args
80
82
  end
81
83
  end
82
84
  end
@@ -1 +1,7 @@
1
+ /*
2
+ <%= @glyphs.inspect %>
3
+ */
1
4
  .foo { color: black; }
5
+
6
+ .bar { color: red; }
7
+ .bar { color: red; }
@@ -1 +1,4 @@
1
+ /*
2
+ <%= @glyphs.inspect %>
3
+ */
1
4
  .foo { color: blue; }
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Fontcustom::Generator::Font do
4
- # Silence messages without passing :verbose => false to everything
4
+ # Silence messages without passing :quiet => true to everything
5
5
  before(:each) do
6
6
  Fontcustom::Options.any_instance.stub :say_message
7
7
  end
@@ -45,7 +45,7 @@ describe Fontcustom::Generator::Font do
45
45
  options = {
46
46
  :project_root => fixture,
47
47
  :input => "shared/vectors",
48
- :verbose => false
48
+ :quiet => true
49
49
  }
50
50
  gen = generator options
51
51
  gen.get_data
@@ -59,7 +59,7 @@ describe Fontcustom::Generator::Font do
59
59
  :config => "generators",
60
60
  :input => "shared/vectors",
61
61
  :output => "mixed-output",
62
- :verbose => false
62
+ :quiet => true
63
63
  }
64
64
  gen = generator options
65
65
  gen.get_data
@@ -74,7 +74,7 @@ describe Fontcustom::Generator::Font do
74
74
  :data_cache => "generators/.fontcustom-data-corrupted",
75
75
  :input => "shared/vectors",
76
76
  :output => "mixed-output",
77
- :verbose => false
77
+ :quiet => true
78
78
  }
79
79
  gen = generator options
80
80
  expect { gen.get_data }.to raise_error Fontcustom::Error, /corrupted/
@@ -87,7 +87,7 @@ describe Fontcustom::Generator::Font do
87
87
  :project_root => fixture,
88
88
  :input => "shared/vectors",
89
89
  :output => "mixed-output",
90
- :verbose => false
90
+ :quiet => true
91
91
  }
92
92
  gen = generator options
93
93
  gen.stub :remove_file
@@ -131,19 +131,19 @@ describe Fontcustom::Generator::Font do
131
131
  :project_root => fixture,
132
132
  :input => "shared/vectors",
133
133
  :output => "mixed-output",
134
- :verbose => false
134
+ :quiet => true
135
135
  )
136
- gen.stub(:"`").and_return fontforge_output
136
+ gen.stub(:execute_and_clean).and_return [fontforge_stdout.split("\n"), fontforge_stderr, double(:status, :success? => true)]
137
137
  gen
138
138
  end
139
139
 
140
140
  it "should call fontforge" do
141
- subject.should_receive(:"`").with(/fontforge -script/)
141
+ subject.should_receive(:execute_and_clean).with(/fontforge -script/)
142
142
  subject.generate
143
143
  end
144
144
 
145
145
  it "should pass options to fontforge" do
146
- subject.should_receive(:"`").with(/#{fixture("shared/vectors")}.+#{fixture("mixed-output")}/)
146
+ subject.should_receive(:execute_and_clean).with(/#{fixture("shared/vectors")}.+#{fixture("mixed-output")}/)
147
147
  subject.generate
148
148
  end
149
149
 
@@ -160,7 +160,7 @@ describe Fontcustom::Generator::Font do
160
160
  :output => "fake-dir-should-cause-failure",
161
161
  :debug => true
162
162
  )
163
- expect { capture(:stdout) { gen.generate } }.to raise_error Fontcustom::Error, /failed unexpectedly/
163
+ expect { capture(:stdout) { gen.generate } }.to raise_error Fontcustom::Error, /failed/
164
164
  end
165
165
  end
166
166
 
@@ -197,12 +197,12 @@ describe Fontcustom::Generator::Font do
197
197
  stdout.should =~ /create.+\.(woff|ttf|eot|svg)/
198
198
  end
199
199
 
200
- it "should print nothing if verbose is false" do
200
+ it "should print nothing if :quiet is set" do
201
201
  gen = generator(
202
202
  :project_root => fixture,
203
203
  :input => "shared/vectors",
204
204
  :output => "output",
205
- :verbose => false
205
+ :quiet => true
206
206
  )
207
207
  gen.instance_variable_set :@data, data_file_contents
208
208
  stdout = capture(:stdout) { gen.announce_files }
@@ -228,12 +228,12 @@ describe Fontcustom::Generator::Font do
228
228
  gen.save_data
229
229
  end
230
230
 
231
- it "should be silent if verbose is false" do
231
+ it "should be silent if :quiet is set" do
232
232
  gen = generator(
233
233
  :project_root => fixture,
234
234
  :input => "shared/vectors",
235
235
  :output => "output",
236
- :verbose => false
236
+ :quiet => true
237
237
  )
238
238
  gen.stub :overwrite_file
239
239
  gen.instance_variable_set(:@data, data_file_contents)
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Fontcustom::Generator::Template do
4
- # Silence messages without passing :verbose => false to everything
4
+ # Silence messages without passing :quiet => true to everything
5
5
  before(:each) do
6
6
  Fontcustom::Options.any_instance.stub :say_message
7
7
  end
@@ -16,17 +16,16 @@ describe Fontcustom::Generator::Template do
16
16
  gen = generator(
17
17
  :project_root => fixture,
18
18
  :input => "shared/vectors",
19
- :verbose => false
19
+ :quiet => true
20
20
  )
21
- expect { gen.get_data }.to raise_error Fontcustom::Error, /\.fontcustom-data is required/
21
+ expect { gen.get_data }.to raise_error Fontcustom::Error, /\.fontcustom-data/
22
22
  end
23
23
 
24
- # TODO ensure data file is correct
25
24
  it "should assign @data from data file" do
26
25
  gen = generator(
27
26
  :project_root => fixture("generators"),
28
27
  :input => "../shared/vectors",
29
- :verbose => false
28
+ :quiet => true
30
29
  )
31
30
  gen.get_data
32
31
  gen.instance_variable_get(:@data)[:templates].should =~ data_file_contents[:templates]
@@ -39,7 +38,7 @@ describe Fontcustom::Generator::Template do
39
38
  :project_root => fixture("generators"),
40
39
  :input => "../shared/vectors",
41
40
  :output => "mixed-output",
42
- :verbose => false
41
+ :quiet => true
43
42
  )
44
43
  gen.stub :remove_file
45
44
  gen.stub :overwrite_file
@@ -77,21 +76,20 @@ describe Fontcustom::Generator::Template do
77
76
  end
78
77
 
79
78
  context "#make_relative_paths" do
80
- it "should assign :css_to_fonts, :preview_to_fonts, and :preprocessor_to_fonts" do
79
+ it "should assign @font_path, @font_path_alt, and @font_path_preview" do
81
80
  gen = generator(
82
81
  :project_root => fixture,
83
82
  :input => "shared/vectors",
84
83
  :output => {:fonts => "foo/fonts", :css => "output/css", :preview => "views/"}
85
84
  )
86
- gen.instance_variable_set "@data", data_file_contents
85
+ gen.instance_variable_set :@data, data_file_contents
87
86
  gen.make_relative_paths
88
- data = gen.instance_variable_get("@data")
89
- data[:paths][:css_to_fonts].should match("../../foo/fonts")
90
- data[:paths][:preview_to_fonts].should match("../foo/fonts")
91
- data[:paths][:preprocessor_to_fonts].should eq(data[:paths][:css_to_fonts])
87
+ gen.instance_variable_get(:@font_path).should match("../../foo/fonts")
88
+ gen.instance_variable_get(:@font_path_alt).should match("../../foo/fonts")
89
+ gen.instance_variable_get(:@font_path_preview).should match("../foo/fonts")
92
90
  end
93
91
 
94
- it "should assign :preprocessor_to_css if :preprocessor_font_path is set" do
92
+ it "should assign @font_path_alt if :preprocessor_font_path is set" do
95
93
  gen = generator(
96
94
  :project_root => fixture,
97
95
  :preprocessor_font_path => "fonts/fontcustom",
@@ -100,8 +98,7 @@ describe Fontcustom::Generator::Template do
100
98
  )
101
99
  gen.instance_variable_set "@data", data_file_contents
102
100
  gen.make_relative_paths
103
- data = gen.instance_variable_get("@data")
104
- data[:paths][:preprocessor_to_fonts].should match("fonts/fontcustom")
101
+ gen.instance_variable_get(:@font_path_alt).should match("fonts/fontcustom")
105
102
  end
106
103
 
107
104
  it "should assign '.' when paths are the same" do
@@ -112,8 +109,7 @@ describe Fontcustom::Generator::Template do
112
109
  )
113
110
  gen.instance_variable_set "@data", data_file_contents
114
111
  gen.make_relative_paths
115
- data = gen.instance_variable_get("@data")
116
- data[:paths][:css_to_fonts].should match("./")
112
+ gen.instance_variable_get(:@font_path).should match("./")
117
113
  end
118
114
  end
119
115
 
@@ -124,7 +120,7 @@ describe Fontcustom::Generator::Template do
124
120
  :input => {:vectors => "../shared/vectors", :templates => "../shared/templates"},
125
121
  :output => "mixed-output",
126
122
  :templates => %W|scss css custom.css|,
127
- :verbose => false
123
+ :quiet => true
128
124
  )
129
125
  gen.instance_variable_set :@data, data_file_contents
130
126
  gen.stub :template
@@ -150,11 +146,28 @@ describe Fontcustom::Generator::Template do
150
146
  subject.generate
151
147
  end
152
148
 
153
- it "should be silent if verbose is false" do
149
+ it "should be silent if :quiet is set" do
154
150
  stdout = capture(:stdout) { subject.generate }
155
151
  stdout.should == ""
156
152
  end
157
153
 
154
+ it "should rename stock templates according to opts.font_name" do
155
+ gen = generator(
156
+ :project_root => fixture("generators"),
157
+ :font_name => "Test Font",
158
+ :input => {:vectors => "../shared/vectors", :templates => "../shared/templates"},
159
+ :templates => %W|scss css|,
160
+ :quiet => true
161
+ )
162
+ gen.instance_variable_set :@data, data_file_contents
163
+ gen.stub :template
164
+ gen.stub :overwrite_file
165
+ gen.should_receive(:template).exactly(2).times do |*args|
166
+ args[1].should match(/(Test-Font\.css|_Test-Font\.scss)/)
167
+ end
168
+ gen.generate
169
+ end
170
+
158
171
  context "when various output locations are given" do
159
172
  subject do
160
173
  gen = generator(
@@ -162,7 +175,7 @@ describe Fontcustom::Generator::Template do
162
175
  :input => {:vectors => "shared/vectors", :templates => "shared/templates"},
163
176
  :output => {:fonts => "output/fonts", :css => "output/css", :preview => "output/views", "custom.css" => "output/custom"},
164
177
  :templates => %W|scss preview css custom.css regular.css|,
165
- :verbose => false
178
+ :quiet => true
166
179
  )
167
180
  gen.instance_variable_set :@data, data_file_contents
168
181
  gen.stub :template
@@ -173,7 +186,7 @@ describe Fontcustom::Generator::Template do
173
186
  # 6 times because preview also includes preview-css
174
187
  it "should output custom templates to their matching :output paths" do
175
188
  subject.should_receive(:template).exactly(5).times do |*args|
176
- if File.basename(args[0]) == "custom.css"
189
+ if File.basename(args[0]) == :"custom.css"
177
190
  args[1].should == fixture("output/custom/custom.css")
178
191
  end
179
192
  end