fontist 1.7.1 → 1.8.3

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 +4 -4
  2. data/.github/workflows/release.yml +38 -0
  3. data/.github/workflows/rspec.yml +58 -0
  4. data/README.md +123 -32
  5. data/{bin → exe}/fontist +0 -0
  6. data/fontist.gemspec +4 -2
  7. data/lib/fontist.rb +6 -3
  8. data/lib/fontist/cli.rb +66 -42
  9. data/lib/fontist/errors.rb +62 -12
  10. data/lib/fontist/font.rb +23 -37
  11. data/lib/fontist/font_installer.rb +114 -0
  12. data/lib/fontist/fontist_font.rb +3 -49
  13. data/lib/fontist/formula.rb +89 -63
  14. data/lib/fontist/formula_paths.rb +43 -0
  15. data/lib/fontist/helpers.rb +7 -0
  16. data/lib/fontist/import/create_formula.rb +3 -2
  17. data/lib/fontist/import/google/skiplist.yml +3 -0
  18. data/lib/fontist/import/google_check.rb +1 -1
  19. data/lib/fontist/import/google_import.rb +3 -4
  20. data/lib/fontist/import/otfinfo_generate.rb +1 -1
  21. data/lib/fontist/import/recursive_extraction.rb +6 -2
  22. data/lib/fontist/import/sil_import.rb +99 -0
  23. data/lib/fontist/index.rb +72 -0
  24. data/lib/fontist/index_formula.rb +30 -0
  25. data/lib/fontist/manifest/install.rb +4 -9
  26. data/lib/fontist/manifest/locations.rb +28 -20
  27. data/lib/fontist/system_font.rb +32 -91
  28. data/lib/fontist/system_index.rb +47 -5
  29. data/lib/fontist/utils.rb +1 -0
  30. data/lib/fontist/utils/cache.rb +11 -3
  31. data/lib/fontist/utils/exe_extractor.rb +1 -1
  32. data/lib/fontist/utils/locking.rb +17 -0
  33. data/lib/fontist/utils/zip_extractor.rb +1 -1
  34. data/lib/fontist/version.rb +1 -1
  35. metadata +43 -20
  36. data/.github/workflows/macosx.yml +0 -33
  37. data/.github/workflows/ubuntu.yml +0 -30
  38. data/.github/workflows/windows.yml +0 -32
  39. data/bin/check_google +0 -8
  40. data/bin/console +0 -11
  41. data/bin/convert_formulas +0 -8
  42. data/bin/generate_otfinfo +0 -8
  43. data/bin/import_google +0 -8
  44. data/bin/rspec +0 -29
  45. data/bin/setup +0 -7
  46. data/lib/fontist/font_formula.rb +0 -158
  47. data/lib/fontist/formula_template.rb +0 -122
  48. data/lib/fontist/formulas.rb +0 -56
  49. data/lib/fontist/registry.rb +0 -43
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e024a76941056e06491654749b2a467dd1df4212752a3a98e8a9ee58755af281
4
- data.tar.gz: d7caaade9c91008f4e0b91b157847d2de4dd26203d88c3558583549fec3bdb5a
3
+ metadata.gz: 8b8f20509f7376c4f88906c9f5d95d02f965351433b2b9f47c46d7e9e5afbb1e
4
+ data.tar.gz: e4c71f47525f2c82f0d098eca47629bc808bd1bbff7c83b39f4ede42fd507c05
5
5
  SHA512:
