fontcustom 1.2.0 → 1.3.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +16 -0
  3. data/CONTRIBUTING.md +35 -15
  4. data/TODO.md +20 -0
  5. data/lib/fontcustom.rb +11 -24
  6. data/lib/fontcustom/base.rb +56 -0
  7. data/lib/fontcustom/cli.rb +13 -12
  8. data/lib/fontcustom/generator/font.rb +63 -65
  9. data/lib/fontcustom/generator/template.rb +81 -52
  10. data/lib/fontcustom/manifest.rb +42 -0
  11. data/lib/fontcustom/options.rb +93 -80
  12. data/lib/fontcustom/scripts/generate.py +116 -127
  13. data/lib/fontcustom/templates/_fontcustom-rails.scss +13 -18
  14. data/lib/fontcustom/templates/_fontcustom.scss +10 -18
  15. data/lib/fontcustom/templates/fontcustom-preview.html +17 -24
  16. data/lib/fontcustom/templates/fontcustom.css +10 -18
  17. data/lib/fontcustom/templates/fontcustom.yml +3 -3
  18. data/lib/fontcustom/utility.rb +145 -0
  19. data/lib/fontcustom/version.rb +1 -1
  20. data/lib/fontcustom/watcher.rb +1 -1
  21. data/spec/fixtures/generators/.fontcustom-manifest-corrupted.json +12 -5
  22. data/spec/fixtures/generators/.fontcustom-manifest-empty.json +0 -0
  23. data/spec/fixtures/generators/.fontcustom-manifest.json +49 -14
  24. data/spec/fixtures/generators/mixed-output/fontcustom_82a59e769bc60192484f2620570bbb59.eot +0 -0
  25. data/spec/fixtures/generators/mixed-output/fontcustom_82a59e769bc60192484f2620570bbb59.svg +56 -0
  26. data/spec/fixtures/generators/mixed-output/fontcustom_82a59e769bc60192484f2620570bbb59.ttf +0 -0
  27. data/spec/fixtures/generators/mixed-output/fontcustom_82a59e769bc60192484f2620570bbb59.woff +0 -0
  28. data/spec/fixtures/sandbox/.gitkeep +0 -0
  29. data/spec/fontcustom/base_spec.rb +58 -0
  30. data/spec/fontcustom/cli_spec.rb +15 -0
  31. data/spec/fontcustom/generator/font_spec.rb +50 -220
  32. data/spec/fontcustom/generator/template_spec.rb +30 -194
  33. data/spec/fontcustom/generator/template_spec.rb.off +215 -0
  34. data/spec/fontcustom/manifest_spec.rb +16 -0
  35. data/spec/fontcustom/options_spec.rb +206 -208
  36. data/spec/fontcustom/utility_spec.rb +163 -0
  37. data/spec/fontcustom/{watcher_spec.rb → watcher_spec.rb.off} +0 -0
  38. data/spec/spec_helper.rb +77 -19
  39. metadata +44 -54
  40. data/lib/fontcustom/templates/_fontcustom-bootstrap-ie7.scss +0 -22
  41. data/lib/fontcustom/templates/_fontcustom-bootstrap.scss +0 -63
  42. data/lib/fontcustom/templates/fontcustom-bootstrap-ie7.css +0 -22
  43. data/lib/fontcustom/templates/fontcustom-bootstrap.css +0 -63
  44. data/lib/fontcustom/util.rb +0 -62
  45. data/spec/fixtures/generators/mixed-output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.eot +0 -0
  46. data/spec/fixtures/generators/mixed-output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.svg +0 -102
  47. data/spec/fixtures/generators/mixed-output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.ttf +0 -0
  48. data/spec/fixtures/generators/mixed-output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.woff +0 -0
  49. data/spec/fontcustom/util_spec.rb +0 -82
@@ -5,10 +5,11 @@
5
5
  # --------------------------------------------------------------------------- #
6
6
 
7
7
  #font_name: fontcustom
8
- #css_prefix: icon-
8
+ #css_selector: .icon-{{glyph}}
9
9
  #preprocessor_path: ""
10
10
  #autowidth: false
11
11
  #no_hash: false
12
+ #force: false
12
13
  #debug: false
13
14
  #quiet: false
14
15
 
@@ -37,8 +38,7 @@
37
38
  # --------------------------------------------------------------------------- #
38
39
  # Templates
39
40
  # Included in Font Custom:
40
- # preview, css, scss, scss-rails, bootstrap, bootstrap-scss, bootstrap-ie7,
41
- # bootstrap-ie7-scss
41
+ # preview, css, scss, scss-rails
42
42
  # Custom templates should be saved in the INPUT[:templates] directory and
43
43
  # referenced by their base file name.
44
44
  # --------------------------------------------------------------------------- #
