fontist 1.7.0 → 1.8.2

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 (46) 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 +5 -2
  7. data/lib/fontist.rb +10 -3
  8. data/lib/fontist/cli.rb +62 -41
  9. data/lib/fontist/errors.rb +14 -12
  10. data/lib/fontist/font.rb +29 -31
  11. data/lib/fontist/font_installer.rb +114 -0
  12. data/lib/fontist/fontist_font.rb +3 -49
  13. data/lib/fontist/formula.rb +88 -66
  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 +20 -60
  28. data/lib/fontist/system_index.rb +92 -0
  29. data/lib/fontist/utils/exe_extractor.rb +1 -1
  30. data/lib/fontist/utils/zip_extractor.rb +1 -1
  31. data/lib/fontist/version.rb +1 -1
  32. metadata +57 -20
  33. data/.github/workflows/macosx.yml +0 -33
  34. data/.github/workflows/ubuntu.yml +0 -30
  35. data/.github/workflows/windows.yml +0 -32
  36. data/bin/check_google +0 -8
  37. data/bin/console +0 -11
  38. data/bin/convert_formulas +0 -8
  39. data/bin/generate_otfinfo +0 -8
  40. data/bin/import_google +0 -8
  41. data/bin/rspec +0 -29
  42. data/bin/setup +0 -7
  43. data/lib/fontist/font_formula.rb +0 -158
  44. data/lib/fontist/formula_template.rb +0 -122
  45. data/lib/fontist/formulas.rb +0 -56
  46. data/lib/fontist/registry.rb +0 -43
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4832b87f5d5535536b6f2f2e2761bf8ff8dbd82770703f93e201e2c7e81f496d
4
- data.tar.gz: 32e720d4a33cb78a88bcdd8bf3b80bc24abec544d3dd755a459ae2a1a4a78d6b
3
+ metadata.gz: 1fea467133e3e6a8a287dd36a2a03790fb63859f983b0398f0f558de519a0a64
4
+ data.tar.gz: b8c717aef31834b5a9b3c3f903dacf0d267ddd85aa6f0a1eca34566a45b219bf
5
5
  SHA512:
6
- metadata.gz: 6567b976d958bc852244e5080753eb1fc2e44f8231fe08f3cded4076d510c553565160cf83c108e2e6c309cce042393acf7e19ab34e5a851f4c879a7f9c642ae
7
- data.tar.gz: 2bab58316fdc830954b93daa716deaac90912ee4906510fad27efba2c0323af8cdb9bade71d5a5f257461063576863b44e1bfc0b72f7cdde1839689acb497f95
6
+ metadata.gz: 20d44b20267db6f15f1b36be660f91690cef7c6f4b0653341231b3f18658ec0f88ea8225884b7b2ac1d06f3e8aa5be79aea600fed5be91513f43031a10b5de5b
7
+ data.tar.gz: 6138e6bed40c741f21c6d116f021aef9f6c7cca24506337fe681ba5e6c6e996c8e8e6a84e50103601231d6cab9f5cafc7b5527b418d65fbd6c1477c67ceda201
@@ -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
 
@@ -34,10 +34,13 @@ Gem::Specification.new do |spec|
34
34
  spec.add_runtime_dependency "ruby-ole", "~> 1.0"
35
35
  spec.add_runtime_dependency "thor", "~> 1.0.1"
36
36
  spec.add_runtime_dependency "git", "~> 1.0"
37
+ spec.add_runtime_dependency "ttfunk", "~> 1.0"
37
38
 
38
39
  spec.add_development_dependency "extract_ttc", "~> 0.1"
39
40
  spec.add_development_dependency "pry"
40
41
  spec.add_development_dependency "bundler", "~> 2.0"
42
+ spec.add_development_dependency "gem-release"
43
+ spec.add_development_dependency "nokogiri", "~> 1.0"
41
44
  spec.add_development_dependency "rake", "~> 12.3.3"
