fontist 1.7.0 → 1.8.2

Sign up to get free protection for your applications and to get access to all the features.
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}")