@@ -0,0 +1,145 @@
1
+ require "json"
2
+ require "thor/actions"
3
+ require "thor/shell"
4
+ require "thor/shell/basic"
5
+ require "thor/shell/color"
6
+
7
+ # Requires access to @options or @cli_options
8
+ module Fontcustom
9
+ module Utility
10
+ include Thor::Actions
11
+
12
+ #
13
+ # Hacks that allow Thor::Actions and Thor::Shell to be used in Fontcustom classes.
14
+ #
15
+
16
+ def self.shell
17
+ @shell || Thor::Shell::Color.new
18
+ end
19
+
20
+ def behavior
21
+ :invoke
22
+ end
23
+
24
+ def shell
25
+ Fontcustom::Utility.shell
26
+ end
27
+
28
+ def say_status(*args)
29
+ shell.say_status *args
30
+ end
31
+
32
+ def destination_root
33
+ @destination_stack ||= [_options[:project_root]]
34
+ @destination_stack.last
35
+ end
36
+
37
+ def source_paths
38
+ @source_paths ||= [File.join(Fontcustom.gem_lib, "templates")]
39
+ end
40
+
41
+ #
42
+ # Options
43
+ #
44
+
45
+ module HashWithMethodAccess
46
+ def method_missing(method, arg = nil)
47
+ if method[-1, 1] == "="
48
+ self[method[0...-1].to_sym] = arg
49
+ else
50
+ self[method.to_sym]
51
+ end
52
+ end
53
+ end
54
+
55
+ def symbolize_hash(hash)
56
+ hash.inject({}) { |memo, (k, v)| memo[k.to_sym] = v; memo }
57
+ end
58
+
59
+ def methodize_hash(hash)
60
+ hash.extend HashWithMethodAccess
61
+ end
62
+
63
+ #
64
+ # Paths
65
+ #
66
+
67
+ def expand_path(path)
68
+ return path if path[0] == "/" # ignore absolute paths
69
+ File.expand_path File.join(_options[:project_root], path)
70
+ end
71
+
72
+ # TODO Is this robust enough?
73
+ def relative_to_root(path)
74
+ path = path.sub(_options[:project_root], "")
75
+ path = path[1..-1] if path[0] == "/"
76
+ path = "." if path.empty?
77
+ path
78
+ end
79
+
80
+ #
81
+ # Manifest / Files
82
+ #
83
+
84
+ def write_file(file, content = "", message = nil, message_body = nil)
85
+ File.open(file, "w") { |f| f.write(content) }
86
+ if message
87
+ body = message_body || relative_to_root(file)
88
+ say_message message, body
89
+ end
90
+ end
91
+
92
+ def get_manifest(file = _options[:manifest])
93
+ begin
94
+ json = File.read file
95
+ JSON.parse(json, :symbolize_names => true)
96
+ rescue JSON::ParserError
97
+ raise Fontcustom::Error,
98
+ "Couldn't parse `#{relative_to_root file}`. Fix the invalid "\
99
+ "JSON or delete the file to start from scratch."
100
+ end
101
+ end
102
+
103
+ def save_manifest
104
+ json = JSON.pretty_generate @manifest
105
+ write_file _options[:manifest], json
106
+ end
107
+
108
+ def delete_from_manifest(key)
109
+ files = @manifest[key]
110
+ return if files.empty?
111
+ begin
112
+ deleted = []
113
+ @manifest[key].each do |file|
114
+ remove_file file, :verbose => false
115
+ deleted << file
116
+ end
117
+ ensure
118
+ @manifest[key] = @manifest[key] - deleted
119
+ save_manifest
120
+ say_changed :delete, deleted
121
+ end
122
+ end
123
+
124
+ #
125
+ # Messages
126
+ #
127
+
128
+ def say_message(status, message, color = :yellow)
129
+ return if _options[:quiet] && status != :error
130
+ say_status status, message, color
131
+ end
132
+
133
+ def say_changed(status, changed)
134
+ return if _options[:quiet]
135
+ message = changed.map { |file| relative_to_root(file) }
136
+ say_status status, message.join("\n#{" " * 14}"), :green # magic number
137
+ end
138
+
139
+ private
140
+
141
+ def _options
142
+ @options || @cli_options
143
+ end
144
+ end
145
+ end
@@ -1,3 +1,3 @@
1
1
  module Fontcustom
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0.beta"
3
3
  end
@@ -3,7 +3,7 @@ require "listen"
3
3
 
4
4
  module Fontcustom
5
5
  class Watcher
6
- include Util
6
+ include Utility
7
7
 
8
8
  def initialize(opts)
9
9
  @opts = opts
@@ -1,18 +1,25 @@
1
1
  'Totally invalid JSON.'