42
45
  spec.add_development_dependency "rspec", "~> 3.0"
43
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
@@ -55,4 +54,12 @@ module Fontist
55
54
  def self.system_file_path
56
55
  Fontist.lib_path.join("fontist", "system.yml")
57
56
  end
57
+
58
+ def self.system_index_path
59
+ Fontist.fontist_path.join("system_index.yml")
60
+ end
61
+
62
+ def self.formula_index_path
63
+ Fontist.formulas_repo_path.join("index.yml")
64
+ end
58
65
  end
@@ -3,13 +3,28 @@ 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
+
13
+ ERROR_TO_STATUS = {
14
+ Fontist::Errors::NonSupportedFontError => [STATUS_NON_SUPPORTED_FONT_ERROR],
15
+ Fontist::Errors::MissingFontError => [STATUS_MISSING_FONT_ERROR],
16
+ Fontist::Errors::LicensingError => [STATUS_LICENSING_ERROR],
17
+ Fontist::Errors::ManifestCouldNotBeFoundError => [STATUS_MANIFEST_COULD_NOT_BE_FOUND_ERROR,
18
+ "Manifest could not be found."],
19
+ Fontist::Errors::ManifestCouldNotBeReadError => [STATUS_MANIFEST_COULD_NOT_BE_READ_ERROR,
20
+ "Manifest could not be read."],
21
+ }.freeze
7
22
 
8
23
  def self.exit_on_failure?
9
24
  false
10
25
  end
11
26
 
12
- desc "install FONT", "Install font by font or formula"
27
+ desc "install FONT", "Install font"
13
28
  option :force, type: :boolean, aliases: :f,
14
29
  desc: "Install even if it's already installed in system"
15
30
  option :confirm_license, type: :boolean, desc: "Confirm license agreement"
@@ -19,9 +34,9 @@ module Fontist
19
34
  force: options[:force],
20
35
  confirmation: options[:confirm_license] ? "yes" : "no"
21
36
  )
22
- STATUS_SUCCESS
23
- rescue Fontist::Errors::NonSupportedFontError
24
- could_not_find_font(font)
37
+ success
38
+ rescue Fontist::Errors::GeneralError => e
39
+ handle_error(e)
25
40
  end
26
41
 
27
42
  desc "uninstall/remove FONT", "Uninstall font by font or formula"
@@ -29,26 +44,21 @@ module Fontist
29
44
  fonts_paths = Fontist::Font.uninstall(font)
30
45
  Fontist.ui.success("These fonts are removed:")
31
46
  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)
47
+ success
48
+ rescue Fontist::Errors::GeneralError => e
49
+ handle_error(e)
38
50
  end
39
51
  map remove: :uninstall
40
52
 
41
53
  desc "status [FONT]", "Show status of FONT or all fonts in fontist"
42
54
  def status(font = nil)
43
55
  formulas = Fontist::Font.status(font)
44
- return error("No font is installed.") if formulas.empty?
56
+ return error("No font is installed.", STATUS_MISSING_FONT_ERROR) if formulas.empty?
45
57
 
46
58
  print_formulas(formulas)
47
59
  success
48
- rescue Fontist::Errors::MissingFontError => e
49
- error(e.message)
50
- rescue Fontist::Errors::NonSupportedFontError
51
- could_not_find_font(font)
60
+ rescue Fontist::Errors::GeneralError => e
61
+ handle_error(e)
52
62
  end
53
63
 
54
64
  desc "list [FONT]", "List installation status of FONT or fonts in fontist"
@@ -56,43 +66,39 @@ module Fontist
56
66
  formulas = Fontist::Font.list(font)
57
67
  print_list(formulas)
58
68
  success
59
- rescue Fontist::Errors::NonSupportedFontError
60
- could_not_find_font(font)
69
+ rescue Fontist::Errors::GeneralError => e
70
+ handle_error(e)
61
71
  end
