fontist 1.7.1 → 1.8.3

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.
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}")