2
2
  {
3
- 'fonts": [
3
+ "checksum": {
4
+ "current": "82a59e769bc60192484f2620570bbb59e225db97c1aac3f242a2e49d6060a19c",
5
+ "previous": "82a59e769bc60192484f2620570bbb59e225db97c1aac3f242a2e49d6060a19c"
6
+ },
7
+ "fonts": [
4
8
  "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.woff",
5
9
  "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.ttf",
6
10
  "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.eot",
7
11
  "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.svg"
8
12
  ],
9
- "templates": [
10
- "fontcustom.css"
11
- ],
12
- "file_name": "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e",
13
13
  "glyphs": [
14
14
  "a_r3ally-exotic-f1le-name",
15
15
  "c",
16
16
  "d"
17
+ ],
18
+ "options": {
19
+ "foo": "bar",
20
+ "baz": "bum"
21
+ },
22
+ "templates": [
23
+ "fontcustom.css"
17
24
  ]
18
25
  }
@@ -1,17 +1,52 @@
1
1
  {
2
+ "checksum": {
3
+ "current": "82a59e769bc60192484f2620570bbb59e225db97c1aac3f242a2e49d6060a19c",
4
+ "previous": "82a59e769bc60192484f2620570bbb59e225db97c1aac3f242a2e49d6060a19c"
5
+ },
2
6
  "fonts": [
3
- "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.woff",
4
- "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.ttf",
5
- "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.eot",
6
- "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.svg"
7
- ],
8
- "templates": [
9
- "fontcustom.css"
10
- ],
11
- "file_name": "fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e",
12
- "glyphs": [
13
- "a_r3ally-exotic-f1le-name",
14
- "c",
15
- "d"
16
- ]
7
+ "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/fontcustom/fontcustom_82a59e769bc60192484f2620570bbb59.ttf",
8
+ "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/fontcustom/fontcustom_82a59e769bc60192484f2620570bbb59.svg",
9
+ "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/fontcustom/fontcustom_82a59e769bc60192484f2620570bbb59.woff",
10
+ "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/fontcustom/fontcustom_82a59e769bc60192484f2620570bbb59.eot"
11
+ ],
12
+ "glyphs": {
13
+ "a_r3ally-exotic-f1le-name": {
14
+ "codepoint": 61696,
15
+ "source": "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/vectors/a_R3ally-eXotic f1Le Name.svg"
16
+ },
17
+ "c": {
18
+ "codepoint": 61697,
19
+ "source": "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/vectors/C.svg"
20
+ },
21
+ "d": {
22
+ "codepoint": 61698,
23
+ "source": "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/vectors/D.svg"
24
+ }
25
+ },
26
+ "options": {
27
+ "autowidth": false,
28
+ "config": false,
29
+ "css_prefix": "test-",
30
+ "debug": false,
31
+ "font_name": "fontcustom",
32
+ "input": {
33
+ "templates": "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/vectors",
34
+ "vectors": "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/vectors"
35
+ },
36
+ "manifest": "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/.fontcustom-manifest-fonts.json",
37
+ "no_hash": false,
38
+ "output": {
39
+ "css": "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/fontcustom",
40
+ "fonts": "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/fontcustom",
41
+ "preview": "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test/fontcustom"
42
+ },
43
+ "preprocessor_path": null,
44
+ "project_root": "/Users/kz/Projects/fontcustom/spec/fixtures/sandbox/test",
45
+ "quiet": true,
46
+ "templates": [
47
+ "/Users/kz/Projects/fontcustom/lib/fontcustom/templates/fontcustom.css",
48
+ "/Users/kz/Projects/fontcustom/lib/fontcustom/templates/fontcustom-preview.html"
49
+ ]
50
+ },
51
+ "templates": []
17
52
  }