62
72
 
63
73
  desc "update", "Update formulas"
64
74
  def update
65
- Formulas.fetch_formulas
75
+ Formula.update_formulas_repo
66
76
  Fontist.ui.say("Formulas have been successfully updated")
67
- STATUS_SUCCESS
77
+ success
68
78
  end
69
79
 
70
80
  desc "manifest-locations MANIFEST",
71
81
  "Get locations of fonts from MANIFEST (yaml)"
72
82
  def manifest_locations(manifest)
73
- paths = Fontist::Manifest::Locations.call(manifest)
83
+ paths = Fontist::Manifest::Locations.from_file(manifest)
74
84
  print_yaml(paths)
75
85
  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.")
86
+ rescue Fontist::Errors::GeneralError => e
87
+ handle_error(e)
80
88
  end
81
89
 
82
90
  desc "manifest-install MANIFEST", "Install fonts from MANIFEST (yaml)"
83
91
  option :confirm_license, type: :boolean, desc: "Confirm license agreement"
84
92
  def manifest_install(manifest)
85
- paths = Fontist::Manifest::Install.call(
93
+ paths = Fontist::Manifest::Install.from_file(
86
94
  manifest,
87
95
  confirmation: options[:confirm_license] ? "yes" : "no"
88
96
  )
89
97
 
90
98
  print_yaml(paths)
91
99
  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.")
100
+ rescue Fontist::Errors::GeneralError => e
101
+ handle_error(e)
96
102
  end
97
103
 
98
104
  desc "create-formula URL", "Create a new formula with fonts from URL"
@@ -104,27 +110,42 @@ module Fontist
104
110
  require "fontist/import/create_formula"
105
111
  name = Fontist::Import::CreateFormula.new(url, options).call
106
112
  Fontist.ui.say("#{name} formula has been successfully created")
113
+ success
114
+ end
115
+
116
+ desc "rebuild-index", "Rebuild formula index (used by formulas maintainers)"
117
+ long_desc <<-LONGDESC
118
+ This index is pre-built and served with formulas, so there is no need
119
+ update it unless something changes in the formulas repo.
120
+ LONGDESC
121
+ def rebuild_index
122
+ Fontist::Index.rebuild
123
+ Fontist.ui.say("Formula index has been rebuilt.")
107
124
  STATUS_SUCCESS
108
125
  end
109
126
 
127
+ desc "import-sil", "Import formulas from SIL"
128
+ def import_sil
129
+ require "fontist/import/sil_import"
130
+ Fontist::Import::SilImport.new.call
131
+ end
132
+
110
133
  private
111
134
 
112
135
  def success
113
136
  STATUS_SUCCESS
114
137
  end
115
138
 
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.")
139
+ def handle_error(exception)
140
+ status, message = ERROR_TO_STATUS[exception.class]
141
+ raise exception unless status
142
+
143
+ error(message || exception.message, status)
123
144
  end
124
145
 
125
- def error(message)
146
+ def error(message, status)
126
147
  Fontist.ui.error(message)
127
- STATUS_ERROR
148
+ status
128
149
  end
129
150
 
130
151
  def print_yaml(object)
@@ -133,7 +154,7 @@ module Fontist
133
154
 
134
155
  def print_formulas(formulas)
135
156
  formulas.each do |formula, fonts|
136
- Fontist.ui.success(formula.installer)
157
+ Fontist.ui.success(formula.key)
137
158
 
138
159
  fonts.each do |font, styles|
139
160
  Fontist.ui.success(" #{font.name}")
@@ -148,7 +169,7 @@ module Fontist
148
169
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
149
170
  def print_list(formulas)
150
171
  formulas.each do |formula, fonts|
151
- Fontist.ui.say(formula.installer)
172
+ Fontist.ui.say(formula.key)
152
173
 
153
174
  fonts.each do |font, styles|
154
175
  Fontist.ui.say(" #{font.name}")