font_awesome_rails 0.0.1
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/.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
|