6
- metadata.gz: 8d68a69167a89f6aa143f972da95f5bb06d2831e7e243d6c3ef338d47cc924b5b59c9f0404fad95dbd09b5ed870a555fae6a22e043a7a2eaa564b89036ddebfc
7
- data.tar.gz: 3497ef80333b61a6a3df80f2493b3442779de017965cffbcffa13fbeb11a056de4f4741121100c8c7b34bd118e8af1aa1deaccad92423d8b68aa4b3b33c05c5a
6
+ metadata.gz: 82f8dc79feec65cd9a1ec567f6168dd9ff06fb7ba4ac7d8fbc58e450dba52380ba98d1d9f559b102ab4c997321565e2ee7fe04ac1b34100b7ce3c66078367b20
7
+ data.tar.gz: 2c80173b5683ed435c609f40bdfae52a0be258a1f491228fba93f2feedea1f28141461708b5c2a84385b5dde84af52792465c21dcf709dfd0f9a4f42d142cf57
@@ -0,0 +1,38 @@
1
+ name: release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ jobs:
9
+ release:
10
+ runs-on: ubuntu-18.04
11
+ steps:
12
+ - uses: actions/checkout@v1
13
+
14
+ - uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: '2.6'
17
+
18
+ - run: bundle config set path 'vendor/bundle'
19
+
20
+ - run: bundle install --jobs 4 --retry 3
21
+
22
+ - run: bundle exec rspec --tag ~dev
23
+ env:
24
+ TEST_ENV: CI
25
+
26
+ - name: Publish to rubygems.org
27
+ env:
28
+ RUBYGEMS_API_KEY: ${{secrets.FONTIST_CI_RUBYGEMS_API_KEY}}
29
+ run: |
30
+ gem install gem-release
31
+ touch ~/.gem/credentials
32
+ cat > ~/.gem/credentials << EOF
33
+ ---
34
+ :rubygems_api_key: ${RUBYGEMS_API_KEY}
35
+ EOF
36
+ chmod 0600 ~/.gem/credentials
37
+ git status
38
+ gem release
@@ -0,0 +1,58 @@
1
+ name: rspec
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+
8
+ jobs:
9
+ build:
10
+ name: Test on Ruby ${{ matrix.ruby }} ${{ matrix.os }}
11
+ runs-on: ${{ matrix.os }}
12
+ continue-on-error: ${{ matrix.experimental }}
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ ruby: [ '2.6', '2.5', '2.4' ]
17
+ os: [ ubuntu-latest, windows-latest, macos-latest ]
18
+ experimental: [ false ]
19
+ include:
20
+ - ruby: '2.7'
21
+ os: 'ubuntu-latest'
22
+ experimental: true
23
+ - ruby: '2.7'
24
+ os: 'windows-latest'
25
+ experimental: true
26
+ - ruby: '2.7'
27
+ os: 'macos-latest'
28
+ experimental: true
29
+
30
+ steps:
31
+ - uses: actions/checkout@master
32
+
33
+ - uses: ruby/setup-ruby@v1
34
+ with:
35
+ ruby-version: ${{ matrix.ruby }}
36
+
37
+ - uses: actions/cache@v1
38
+ with:
39
+ path: vendor/bundle
40
+ key: bundle-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/*.gemspec') }}
41
+ restore-keys: bundle-${{ matrix.os }}-${{ matrix.ruby }}
42
+
43
+ - if: matrix.os == 'macos-latest'
44
+ run: brew install lcdf-typetools
45
+
46
+ - run: bundle config set path 'vendor/bundle'
47
+
48
+ - run: bundle install --jobs 4 --retry 3
49
+
50
+ - if: matrix.os == 'macos-latest'
51
+ run: bundle exec rspec
52
+ env:
53
+ TEST_ENV: CI
54
+
55
+ - if: matrix.os != 'macos-latest'
56
+ run: bundle exec rspec --tag ~dev
57
+ env:
58
+ TEST_ENV: CI
data/README.md CHANGED
@@ -44,7 +44,7 @@ can we find a font in your system.
44
44
 
45
45
  #### Finding a font
46
46
 
47
- The `Fontist::Fontist.find` interface can be used a find a font in your system.
47
+ The `Fontist::Font.find` interface can be used a find a font in your system.
48
48
  It will look into the operating system specific font directories, and also the
49
49
  fontist specific `~/.fontist` directory.
50
50
 
@@ -109,7 +109,7 @@ fonts in your system.
109
109
  #### Find formula fonts
110
110
 
111
111
  Normally, each font name can be associated with multiple styles or collection, for
112
- example the `Calibri` font might contains a `regular`, `bola` or `italic` styles
112
+ example the `Calibri` font might contains a `regular`, `bold` or `italic` styles
113
113
  fonts and if you want a interface that can return the complete list then this is
114
114
  your friend. You can use it as following:
115
115
 
@@ -136,28 +136,29 @@ operation you would do in any ruby object.
136
136
 
137
137
  #### Locations
138
138
 
139
- Fontist lets find font locations from a YAML manifest of the following format:
139
+ Fontist lets find font locations from a manifest of the following format:
140
140
 
141
- ```yml
142
- Segoe UI:
143
- - Regular
144
- - Bold
145
- Roboto Mono:
146
- - Regular
141
+ ```ruby
142
+ {"Segoe UI"=>["Regular", "Bold"],
143
+ "Roboto Mono"=>["Regular"]}
147
144
  ```
148
145
 
149
- Calling the following code returns a nested hash with font paths.
146
+ Calling the following code returns a nested hash with font paths and names.
147
+ Font name is useful to choose a specific font in a font collection file (TTC).
150
148
 
151
149
  ```ruby
152
- Fontist::Manifest::Locations.call(manifest_path)
150
+ Fontist::Manifest::Locations.from_hash(manifest)
153
151
  ```
154
152
 
155
153
  ```ruby
156
- {"Segoe UI"=>
157
- {"Regular"=>["/Users/user/.fontist/fonts/SEGOEUI.TTF"],
158
- "Bold"=>["/Users/user/.fontist/fonts/SEGOEUIB.TTF"]},
159
- "Roboto Mono"=>
160
- {"Regular"=>[]}}
154
+ {"Segoe UI"=> {
155
+ "Regular"=>{"full_name"=>"Segoe UI",
156
+ "paths"=>["/Users/user/.fontist/fonts/SEGOEUI.TTF"]},
157
+ "Bold"=>{"full_name"=>"Segoe UI Bold",
158
+ "paths"=>["/Users/user/.fontist/fonts/SEGOEUIB.TTF"]}},
159
+ "Roboto Mono"=> {
160
+ "Regular"=>{"full_name"=>nil,
161
+ "paths"=>[]}}}
161
162
  ```
162
163
 
163
164
  #### Install
@@ -166,17 +167,41 @@ Fontist lets not only to get font locations but also to install fonts from the
166
167
  manifest:
167
168
 
168
169
  ```ruby
169
- Fontist::Manifest::Install.call(manifest, confirmation: "yes")
170
+ Fontist::Manifest::Install.from_hash(manifest, confirmation: "yes")
170
171
  ```
171
172
 
172
173
  It will install fonts and return their locations:
173
174
 
174
175
  ```ruby
175
- {"Segoe UI"=>
176
- {"Regular"=>["/Users/user/.fontist/fonts/SEGOEUI.TTF"],
177
- "Bold"=>["/Users/user/.fontist/fonts/SEGOEUIB.TTF"]},
178
- "Roboto Mono"=>
179
- {"Regular"=>["/Users/user/.fontist/fonts/RobotoMono-VariableFont_wght.ttf"]}}
176
+ {"Segoe UI"=> {
177
+ "Regular"=>{"full_name"=>"Segoe UI",
178
+ "paths"=>["/Users/user/.fontist/fonts/SEGOEUI.TTF"]},
179
+ "Bold"=>{"full_name"=>"Segoe UI Bold",
180
+ "paths"=>["/Users/user/.fontist/fonts/SEGOEUIB.TTF"]}},
181
+ "Roboto Mono"=> {
182
+ "Regular"=>{"full_name"=>"Roboto Mono Regular",
183
+ "paths"=>["/Users/user/.fontist/fonts/RobotoMono-VariableFont_wght.ttf"]}}}
184
+ ```
185
+
186
+ #### Support of YAML format
187
+
188
+ Both commands support a YAML file as an input with a `from_file` method. For
189
+ example, if there is a `manifest.yml` file containing:
190
+
191
+ ```yaml
192
+ Segoe UI:
193
+ - Regular
194
+ - Bold
195
+ Roboto Mono:
196
+ - Regular
197
+ ```
198
+
199
+ Then the following calls would return font names and paths, as from the
200
+ `from_hash` method (see [Locations](#locations) and [Install](#install)).
201
+
202
+ ```ruby
203
+ Fontist::Manifest::Locations.from_file("manifest.yml")
204
+ Fontist::Manifest::Install.from_file("manifest.yml", confirmation: "yes")
180
205
  ```
181
206
 
182
207
  ### CLI
@@ -191,7 +216,8 @@ All searches are case-insensitive for ease of use.
191
216
 
192
217
  The `install` command is similar to the `Font.install` call. It first checks
193
218
  whether this font is already installed, and if not, then installs the font and
194
- returns its paths. Font or formula could be specified as a name.
219
+ returns its paths. Only font name (not formula name, nor font filename) could
220
+ be used as a parameter.
195
221
 
196
222
  ```
197
223
  $ fontist install "segoe ui"
@@ -223,7 +249,7 @@ Prints installed font paths grouped by formula and font.
223
249
 
224
250
  ```
225
251
  $ fontist status "segoe ui"
226
- Fontist::Formulas::SegoeUIFont
252
+ segoe_ui
227
253
  Segoe UI
228
254
  Regular (/Users/user/.fontist/fonts/SEGOEUI.TTF)
229
255
  Bold (/Users/user/.fontist/fonts/SEGOEUIB.TTF)
@@ -237,7 +263,7 @@ Lists installation status of fonts supported by Fontist.
237
263
 
238
264
  ```
239
265
  $ fontist list "segoe ui"
240
- Fontist::Formulas::SegoeUIFont
266
+ segoe_ui
241
267
  Segoe UI
242
268
  Regular (installed)
243
269
  Bold (installed)
@@ -247,7 +273,7 @@ Fontist::Formulas::SegoeUIFont
247
273
 
248
274
  ```
249
275
  $ fontist list "roboto mono"
250
- Fontist::Formulas::RobotoMonoFont
276
+ google/roboto_mono
251
277
  Roboto Mono
252
278
  Regular (uninstalled)
253
279
  Italic (uninstalled)
@@ -274,11 +300,17 @@ $ fontist manifest-locations manifest.yml
274
300
  ---
275
301
  Segoe UI:
276
302
  Regular:
277
- - "/Users/user/.fontist/fonts/SEGOEUI.TTF"
303
+ full_name: Segoe UI
304
+ paths:
305
+ - "/Users/user/.fontist/fonts/SEGOEUI.TTF"
278
306
  Bold:
279
- - "/Users/user/.fontist/fonts/SEGOEUIB.TTF"
307
+ full_name: Segoe UI Bold
308
+ paths:
309
+ - "/Users/user/.fontist/fonts/SEGOEUIB.TTF"
280
310
  Roboto Mono:
281
- Regular: []
311
+ Regular:
312
+ full_name:
313
+ paths: []
282
314
  ```
283
315
 
284
316
  Since Segoe UI is installed, but Roboto Mono is not.
@@ -292,12 +324,18 @@ $ fontist manifest-install --confirm-license manifest.yml
292
324
  ---
293
325
  Segoe UI:
294
326
  Regular:
295
- - "/Users/user/.fontist/fonts/SEGOEUI.TTF"
327
+ full_name: Segoe UI
328
+ paths:
329
+ - "/Users/user/.fontist/fonts/SEGOEUI.TTF"
296
330
  Bold:
297
- - "/Users/user/.fontist/fonts/SEGOEUIB.TTF"
331
+ full_name: Segoe UI Bold
332
+ paths:
333
+ - "/Users/user/.fontist/fonts/SEGOEUIB.TTF"
298
334
  Roboto Mono:
299
335
  Regular:
300
- - "/Users/user/.fontist/fonts/RobotoMono-VariableFont_wght.ttf"
336
+ full_name: Roboto Mono Regular
337
+ paths:
338
+ - "/Users/user/.fontist/fonts/RobotoMono-VariableFont_wght.ttf"
301
339
  ```
302
340
 
303
341
  #### Help
@@ -308,6 +346,15 @@ List of all commands could be seen by:
308
346
  fontist help
309
347
  ```
310
348
 
349
+ ### Configuration
350
+
351
+ By default Fontist uses the `~/.fontist` directory to store fonts and its
352
+ files. It could be changed with the `FONTIST_PATH` environment variable.
353
+
354
+ ```sh
355
+ FONTIST_PATH=~/.fontist_new fontist update
356
+ ```
357
+
311
358
  ## Development
312
359
 
313
360
  We are following Sandi Metz's Rules for this gem, you can read the
@@ -348,8 +395,22 @@ archive:
348
395
  ```sh
349
396
  fontist create-formula https://www.latofonts.com/download/lato2ofl-zip/
350
397
  cp lato.yml ~/.fontist/formulas/Formulas/
398
+ ```
399
+
400
+ A formula index should be rebuild, when a new formula is generated or an
401
+ existing one changed:
402
+
403
+ ```sh
404
+ fontist rebuild-index
405
+ ```
406
+
407
+ Then, both the formula and the updated index should be commited and pushed to
408
+ the formula repository:
409
+
410
+ ```sh
351
411
  cd ~/.fontist/formulas
352
412
  git add Formulas/lato.yml
413
+ git add index.yml
353
414
  git commit -m "Add Lato formula"
354
415
  ```
355
416
 
@@ -373,6 +434,36 @@ git commit -m "Google Fonts update"
373
434
  git push
374
435
  ```
375
436
 
437
+ ### Import of SIL fonts
438
+
439
+ Fontist contains formulas of [SIL fonts](https://software.sil.org/fonts/). They
440
+ can be updated with:
441
+
442
+ ```sh
443
+ fontist import-sil
444
+ cd ~/.fontist/formulas
445
+ git add Formulas/sil
446
+ git add index.yml
447
+ git commit -m "SIL fonts update"
448
+ git push
449
+ ```
450
+
451
+ ### Releasing
452
+
453
+ Releasing is done automatically with GitHub Action. Just bump and tag with `gem-release`.
454
+
455
+ For a patch release (0.0.x) use:
456
+
457
+ ```sh
458
+ gem bump --version patch --tag --push
459
+ ```
460
+
461
+ For a minor release (0.x.0) use:
462
+
463
+ ```sh
464
+ gem bump --version minor --tag --push
465
+ ```
466
+
376
467
  ## Contributing
377
468
 
378
469
  First, thank you for contributing! We love pull requests from everyone. By
File without changes
@@ -21,9 +21,9 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.require_paths = ["lib"]
23
23
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
24
- f.match(%r{^(test|spec|features)/})
24
+ f.match(%r{^(bin|test|spec|features)/})
25
25
  end
26
- spec.bindir = "bin"
26
+ spec.bindir = "exe"
27
27
  spec.executables = ["fontist"]
28
28
  spec.test_files = `git ls-files -- {spec}/*`.split("\n")
29
29
 
@@ -39,6 +39,8 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency "extract_ttc", "~> 0.1"
40
40
  spec.add_development_dependency "pry"
41
41
  spec.add_development_dependency "bundler", "~> 2.0"
42
+ spec.add_development_dependency "gem-release"
43
+ spec.add_development_dependency "nokogiri", "~> 1.0"
42
44
  spec.add_development_dependency "rake", "~> 12.3.3"
43
45
  spec.add_development_dependency "rspec", "~> 3.0"
44
46
  spec.add_development_dependency "rubocop", "0.75.0"
@@ -8,12 +8,11 @@ require "fontist/errors"
8
8
  require "fontist/version"
9
9
 
10
10
  require "fontist/font"
11
- require "fontist/registry"
12
- require "fontist/formulas"
13
11
  require "fontist/formula"
14
12
  require "fontist/system_font"
15
13
  require "fontist/fontist_font"
16
14
  require "fontist/manifest"
15
+ require "fontist/helpers"
17
16
 
18
17
  module Fontist
19
18
  def self.ui
@@ -29,7 +28,7 @@ module Fontist
29
28
  end
30
29
 
31
30
  def self.fontist_path
32
- Pathname.new(Dir.home).join(".fontist")
31
+ Pathname.new(ENV["FONTIST_PATH"] || File.join(Dir.home, ".fontist"))
33
32
  end
34
33
 
35
34
  def self.fonts_path
@@ -59,4 +58,8 @@ module Fontist
59
58
  def self.system_index_path
60
59
  Fontist.fontist_path.join("system_index.yml")
61
60
  end
61
+
62
+ def self.formula_index_path
63
+ Fontist.formulas_repo_path.join("index.yml")
64
+ end
62
65
  end
@@ -3,13 +3,30 @@ require "thor"
3
3
  module Fontist
4
4
  class CLI < Thor
5
5
  STATUS_SUCCESS = 0
6
- STATUS_ERROR = 1
6
+ STATUS_UNKNOWN_ERROR = 1
7
+ STATUS_NON_SUPPORTED_FONT_ERROR = 2
8
+ STATUS_MISSING_FONT_ERROR = 3
9
+ STATUS_LICENSING_ERROR = 4
10
+ STATUS_MANIFEST_COULD_NOT_BE_FOUND_ERROR = 5
11
+ STATUS_MANIFEST_COULD_NOT_BE_READ_ERROR = 6
12
+ STATUS_FONT_INDEX_CORRUPTED = 7
13
+
14
+ ERROR_TO_STATUS = {
15
+ Fontist::Errors::UnsupportedFontError => [STATUS_NON_SUPPORTED_FONT_ERROR],
16
+ Fontist::Errors::MissingFontError => [STATUS_MISSING_FONT_ERROR],
17
+ Fontist::Errors::LicensingError => [STATUS_LICENSING_ERROR],
18
+ Fontist::Errors::ManifestCouldNotBeFoundError => [STATUS_MANIFEST_COULD_NOT_BE_FOUND_ERROR,
19
+ "Manifest could not be found."],
20
+ Fontist::Errors::ManifestCouldNotBeReadError => [STATUS_MANIFEST_COULD_NOT_BE_READ_ERROR,
21
+ "Manifest could not be read."],
22
+ Fontist::Errors::FontIndexCorrupted => [STATUS_FONT_INDEX_CORRUPTED],
23
+ }.freeze
7
24
 
8
25
  def self.exit_on_failure?
9
26
  false
10
27
  end
11
28
 
12
- desc "install FONT", "Install font by font or formula"
29
+ desc "install FONT", "Install font"
13
30
  option :force, type: :boolean, aliases: :f,
14
31
  desc: "Install even if it's already installed in system"
15
32
  option :confirm_license, type: :boolean, desc: "Confirm license agreement"
@@ -19,9 +36,9 @@ module Fontist
19
36
  force: options[:force],
20
37
  confirmation: options[:confirm_license] ? "yes" : "no"
21
38
  )
22
- STATUS_SUCCESS
23
- rescue Fontist::Errors::NonSupportedFontError
24
- could_not_find_font(font)
39
+ success
40
+ rescue Fontist::Errors::GeneralError => e
41
+ handle_error(e)
25
42
  end
26
43
 
27
44
  desc "uninstall/remove FONT", "Uninstall font by font or formula"
@@ -29,26 +46,21 @@ module Fontist
29
46
  fonts_paths = Fontist::Font.uninstall(font)
30
47
  Fontist.ui.success("These fonts are removed:")
31
48
  Fontist.ui.success(fonts_paths.join("\n"))
32
- STATUS_SUCCESS
33
- rescue Fontist::Errors::MissingFontError => e
34
- Fontist.ui.error(e.message)
35
- STATUS_ERROR
36
- rescue Fontist::Errors::NonSupportedFontError
37
- could_not_find_font(font)
49
+ success
50
+ rescue Fontist::Errors::GeneralError => e
51
+ handle_error(e)
38
52
  end
39
53
  map remove: :uninstall
40
54
 
41
55
  desc "status [FONT]", "Show status of FONT or all fonts in fontist"
42
56
  def status(font = nil)
43
57
  formulas = Fontist::Font.status(font)
44
- return error("No font is installed.") if formulas.empty?
58
+ return error("No font is installed.", STATUS_MISSING_FONT_ERROR) if formulas.empty?
45
59
 
46
60
  print_formulas(formulas)
47
61
  success
48
- rescue Fontist::Errors::MissingFontError => e
49
- error(e.message)
50
- rescue Fontist::Errors::NonSupportedFontError
51
- could_not_find_font(font)
62
+ rescue Fontist::Errors::GeneralError => e
63
+ handle_error(e)
52
64
  end
53
65
 
54
66
  desc "list [FONT]", "List installation status of FONT or fonts in fontist"
@@ -56,75 +68,87 @@ module Fontist
56
68
  formulas = Fontist::Font.list(font)
57
69
  print_list(formulas)
58
70
  success
59
- rescue Fontist::Errors::NonSupportedFontError
60
- could_not_find_font(font)
71
+ rescue Fontist::Errors::GeneralError => e
72
+ handle_error(e)
61
73
  end
62
74
 
63
75
  desc "update", "Update formulas"
64
76
  def update
65
- Formulas.fetch_formulas
77
+ Formula.update_formulas_repo
66
78
  Fontist.ui.say("Formulas have been successfully updated")
67
- STATUS_SUCCESS
79
+ success
68
80
  end
69
81
 
70
82
  desc "manifest-locations MANIFEST",
71
83
  "Get locations of fonts from MANIFEST (yaml)"
72
84
  def manifest_locations(manifest)
73
- paths = Fontist::Manifest::Locations.call(manifest)
85
+ paths = Fontist::Manifest::Locations.from_file(manifest)
74
86
  print_yaml(paths)
75
87
  success
76
- rescue Fontist::Errors::ManifestCouldNotBeFoundError
77
- error("Manifest could not be found.")
78
- rescue Fontist::Errors::ManifestCouldNotBeReadError
79
- error("Manifest could not be read.")
88
+ rescue Fontist::Errors::GeneralError => e
89
+ handle_error(e)
80
90
  end
81
91
 
82
92
  desc "manifest-install MANIFEST", "Install fonts from MANIFEST (yaml)"
83
93
  option :confirm_license, type: :boolean, desc: "Confirm license agreement"
84
94
  def manifest_install(manifest)
85
- paths = Fontist::Manifest::Install.call(
95
+ paths = Fontist::Manifest::Install.from_file(
86
96
  manifest,
87
97
  confirmation: options[:confirm_license] ? "yes" : "no"
88
98
  )
89
99
 
90
100
  print_yaml(paths)
91
101
  success
92
- rescue Fontist::Errors::ManifestCouldNotBeFoundError
93
- error("Manifest could not be found.")
94
- rescue Fontist::Errors::ManifestCouldNotBeReadError
95
- error("Manifest could not be read.")
102
+ rescue Fontist::Errors::GeneralError => e
103
+ handle_error(e)
96
104
  end
97
105
 
98
106
  desc "create-formula URL", "Create a new formula with fonts from URL"
99
107
  option :name, desc: "Example: Times New Roman"
100
108
  option :mirror, repeatable: true
101
109
  option :subarchive, desc: "Subarchive to choose when there are several ones"
102
- option :subdir, desc: "Subdirectory to take fonts from"
110
+ option :subdir, desc: "Subdirectory to take fonts from, starting with the " \
111
+ "root dir, e.g.: stixfonts-2.10/fonts/static_otf. May include `fnmatch` patterns."
103
112
  def create_formula(url)
104
113
  require "fontist/import/create_formula"
105
114
  name = Fontist::Import::CreateFormula.new(url, options).call
106
115
  Fontist.ui.say("#{name} formula has been successfully created")
116
+ success
117
+ end
118
+
119
+ desc "rebuild-index", "Rebuild formula index (used by formulas maintainers)"
120
+ long_desc <<-LONGDESC
121
+ This index is pre-built and served with formulas, so there is no need
122
+ update it unless something changes in the formulas repo.
123
+ LONGDESC
124
+ def rebuild_index
125
+ Fontist::Index.rebuild
126
+ Fontist.ui.say("Formula index has been rebuilt.")
107
127
  STATUS_SUCCESS
108
128
  end
109
129
 
130
+ desc "import-sil", "Import formulas from SIL"
131
+ def import_sil
132
+ require "fontist/import/sil_import"
133
+ Fontist::Import::SilImport.new.call
134
+ end
135
+
110
136
  private
111
137
 
112
138
  def success
113
139
  STATUS_SUCCESS
114
140
  end
115
141
 
116
- def could_not_find_font(font)
117
- error("Font '#{font}' not found locally nor available in the Fontist " \
118
- "formula repository.\n" \
119
- "Perhaps it is available at the latest Fontist formula " \
120
- "repository.\n" \
121
- "You can update the formula repository using the command " \
122
- "`fontist update` and try again.")
142
+ def handle_error(exception)
143
+ status, message = ERROR_TO_STATUS[exception.class]
144
+ raise exception unless status
145
+
146
+ error(message || exception.message, status)
123
147
  end
124
148
 
125
- def error(message)
149
+ def error(message, status)
126
150
  Fontist.ui.error(message)
127
- STATUS_ERROR
151
+ status
128
152
  end
129
153
 
130
154
  def print_yaml(object)
@@ -133,7 +157,7 @@ module Fontist
133
157
 
134
158
  def print_formulas(formulas)
135
159
  formulas.each do |formula, fonts|
136
- Fontist.ui.success(formula.installer)
160
+ Fontist.ui.success(formula.key)
137
161
 
138
162
  fonts.each do |font, styles|
139
163
  Fontist.ui.success(" #{font.name}")
@@ -148,7 +172,7 @@ module Fontist
148
172
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
149
173
  def print_list(formulas)
150
174
  formulas.each do |formula, fonts|
151
- Fontist.ui.say(formula.installer)
175
+ Fontist.ui.say(formula.key)
152
176
 
153
177
  fonts.each do |font, styles|
154
178
  Fontist.ui.say(" #{font.name}")