font_awesome_rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/Gemfile +2 -0
- data/LICENSE.md +26 -0
- data/README.md +69 -0
- data/Rakefile +6 -0
- data/app/assets/stylesheets/_font-awesome.scss +2 -0
- data/app/assets/stylesheets/font-awesome/_font.scss +13 -0
- data/app/assets/stylesheets/font-awesome/_icons.scss +210 -0
- data/app/assets/stylesheets/font-awesome/_mixins.scss +58 -0
- data/app/assets/stylesheets/font-awesome/_styles.scss +53 -0
- data/font_awesome_rails.gemspec +25 -0
- data/lib/font_awesome/font.rb +52 -0
- data/lib/font_awesome/hex_code.rb +39 -0
- data/lib/font_awesome/icon.rb +80 -0
- data/lib/font_awesome/nokogiri.rb +17 -0
- data/lib/font_awesome/sass_extensions/functions.rb +26 -0
- data/lib/font_awesome/sass_extensions.rb +6 -0
- data/lib/font_awesome.rb +10 -0
- data/lib/font_awesome_rails/engine.rb +4 -0
- data/lib/font_awesome_rails/version.rb +3 -0
- data/lib/font_awesome_rails.rb +10 -0
- data/spec/font_awesome/font_spec.rb +103 -0
- data/spec/font_awesome/hex_code_spec.rb +66 -0
- data/spec/font_awesome/icon_spec.rb +92 -0
- data/spec/font_awesome/sass_extensions/functions_spec.rb +69 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/tasks/update_classic_sass_task_spec.rb +33 -0
- data/spec/tasks/update_hex_codes_task_spec.rb +44 -0
- data/spec/tasks/update_metrics_task_spec.rb +34 -0
- data/spec/tasks/update_sass_task_spec.rb +20 -0
- data/tasks/gem_dir.rb +12 -0
- data/tasks/spec.rake +3 -0
- data/tasks/task.rb +5 -0
- data/tasks/update/classic.rake +27 -0
- data/tasks/update/font.rake +13 -0
- data/tasks/update/font_awesome.rake +20 -0
- data/tasks/update/hex_codes.rake +9 -0
- data/tasks/update/metrics.rake +8 -0
- data/tasks/update/metrics.rb +62 -0
- data/tasks/update/sass.rake +6 -0
- data/tasks/update/update_classic_sass_task.rb +21 -0
- data/tasks/update/update_hex_codes_task.rb +34 -0
- data/tasks/update/update_metrics_task.rb +25 -0
- data/tasks/update/update_sass_task.rb +20 -0
- data/tasks/update.rake +8 -0
- data/vendor/assets/font/fontawesome-webfont.eot +0 -0
- data/vendor/assets/font/fontawesome-webfont.svg +255 -0
- data/vendor/assets/font/fontawesome-webfont.ttf +0 -0
- data/vendor/assets/font/fontawesome-webfont.woff +0 -0
- data/vendor/assets/stylesheets/font-awesome/_classic.scss +292 -0
- data/vendor/assets/stylesheets/font-awesome/ie7.css +645 -0
- metadata +225 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
module FontAwesome
|
2
|
+
module Nokogiri
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def raise_exception
|
6
|
+
raise LoadError, %{Nokogiri is required to use this feature -- please add "gem 'nokogiri'" to your Gemfile and run "bundle install"}
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing(method, *args)
|
10
|
+
raise_exception
|
11
|
+
end
|
12
|
+
|
13
|
+
def const_missing(const)
|
14
|
+
raise_exception
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module FontAwesome
|
4
|
+
module SassExtensions
|
5
|
+
module Functions
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
declare :icon_image, [:name]
|
10
|
+
declare :icon_image, [:name, :style]
|
11
|
+
end
|
12
|
+
|
13
|
+
def icon_image(name, style=nil)
|
14
|
+
assert_type name, :String
|
15
|
+
icon = Icon.new(name.value)
|
16
|
+
|
17
|
+
unless style.nil?
|
18
|
+
assert_type style, :String
|
19
|
+
icon.style = style.value
|
20
|
+
end
|
21
|
+
|
22
|
+
Sass::Script::String.new icon.to_uri, :string
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/font_awesome.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe FontAwesome::Font do
|
4
|
+
subject(:font) { FontAwesome::Font.send :new }
|
5
|
+
before { FontAwesome::Font.stubs(:instance).returns(font) }
|
6
|
+
|
7
|
+
let(:hex_code) { stub("HexCode", to_unicode: "\uf00d") }
|
8
|
+
|
9
|
+
it "should be a singleton" do
|
10
|
+
expect{FontAwesome::Font.new}.to raise_error NoMethodError
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#svg" do
|
14
|
+
it "loads the webfont" do
|
15
|
+
Nokogiri.expects(:XML).with{|file| file.path == font.send(:path)}.returns(:parsed_xml)
|
16
|
+
font.send(:svg).should == :parsed_xml
|
17
|
+
end
|
18
|
+
|
19
|
+
it "memoizes" do
|
20
|
+
File.expects(:open).once.returns(:parsed_xml)
|
21
|
+
font.send(:svg)
|
22
|
+
font.send(:svg)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#select" do
|
27
|
+
it "finds the first node in the webfont matching the given CSS selector" do
|
28
|
+
font.stubs(:svg).returns(mock{expects(:at_css).with("something")})
|
29
|
+
font.send(:select, "something")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#attribute" do
|
34
|
+
let(:xml) { Nokogiri.XML('<pizza topping="meatlovers" />') }
|
35
|
+
|
36
|
+
before { font.stubs(:svg).returns(xml) }
|
37
|
+
|
38
|
+
context "when the attribute exists" do
|
39
|
+
it "returns its value" do
|
40
|
+
font.send(:attribute, "topping", "pizza").should == "meatlovers"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when the attribute does not exist" do
|
45
|
+
it "returns nil" do
|
46
|
+
font.send(:attribute, "base", "pizza").should be_nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#glyph" do
|
52
|
+
it "returns a selector for the specified character" do
|
53
|
+
font.send(:glyph, hex_code).should == "glyph[unicode=\uf00d]"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#ascent" do
|
58
|
+
it "returns the ascent height" do
|
59
|
+
font.ascent.should > 0
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#descent" do
|
64
|
+
it "returns the descent height" do
|
65
|
+
font.descent.should < 0
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#em_size" do
|
70
|
+
it "returns the number of units per em" do
|
71
|
+
font.stubs(:attribute).with("units-per-em", "font-face").returns("2048")
|
72
|
+
font.em_size.should == 2048
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#character_width" do
|
77
|
+
before { font.stubs(:attribute).with("horiz-adv-x", "glyph[unicode=\uf00d]").returns(glyph_horiz_adv_x) }
|
78
|
+
|
79
|
+
context "when the glyph has its own horiz-adv-x" do
|
80
|
+
let(:glyph_horiz_adv_x) { "1542" }
|
81
|
+
|
82
|
+
it "returns it" do
|
83
|
+
font.character_width(hex_code).should == 1542
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "when the glyph does not have its own horiz-adv-x" do
|
88
|
+
let(:glyph_horiz_adv_x) { nil }
|
89
|
+
|
90
|
+
it "returns the font's horiz-adv-x" do
|
91
|
+
font.stubs(:attribute).with("horiz-adv-x", "font").returns("1536")
|
92
|
+
font.character_width(hex_code).should == 1536
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#character_outline" do
|
98
|
+
it "returns the glyph's path" do
|
99
|
+
font.stubs(:attribute).with("d", "glyph[unicode=\uf00d]").returns("M0 0z")
|
100
|
+
font.character_outline(hex_code).should == "M0 0z"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe FontAwesome::HexCode do
|
4
|
+
subject(:hex_code) { FontAwesome::HexCode.new(name) }
|
5
|
+
let(:name) { :pizza }
|
6
|
+
before { FontAwesome::HexCode.stubs(:lookup_table).returns({"pizza" => "f00d"}) }
|
7
|
+
|
8
|
+
describe ".new" do
|
9
|
+
it "sets the name" do
|
10
|
+
FontAwesome::HexCode.any_instance.expects(:name=).with(:foo)
|
11
|
+
FontAwesome::HexCode.new(:foo)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#name=" do
|
16
|
+
it "stringifies and dasherizes the name" do
|
17
|
+
["some-icon", "some_icon", :some_icon].each do |value|
|
18
|
+
hex_code.name = value
|
19
|
+
hex_code.name.should == "some-icon"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#to_s" do
|
25
|
+
it "looks up the name in the lookup table" do
|
26
|
+
FontAwesome::HexCode.expects(:lookup_table).returns(mock{expects(:[]).with("pizza").returns("f00d")})
|
27
|
+
hex_code.to_s.should == "f00d"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#to_unicode" do
|
32
|
+
it "unicode-escapes the hex code" do
|
33
|
+
hex_code.to_unicode.should == "\uf00d"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#to_css" do
|
38
|
+
it "css-escapes the hex code" do
|
39
|
+
hex_code.to_css.should == '\f00d'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#to_xml" do
|
44
|
+
it "xml-escapes the hex code" do
|
45
|
+
hex_code.to_xml.should == ""
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe ".all" do
|
50
|
+
it "returns an enumerator for the lookup table" do
|
51
|
+
FontAwesome::HexCode.all.to_a.should == FontAwesome::HexCode.lookup_table.each.to_a
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe ".lookup_table" do
|
56
|
+
subject(:lookup_table) { FontAwesome::HexCode.lookup_table }
|
57
|
+
|
58
|
+
before { FontAwesome::HexCode.unstub :lookup_table}
|
59
|
+
|
60
|
+
it { should be_a Hash }
|
61
|
+
|
62
|
+
it "translates icon names to hex codes" do
|
63
|
+
lookup_table["glass"].should == "f000"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe FontAwesome::Icon do
|
4
|
+
subject { icon }
|
5
|
+
let(:icon) { FontAwesome::Icon.new("pizza") }
|
6
|
+
let(:font) { FontAwesome::Font.instance }
|
7
|
+
|
8
|
+
describe ".new" do
|
9
|
+
it "sets the hex code" do
|
10
|
+
FontAwesome::Icon.new("foo").hex_code.name.should == "foo"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "defaults the style" do
|
14
|
+
FontAwesome::Icon.any_instance.stubs(:default_style).returns("fill:red")
|
15
|
+
FontAwesome::Icon.new("foo").style.should == "fill:red"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "sets the font" do
|
19
|
+
FontAwesome::Icon.new("foo").font.should == font
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#to_svg" do
|
24
|
+
subject { to_svg }
|
25
|
+
let(:to_svg) { icon.to_svg }
|
26
|
+
let(:xml) { Nokogiri.XML to_svg }
|
27
|
+
|
28
|
+
before do
|
29
|
+
icon.stubs(:offset_x).returns(256)
|
30
|
+
icon.stubs(:offset_y).returns(1792)
|
31
|
+
icon.stubs(:path).returns("M0 0z")
|
32
|
+
icon.stubs(:style).returns("fill:blue")
|
33
|
+
font.stubs(:em_size).returns(2048)
|
34
|
+
end
|
35
|
+
|
36
|
+
it { should_not include "\n" }
|
37
|
+
it { should_not include "<?xml" }
|
38
|
+
|
39
|
+
it "is valid XML" do
|
40
|
+
xml.should have(0).errors
|
41
|
+
end
|
42
|
+
|
43
|
+
it "contains an SVG image" do
|
44
|
+
xml.root.name.should == "svg"
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "returned SVG image" do
|
48
|
+
subject { svg }
|
49
|
+
let(:svg) { xml.root }
|
50
|
+
|
51
|
+
it "has the correct xml namespace" do
|
52
|
+
svg.namespace.href.should == "http://www.w3.org/2000/svg"
|
53
|
+
svg.namespace.prefix.should be_nil
|
54
|
+
end
|
55
|
+
|
56
|
+
its(["version"]) { should == "1.1" }
|
57
|
+
|
58
|
+
its(["width"]) { should == "100px" }
|
59
|
+
its(["height"]) { should == "100px" }
|
60
|
+
its(["viewBox"]) { should == "-256 -1792 2048 2048" }
|
61
|
+
|
62
|
+
it { should have(1).children }
|
63
|
+
|
64
|
+
describe "path" do
|
65
|
+
subject { path }
|
66
|
+
let(:path) { svg.child }
|
67
|
+
|
68
|
+
its(:name) { should == "path" }
|
69
|
+
its(["d"]) { should == "M0 0z" }
|
70
|
+
its(["style"]) { should == "fill:blue" }
|
71
|
+
its(["transform"]) { should == "rotate(180) scale(-1,1)" }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "#to_uri" do
|
77
|
+
it "returns a data-uri for the SVG image" do
|
78
|
+
icon.expects(:to_svg).returns("a bunch of xml")
|
79
|
+
icon.to_uri.should == "data:image/svg+xml,a%20bunch%20of%20xml"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe ".all" do
|
84
|
+
it "returns an array of all icons" do
|
85
|
+
FontAwesome::HexCode.stubs(:lookup_table).returns({"pizza" => "f00d", "linux" => "f055"})
|
86
|
+
FontAwesome::Icon.expects(:new).with("pizza").returns(:pizza)
|
87
|
+
FontAwesome::Icon.expects(:new).with("linux").returns(:linux)
|
88
|
+
|
89
|
+
FontAwesome::Icon.all.should == [:pizza, :linux]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FontAwesome::SassExtensions::Functions do
|
4
|
+
class EvaluationContext
|
5
|
+
def self.declare(*args)
|
6
|
+
declarations << args
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.declarations
|
10
|
+
@declarations ||= []
|
11
|
+
end
|
12
|
+
|
13
|
+
def assert_type(*args)
|
14
|
+
end
|
15
|
+
|
16
|
+
include FontAwesome::SassExtensions::Functions
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:functions) { EvaluationContext.new }
|
20
|
+
|
21
|
+
it "declares icon-image($name)" do
|
22
|
+
EvaluationContext.declarations.should include [:icon_image, [:name]]
|
23
|
+
end
|
24
|
+
|
25
|
+
it "declares icon-image($name, $style)" do
|
26
|
+
EvaluationContext.declarations.should include [:icon_image, [:name, :style]]
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "icon-image($name)" do
|
30
|
+
subject(:icon_image) { functions.icon_image(name) }
|
31
|
+
let(:name) { Sass::Script::String.new("foo") }
|
32
|
+
let(:icon) { stub("Icon", to_uri: "uri") }
|
33
|
+
|
34
|
+
before { FontAwesome::Icon.stubs(:new).with("foo").returns(icon) }
|
35
|
+
|
36
|
+
it "requires that $name be a string" do
|
37
|
+
functions.expects(:assert_type).with(name, :String)
|
38
|
+
icon_image
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns a data-uri representation of the icon" do
|
42
|
+
icon_image.should == Sass::Script::String.new("uri")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "icon-image($name, $style)" do
|
47
|
+
subject(:icon_image) { functions.icon_image(name, style) }
|
48
|
+
let(:name) { Sass::Script::String.new("foo") }
|
49
|
+
let(:style) { Sass::Script::String.new("fill:blue") }
|
50
|
+
let(:icon) { stub("Icon", :style= => nil, to_uri: "uri") }
|
51
|
+
|
52
|
+
before { FontAwesome::Icon.stubs(:new).with("foo").returns(icon) }
|
53
|
+
|
54
|
+
it "requires that $name and $style be strings" do
|
55
|
+
functions.expects(:assert_type).with(name, :String)
|
56
|
+
functions.expects(:assert_type).with(style, :String)
|
57
|
+
icon_image
|
58
|
+
end
|
59
|
+
|
60
|
+
it "sets the icon style" do
|
61
|
+
icon.expects(:style=).with("fill:blue")
|
62
|
+
icon_image
|
63
|
+
end
|
64
|
+
|
65
|
+
it "returns a data-uri representation of the icon" do
|
66
|
+
icon_image.should == Sass::Script::String.new("uri")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require "font_awesome_rails"
|
3
|
+
|
4
|
+
Dir[File.expand_path("../tasks/**/*.rb", File.dirname(__FILE__))].each {|task| require task }
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
8
|
+
config.run_all_when_everything_filtered = true
|
9
|
+
config.filter_run :focus
|
10
|
+
|
11
|
+
config.order = "random"
|
12
|
+
|
13
|
+
config.mock_with :mocha
|
14
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe UpdateClassicSassTask do
|
4
|
+
subject(:task) { UpdateClassicSassTask.new }
|
5
|
+
|
6
|
+
describe "#contents" do
|
7
|
+
it "returns the Font Awesome scss" do
|
8
|
+
task.expects(:open_file).with("Font-Awesome/sass/font-awesome.scss").returns("scss code")
|
9
|
+
task.contents.should == "scss code"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#styles" do
|
14
|
+
it "returns the Font Awesome styles excluding the @font-face declaration" do
|
15
|
+
contents = task.contents.lines.to_a
|
16
|
+
styles = task.styles.lines.to_a
|
17
|
+
|
18
|
+
styles.first.should == "/* Font Awesome styles\n"
|
19
|
+
styles.should == contents.last(styles.length)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#run" do
|
24
|
+
it "copies classic Font Awesome styles" do
|
25
|
+
task.stubs(:puts)
|
26
|
+
task.stubs(:styles).returns("classic styles")
|
27
|
+
task.expects(:open_file).with("vendor/assets/stylesheets/font-awesome/_classic.scss", "w").yields(mock{
|
28
|
+
expects(:write).with("classic styles")
|
29
|
+
})
|
30
|
+
task.run
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe UpdateHexCodesTask do
|
4
|
+
subject(:task) { UpdateHexCodesTask.new }
|
5
|
+
|
6
|
+
describe "#hex_code_class" do
|
7
|
+
it "returns the source code for FontAwesome::HexCode" do
|
8
|
+
task.expects(:open_file).with("lib/font_awesome/hex_code.rb").returns("source code")
|
9
|
+
task.hex_code_class.should == "source code"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#css" do
|
14
|
+
it "returns the Font Awesome css styles" do
|
15
|
+
task.expects(:open_file).with("Font-Awesome/css/font-awesome.css").returns("css rules")
|
16
|
+
task.css.should == "css rules"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#hex_codes" do
|
21
|
+
it "extracts the hex code lookup table from the css" do
|
22
|
+
task.hex_codes.should have_at_least(200).keys
|
23
|
+
task.hex_codes["glass"].should == "f000"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#updated_hex_code_class" do
|
28
|
+
it "replaces the hex code lookup table in FontAwesome::HexCode" do
|
29
|
+
task.stubs(:hex_codes).returns({"pizza" => "f00d", "linux" => "f055"})
|
30
|
+
diff = task.updated_hex_code_class.lines.to_a - task.hex_code_class.lines.to_a
|
31
|
+
diff.should have(1).item
|
32
|
+
diff.first.should include 'HEX_CODES = {"pizza"=>"f00d", "linux"=>"f055"}'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#run" do
|
37
|
+
it "writes the updated source code" do
|
38
|
+
task.stubs(:puts)
|
39
|
+
task.stubs(:updated_hex_code_class).returns("updated source code")
|
40
|
+
task.expects(:open_file).with("lib/font_awesome/hex_code.rb", "w").yields(mock{expects(:write).with("updated source code")})
|
41
|
+
task.run
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe UpdateMetricsTask do
|
4
|
+
subject(:task) { UpdateMetricsTask.new }
|
5
|
+
|
6
|
+
describe "#font_class" do
|
7
|
+
it "returns the source code for FontAwesome::Font" do
|
8
|
+
task.expects(:open_file).with("lib/font_awesome/font.rb").returns("source code")
|
9
|
+
task.font_class.should == "source code"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#updated_font_class" do
|
14
|
+
it "replaces the ascent and descent constants in FontAwesome::Font" do
|
15
|
+
Metrics.stubs(:ascent).returns(1234)
|
16
|
+
Metrics.stubs(:descent).returns(-567)
|
17
|
+
diff = task.updated_font_class.lines.to_a - task.font_class.lines.to_a
|
18
|
+
diff.should have(2).items
|
19
|
+
diff.first.should include 'ASCENT = 1234'
|
20
|
+
diff.last.should include 'DESCENT = -567'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#run" do
|
25
|
+
it "writes the updated source code" do
|
26
|
+
task.stubs(:puts)
|
27
|
+
task.stubs(:updated_font_class).returns("updated source code")
|
28
|
+
task.expects(:open_file).with("lib/font_awesome/font.rb", "w").yields(mock{
|
29
|
+
expects(:write).with("updated source code")
|
30
|
+
})
|
31
|
+
task.run
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe UpdateSassTask do
|
4
|
+
subject(:task) { UpdateSassTask.new }
|
5
|
+
|
6
|
+
def mock_icon(name, hex_code)
|
7
|
+
stub(name: name, hex_code: stub(to_css: "\\#{hex_code}"))
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#run" do
|
11
|
+
it "writes scss placeholders for icon content" do
|
12
|
+
task.stubs(:puts)
|
13
|
+
FontAwesome::Icon.stubs(:all).returns([mock_icon("pizza", "f00d"), mock_icon("linux", "f055")])
|
14
|
+
task.expects(:open_file).with("app/assets/stylesheets/font-awesome/_icons.scss", "w").yields(mock{
|
15
|
+
expects(:write).with("%icon-pizza { content: '\\f00d'; }\n%icon-linux { content: '\\f055'; }\n")
|
16
|
+
})
|
17
|
+
task.run
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/tasks/gem_dir.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module GemDir
|
2
|
+
extend self
|
3
|
+
|
4
|
+
def expand_path(relative_path)
|
5
|
+
File.expand_path("../#{relative_path}", File.dirname(__FILE__))
|
6
|
+
end
|
7
|
+
|
8
|
+
def open_file(relative_path, mode="r", &block)
|
9
|
+
block = ->(file) { file.read } unless block_given?
|
10
|
+
File.open(expand_path(relative_path), mode, &block)
|
11
|
+
end
|
12
|
+
end
|
data/tasks/spec.rake
ADDED
data/tasks/task.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
namespace :update do
|
2
|
+
|
3
|
+
desc "Copy classic Font Awesome styles"
|
4
|
+
task :classic => "classic:all"
|
5
|
+
|
6
|
+
namespace :classic do
|
7
|
+
|
8
|
+
task :all => ["font_awesome:download", :sass, :ie7]
|
9
|
+
|
10
|
+
task :sass do
|
11
|
+
require_relative "update_classic_sass_task"
|
12
|
+
UpdateClassicSassTask.new.run
|
13
|
+
end
|
14
|
+
|
15
|
+
task :ie7 do
|
16
|
+
require "fileutils"
|
17
|
+
|
18
|
+
source = "Font-Awesome/css/font-awesome-ie7.css"
|
19
|
+
destination = "vendor/assets/stylesheets/font-awesome/ie7.css"
|
20
|
+
|
21
|
+
puts "* Updating #{destination}"
|
22
|
+
FileUtils.cp GemDir.expand_path(source), GemDir.expand_path(destination)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace :update do
|
2
|
+
|
3
|
+
desc "Transfer font files to vendor/assets"
|
4
|
+
task :font => "font_awesome:download" do
|
5
|
+
require "fileutils"
|
6
|
+
|
7
|
+
source = "Font-Awesome/font"
|
8
|
+
destination = "vendor/assets/font"
|
9
|
+
|
10
|
+
puts "* Copying fonts to #{destination}"
|
11
|
+
FileUtils.cp_r "#{GemDir.expand_path(source)}/.", GemDir.expand_path(destination)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
namespace :update do
|
2
|
+
|
3
|
+
desc "Update Font Awesome"
|
4
|
+
task :font_awesome => "font_awesome:download" do
|
5
|
+
puts "* Updating Font Awesome repo"
|
6
|
+
system("cd Font-Awesome && git pull")
|
7
|
+
end
|
8
|
+
|
9
|
+
namespace :font_awesome do
|
10
|
+
|
11
|
+
desc "Download Font Awesome"
|
12
|
+
task :download do
|
13
|
+
unless File.exists?(GemDir.expand_path("Font-Awesome"))
|
14
|
+
puts "* Cloning Font Awesome repo"
|
15
|
+
system("git clone git://github.com/FortAwesome/Font-Awesome.git")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|