@@ -0,0 +1,56 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <!--
4
+ 2013-11-10: Created.
5
+ -->
6
+ <svg xmlns="http://www.w3.org/2000/svg">
7
+ <metadata>
8
+ Created by FontForge 20120731 at Sun Nov 10 12:45:07 2013
9
+ By Kai Zau
10
+ Created by Kai Zau with FontForge 2.0 (http://fontforge.sf.net)
11
+ </metadata>
12
+ <defs>
13
+ <font id="fontcustom" horiz-adv-x="512" >
14
+ <font-face
15
+ font-family="fontcustom"
16
+ font-weight="500"
17
+ font-stretch="normal"
18
+ units-per-em="512"
19
+ panose-1="2 0 6 9 0 0 0 0 0 0"
20
+ ascent="448"
21
+ descent="-64"
22
+ bbox="0 -64 513.92 448"
23
+ underline-thickness="25.6"
24
+ underline-position="-51.2"
25
+ unicode-range="U+F100-F102"
26
+ />
27
+ <missing-glyph />
28
+ <glyph glyph-name="uniF100" unicode="&#xf100;"
29
+ d="M496.112 255.934c-3.53223 0 -6.81934 1.03906 -9.58398 2.81543l-50.8467 -43.3096l54.9375 -76.9023c0.15332 0.00976562 0.306641 0.0253906 0.460938 0.0253906c5.75977 0 10.4346 -4.66895 10.4346 -10.4297c0 -5.75977 -4.66992 -10.4287 -10.4297 -10.4287
30
+ s-10.4189 4.66895 -10.4189 10.4287c0 1.35156 0.276367 2.63672 0.74707 3.81445l-57.2363 80.1543l-68.2598 40.1816c-2.20703 -2.04785 -2.62695 -3.61523 -7.74707 -4.49609v-90.5977c15.3604 -2.64746 23.8643 -14.6533 23.8643 -29.0664
31
+ c0 -5.73438 -1.74512 -11.0752 -4.57227 -15.6162l34.873 -32.374c2.6875 2.02246 6.02051 3.23145 9.64062 3.23145c8.87793 0 16.0713 -7.19922 16.0713 -16.0723c0 -8.88281 -7.19336 -16.0762 -16.0713 -16.0762s-16.0771 7.19824 -16.0771 16.0762
32
+ c0 1.04492 0.108398 2.06836 0.302734 3.05664l-36.4551 33.8486c-4.89453 -3.56836 -10.9053 -5.7041 -17.4229 -5.7041c-11.2949 0 -21.1045 6.32324 -26.1064 15.6162l-81.4902 -25.2061c-2.59082 -10.2344 -11.8379 -17.8271 -22.8916 -17.8271
33
+ c-13.0664 0 -23.6387 10.5928 -23.6387 23.6387c0 2.97461 0.69043 5.77051 1.70996 8.40234l-35.8047 25.5537c-6.41992 -6.375 -15.2627 -10.3223 -25.001 -10.3223c-5.29883 0 -10.3066 1.19824 -14.8174 3.28223l-3.63477 -4.49023l-27.4639 -40.4688
34
+ c1.22852 -2.05273 1.94531 -4.44922 1.94531 -7.01465c0 -7.57227 -6.13867 -13.7109 -13.7109 -13.7109s-13.7109 6.13867 -13.7109 13.7109c0 7.57812 6.13867 13.7119 13.7109 13.7119c0.839844 0 1.65332 -0.0869141 2.44727 -0.225586l30.582 45.0664
35
+ c-0.0205078 0.0205078 -0.0410156 0.0458984 -0.0615234 0.0712891l0.0869141 0.0673828c-6.66602 6.44531 -10.8291 15.4668 -10.8291 25.4717c0 1.84863 0.276367 3.62012 0.553711 5.40137l-0.287109 0.0976562
36
+ c0.0302734 0.0615234 0.0507812 0.123047 0.0771484 0.189453l-60.0225 27.2842c-3.36914 -3.69629 -8.20703 -6.02637 -13.6035 -6.02637c-10.1836 0 -18.4375 8.25391 -18.4375 18.4375s8.25391 18.4365 18.4375 18.4365s18.4375 -8.25293 18.4375 -18.4365
37
+ c0 -0.707031 -0.046875 -1.4082 -0.128906 -2.09473l58.7676 -26.7051c0.00488281 0.0605469 0.0205078 0.117188 0.0253906 0.178711l0.492188 -0.164062c5.97461 11.1768 17.6123 18.8623 31.1396 18.8623c7.66504 0 14.6787 -2.47266 20.4951 -6.625l42.1533 42.1729
38
+ c-2.05371 3.50781 -3.55371 7.36328 -3.55371 11.7256c0 4.25977 1.1416 8.24316 3.1084 11.6934l-75.1719 33.6689c-4.04492 -4.98145 -10.21 -8.1709 -17.1318 -8.1709c-12.1855 0 -22.0615 9.87598 -22.0615 22.0615s9.88086 22.0625 22.0615 22.0625
39
+ c12.1855 0 22.0625 -9.87695 22.0625 -22.0625c0 -1.20312 -0.123047 -2.375 -0.307617 -3.52734l79.043 -35.4043c3.52734 2.08887 7.63379 3.3125 12.0371 3.3125c1.40234 0 2.76465 -0.148438 4.0957 -0.378906l29.875 63.9385
40
+ c-2.29883 2.58496 -3.70703 5.98535 -3.70703 9.71777c0 8.08984 6.55859 14.6484 14.6484 14.6484s14.6484 -6.55371 14.6484 -14.6484c0 -1.20898 -0.164062 -2.37598 -0.44043 -3.50195l59.5098 -47.2529c3.30762 2.47266 7.39844 3.95312 11.8477 3.95312
41
+ c10.9668 0 19.8555 -8.88867 19.8555 -19.8555c0 -1.63867 -0.219727 -3.22559 -0.59375 -4.74609l65.8633 -38.7432l51.9834 44.2822c-0.706055 1.91992 -1.11035 3.9834 -1.11035 6.14453c0 9.83008 7.97168 17.8076 17.8066 17.8076
42
+ c9.83594 0 17.8076 -7.97754 17.8076 -17.8076c0 -9.83594 -7.97168 -17.8125 -17.8076 -17.8125zM312.679 128.133c0 7.43457 2.75977 14.208 7.27539 19.415l-88.1768 76.3604c-4.18848 -6.60547 -11.5459 -10.9932 -19.9531 -10.9932
43
+ c-4.36719 0 -8.2168 1.5 -11.7295 3.55371l-42.1533 -42.1738c4.11133 -5.77539 6.60547 -12.8359 6.60547 -20.4746c0 -5.56543 -1.38281 -10.7363 -3.6709 -15.4473l36.0342 -25.7129c4.09082 3.38965 9.16504 5.69922 14.9141 5.69922
44
+ c10.9678 0 20.1523 -7.47559 22.8252 -17.5879l78.208 24.1875c-0.112305 1.04395 -0.178711 2.09863 -0.178711 3.17383zM337.92 157.199v90.583c-10.2402 2.44238 -14.8223 10.0254 -14.8223 19.0205c0 2.3916 -0.194336 4.6748 0.578125 6.7998l-59.499 47.2529
45
+ c-2.18164 -1.29102 -4.70508 -2.04297 -7.41895 -2.04297c-0.235352 0 -0.450195 0.0253906 -0.686523 0.0351562l-29.6904 -63.6309c5.57031 -4.32129 9.24707 -11.0645 9.24707 -18.668c0 -0.265625 0.12793 -0.521484 0.117188 -0.788086l94.0029 -81.1318
46
+ c2.36035 1.17285 3.05176 2.05859 8.17188 2.57031z" />
47
+ <glyph glyph-name="uniF101" unicode="&#xf101;"
48
+ d="M256 448c141.399 0 256 -114.601 256 -255.97v-256.03h-512v256.03c0 141.369 114.632 255.97 256 255.97zM494.935 -46.9346v238.965c0 131.733 -107.202 238.899 -238.935 238.899s-238.935 -107.166 -238.935 -238.899v-238.965h477.869zM256 396.8
49
+ c113.101 0 204.8 -91.6992 204.8 -204.77v-204.83l-153.6 153.6v51.2002c0 28.2676 -22.9326 51.2002 -51.2002 51.2002s-51.2002 -22.9326 -51.2002 -51.2002v-51.2002l-153.6 -153.6v204.83c0 113.07 91.7344 204.77 204.8 204.77z" />
50
+ <glyph glyph-name="uniF102" unicode="&#xf102;"
51
+ d="M448 64c35.374 0 64 -28.6924 64 -64s-28.626 -64 -64 -64s-64 28.6924 -64 64c0 8.05859 1.87402 15.626 4.62891 22.748l-96.9375 69.1914c-17.3818 -17.249 -41.3184 -27.9395 -67.6914 -27.9395c-53.002 0 -96 42.998 -96 96c0 5.00195 0.74707 9.80957 1.5 14.6279
52
+ l-76.626 25.5645c-5.62109 -4.94141 -12.8154 -8.19238 -20.874 -8.19238c-17.6895 0 -32 14.3105 -32 32s14.3105 32 32 32c15.3086 0 27.5 -10.9414 30.623 -25.3135l77.0654 -25.748c16.1846 30.2539 47.6885 51.0615 84.3115 51.0615
53
+ c20.751 0 39.752 -6.69141 55.501 -17.9404l114.125 114.191c-5.56543 9.49707 -9.62598 19.9375 -9.62598 31.749c0 35.374 28.626 64 64 64s64 -28.626 64 -64s-28.626 -64 -64 -64c-11.8115 0 -22.252 4.06055 -31.7539 9.62598l-114.125 -114.187
54
+ c11.126 -15.6318 17.874 -34.75 17.874 -55.4395c0 -15.0576 -3.74805 -29.0615 -9.93848 -41.8096l97.5674 -69.6328c11.0645 9.19043 24.8164 15.4424 40.376 15.4424z" />
55
+ </font>
56
+ </defs></svg>
File without changes
@@ -0,0 +1,58 @@
1
+ require "spec_helper"
2
+
3
+ describe Fontcustom::Base do
4
+ context "#compile" do
5
+ context "when [:checksum][:current] equals [:checksum][:previous]" do
6
+ it "should show 'no change' message" do
7
+ Fontcustom::Base.any_instance.stub :init_manifest
8
+ Fontcustom::Base.any_instance.stub :check_fontforge
9
+ base = Fontcustom::Base.new({})
10
+ base.stub(:checksum).and_return("abc")
11
+ base.instance_variable_set :@manifest, {:checksum => {:previous => "abc", :current => ""}}
12
+ base.instance_variable_set :@options, {:quiet => false}
13
+
14
+ output = capture(:stdout) { base.compile }
15
+ output.should match(/No changes/)
16
+ end
17
+ end
18
+ end
19
+
20
+ context ".check_fontforge" do
21
+ it "should raise error if fontforge isn't installed" do
22
+ Fontcustom::Base.any_instance.stub :init_manifest
23
+ Fontcustom::Base.any_instance.stub(:"`").and_return("")
24
+ expect { Fontcustom::Base.new(:option => "foo") }.to raise_error Fontcustom::Error, /fontforge/
25
+ end
26
+ end
27
+
28
+ context ".init_manifest" do
29
+ before(:each) do
30
+ Fontcustom::Base.any_instance.stub :check_fontforge
31
+ manifest = double("manifest")
32
+ manifest.should_receive(:manifest).and_return(manifest_contents)
33
+ Fontcustom::Manifest.stub(:new).and_return manifest
34
+ end
35
+
36
+ it "should pass CLI options to FC::Options" do
37
+ opts = double "options"
38
+ opts.should_receive :options
39
+ Fontcustom::Options.should_receive(:new).with({:foo => "bar"}).and_return opts
40
+ Fontcustom::Base.new :foo => "bar"
41
+ end
42
+ end
43
+
44
+ context ".checksum" do
45
+ it "should return hash of all vectors and templates" do
46
+ pending "SHA2 is different on CI servers. Why?"
47
+ Fontcustom::Base.any_instance.stub :check_fontforge
48
+ Fontcustom::Base.any_instance.stub :init_manifest
49
+ base = Fontcustom::Base.new({})
50
+ base.instance_variable_set :@options, {
51
+ :input => {:vectors => fixture("shared/vectors")},
52
+ :templates => Dir.glob(File.join(fixture("shared/templates"), "*"))
53
+ }
54
+ hash = base.send :checksum
55
+ hash.should == "81ffd2f72877be02aad673fdf59c6f9dbfee4cc37ad0b121b9486bc2923b4b36"
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+ require "fontcustom/cli"
3
+
4
+ describe Fontcustom::CLI do
5
+ context "#compile" do
6
+ it "should generate fonts and templates (integration)", :integration => true do
7
+ live_test do |testdir|
8
+ Fontcustom::CLI.start ["compile", "vectors", "--quiet"]
9
+ manifest = File.join testdir, ".fontcustom-manifest.json"
10
+ Dir.glob(File.join(testdir, "fontcustom", "fontcustom_*\.{ttf,svg,woff,eot}")).length.should == 4
11
+ File.read(manifest).should match(/"fonts":.+sandbox\/test\/fontcustom\/fontcustom_.+\.ttf"/m)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,244 +1,74 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Fontcustom::Generator::Font do
4
- # Silence messages without passing :quiet => true to everything
5
- before(:each) do
6
- Fontcustom::Options.any_instance.stub :say_message
7
- end
8
-
9
- def generator(options)
10
- opts = Fontcustom::Options.new(options)
11
- Fontcustom::Generator::Font.new([opts])
4
+ def generator
5
+ Fontcustom::Generator::Font.any_instance.stub(:get_manifest).and_return :options => {}
6
+ Fontcustom::Generator::Font.new("")
12
7
  end
13
8
 
14
- context "#prepare_output_dirs" do
15
- it "should create output dir if it doesn't exist" do
16
- options = {
17
- :project_root => fixture,
18
- :input => "shared/vectors",
19
- :output => "create-me"
20
- }
21
- gen = generator options
22
- gen.stub(:empty_directory)
23
- gen.should_receive(:empty_directory).with(fixture("create-me"), anything)
24
- gen.prepare_output_dirs
9
+ context "#generate" do
10
+ it "should set manifest[:glyphs] (integration)", :integration => true do
11
+ live_test do |testdir|
12
+ manifest = test_manifest
13
+ gen = Fontcustom::Generator::Font.new manifest
14
+ gen.stub :create_fonts
15
+ gen.generate
16
+ File.read(manifest).should match(/"glyphs":.+"c":/m)
17
+ end
25
18
  end
26
19
 
27
- it "should create dirs for multiple output dirs" do
28
- options = {
29
- :project_root => fixture,
30
- :input => "shared/vectors",
31
- :output => {
32
- :fonts => "assets/fonts",
33
- :css => "assets/stylesheets"
34
- }
35
- }
36
- gen = generator options
37
- gen.stub(:empty_directory)
38
- gen.should_receive(:empty_directory).twice
39
- gen.prepare_output_dirs
20
+ it "should generate fonts (integration)", :integration => true do
21
+ live_test do |testdir|
22
+ manifest = test_manifest
23
+ Fontcustom::Generator::Font.new(manifest).generate
24
+ Dir.glob(File.join(testdir, "fontcustom", "fontcustom_*\.{ttf,svg,woff,eot}")).length.should == 4
25
+ File.read(manifest).should match(/"fonts":.+sandbox\/test\/fontcustom\/fontcustom_.+\.ttf"/m)
26
+ end
40
27
  end
41
28
  end
42
29
 
43
- context "#get_manifest" do
44
- it "should assign empty data model if data file is empty or missing" do
45
- options = {
46
- :project_root => fixture,
47
- :input => "shared/vectors",
48
- :quiet => true
49
- }
50
- gen = generator options
51
- gen.get_manifest
52
- data = gen.instance_variable_get("@data")
53
- data.should == Fontcustom::DATA_MODEL
54
- end
55
-
56
- it "should assign @data from data file" do
57
- options = {
58
- :project_root => fixture,
59
- :config => "generators",
60
- :input => "shared/vectors",
61
- :output => "mixed-output",
62
- :quiet => true
63
- }
64
- gen = generator options
65
- gen.get_manifest
66
- data = gen.instance_variable_get("@data")
67
- data.should_not == Fontcustom::DATA_MODEL
68
- end
69
-
70
- it "should throw an error if the data file is corrupted." do
30
+ context ".create_output_dirs" do
31
+ it "should create empty dirs if they don't exist" do
32
+ gen = generator
71
33
  options = {
72
- :project_root => fixture,
73
- :config => "generators",
74
- :manifest => "generators/.fontcustom-manifest-corrupted.json",
75
- :input => "shared/vectors",
76
- :output => "mixed-output",
34
+ :output => {:fonts => "path/fonts", :vectors => "path/vectors"},
77
35
  :quiet => true
78
36
  }
79
- gen = generator options
80
- expect { gen.get_manifest }.to raise_error Fontcustom::Error, /corrupted/
37
+ gen.instance_variable_set :@options, options
38
+ gen.should_receive(:empty_directory).with("path/fonts", :verbose => false)
39
+ gen.should_receive(:empty_directory).with("path/vectors", :verbose => false)
40
+ gen.send :create_output_dirs
81
41
  end
82
42
  end
83
43
 
84
- context "#reset_output" do
85
- subject do
86
- options = {
87
- :project_root => fixture,
88
- :input => "shared/vectors",
89
- :output => "mixed-output",
90
- :quiet => true
91
- }
92
- gen = generator options
93
- gen.stub :remove_file
94
- gen.stub :overwrite_file
95
- gen.instance_variable_set(:@data, data_file_contents)
96
- gen
97
- end
98
-
99
- it "should delete fonts from @data[:fonts]" do
100
- subject.should_receive(:remove_file).exactly(4).times.with(/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e/, anything)
101
- subject.reset_output
102
- end
44
+ context ".set_glyph_info" do
45
+ it "should set :glyphs in manifest" do
46
+ gen = generator
47
+ gen.instance_variable_set :@options, :input => {:vectors => fixture("shared/vectors")}
48
+ gen.instance_variable_set :@manifest, :glyphs => {}
103
49
 
104
- it "should not delete non-font files" do
105
- subject.should_not_receive(:remove_file).with("dont-delete-me.bro")
106
- subject.should_not_receive(:remove_file).with("another-font.ttf")
107
- subject.should_not_receive(:remove_file).with("fontcustom.css")
108
- subject.reset_output
50
+ gen.should_receive(:save_manifest)
51
+ gen.send :set_glyph_info
52
+ manifest = gen.instance_variable_get(:@manifest)
53
+ manifest[:glyphs][:"a_r3ally-exotic-f1le-name"].should include(:codepoint => 61696)
54
+ manifest[:glyphs][:c].should include(:codepoint => 61697)
55
+ manifest[:glyphs][:d].should include(:codepoint => 61698)
109
56
  end
110
57
 
111
- it "should empty @data[:fonts]" do
112
- subject.reset_output
113
- subject.instance_variable_get(:@data)[:fonts].should be_empty
114
- end
58
+ it "should not change codepoints of existing glyphs" do
59
+ gen = generator
60
+ gen.instance_variable_set :@options, :input => {:vectors => fixture("shared/vectors")}
61
+ gen.instance_variable_set :@manifest, :glyphs => {:c => {:source => "foo", :codepoint => 61699}}
115
62
 
116
- it "should update the data file" do
117
- file = fixture(".fontcustom-manifest.json")
118
- subject.should_receive(:overwrite_file).once.with(file, /"fonts":/)
119
- subject.reset_output
120
- end
121
-
122
- it "should be silent" do
123
- stdout = capture(:stdout) { subject.reset_output }
124
- stdout.should == ""
63
+ gen.should_receive(:save_manifest)
64
+ gen.send :set_glyph_info
65
+ manifest = gen.instance_variable_get(:@manifest)
66
+ manifest[:glyphs][:"a_r3ally-exotic-f1le-name"].should include(:codepoint => 61700)
67
+ manifest[:glyphs][:c].should include(:codepoint => 61699)
68
+ manifest[:glyphs][:d].should include(:codepoint => 61701)
125
69
  end
126
70
  end
127
71
 
128
- context "#generate" do
129
- subject do
130
- gen = generator(
131
- :project_root => fixture,
132
- :input => "shared/vectors",
133
- :output => "mixed-output",
134
- :quiet => true
135
- )
136
- gen.stub(:execute_and_clean).and_return [fontforge_stdout.split("\n"), fontforge_stderr, double(:status, :success? => true)]
137
- gen
138
- end
139
-
140
- it "should call fontforge" do
141
- subject.should_receive(:execute_and_clean).with(/fontforge -script/)
142
- subject.generate
143
- end
144
-
145
- it "should pass options to fontforge" do
146
- subject.should_receive(:execute_and_clean).with(/#{fixture("shared/vectors")}.+#{fixture("mixed-output")}/)
147
- subject.generate
148
- end
149
-
150
- it "should assign @json" do
151
- subject.generate
152
- json = subject.instance_variable_get(:@json)
153
- json.should == data_file_contents.to_json
154
- end
155
-
156
- it "should raise error if fontforge fails" do
157
- gen = generator(
158
- :project_root => fixture,
159
- :input => "shared/vectors",
160
- :output => "fake-dir-should-cause-failure",
161
- :debug => true
162
- )
163
- expect { capture(:stdout) { gen.generate } }.to raise_error Fontcustom::Error, /failed/
164
- end
165
- end
166
-
167
- context "#collect_data" do
168
- it "should assign @data from @json" do
169
- gen = generator(
170
- :project_root => fixture,
171
- :input => "shared/vectors",
172
- :output => "output"
173
- )
174
- gen.instance_variable_set(:@data, Fontcustom::DATA_MODEL)
175
- gen.instance_variable_set(:@json, data_file_contents.to_json)
176
- gen.collect_data
177
- data = gen.instance_variable_get(:@data)
178
- data[:glyphs].should =~ ["c", "d", "a_r3ally-exotic-f1le-name"]
179
- data[:fonts].should =~ [
180
- fixture("output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.eot"),
181
- fixture("output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.svg"),
182
- fixture("output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.ttf"),
183
- fixture("output/fontcustom_cc5ce52f2ae4f9ce2e7ee8131bbfee1e.woff")
184
- ]
185
- end
186
- end
187
-
188
- context "#announce_files" do
189
- it "should print generated files to console" do
190
- gen = generator(
191
- :project_root => fixture,
192
- :input => "shared/vectors",
193
- :output => "output"
194
- )
195
- gen.instance_variable_set :@data, data_file_contents
196
- stdout = capture(:stdout) { gen.announce_files }
197
- stdout.should =~ /create.+\.(woff|ttf|eot|svg)/
198
- end
199
-
200
- it "should print nothing if :quiet is set" do
201
- gen = generator(
202
- :project_root => fixture,
203
- :input => "shared/vectors",
204
- :output => "output",
205
- :quiet => true
206
- )
207
- gen.instance_variable_set :@data, data_file_contents
208
- stdout = capture(:stdout) { gen.announce_files }
209
- stdout.should == ""
210
- end
211
- end
212
-
213
- context "#save_data" do
214
- it "should update data file" do
215
- gen = generator(
216
- :project_root => fixture,
217
- :input => "shared/vectors",
218
- :output => "output"
219
- )
220
- gen.stub :overwrite_file
221
- gen.instance_variable_set(:@data, data_file_contents)
222
- file = File.join fixture(".fontcustom-manifest.json")
223
- gen.should_receive(:overwrite_file).once.with do |path, content|
224
- path.should == file
225
- content.should match(/"fonts":/)
226
- content.should match(/"glyphs":/)
227
- end
228
- gen.save_data
229
- end
230
-
231
- it "should be silent if :quiet is set" do
232
- gen = generator(
233
- :project_root => fixture,
234
- :input => "shared/vectors",
235
- :output => "output",
236
- :quiet => true
237
- )
238
- gen.stub :overwrite_file
239
- gen.instance_variable_set(:@data, data_file_contents)
240
- stdout = capture(:stdout) { gen.save_data }
241
- stdout.should == ""
242
- end
243
- end
72
+ #context ".run_fontforge" do
73
+ #end
244
74
  end