fontist 1.7.3 → 1.8.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) 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 +48 -4
  5. data/{bin → exe}/fontist +0 -0
  6. data/fontist.gemspec +10 -7
  7. data/lib/fontist.rb +9 -2
  8. data/lib/fontist/cli.rb +64 -55
  9. data/lib/fontist/errors.rb +63 -12
  10. data/lib/fontist/font.rb +33 -64
  11. data/lib/fontist/font_installer.rb +118 -0
  12. data/lib/fontist/font_path.rb +29 -0
  13. data/lib/fontist/fontist_font.rb +3 -49
  14. data/lib/fontist/formula.rb +101 -35
  15. data/lib/fontist/formula_paths.rb +43 -0
  16. data/lib/fontist/helpers.rb +7 -0
  17. data/lib/fontist/import/create_formula.rb +3 -2
  18. data/lib/fontist/import/extractors.rb +4 -0
  19. data/lib/fontist/import/extractors/cpio_extractor.rb +39 -0
  20. data/lib/fontist/import/extractors/gzip_extractor.rb +27 -0
  21. data/lib/fontist/import/extractors/rpm_extractor.rb +45 -0
  22. data/lib/fontist/import/extractors/tar_extractor.rb +47 -0
  23. data/lib/fontist/import/google/skiplist.yml +3 -0
  24. data/lib/fontist/import/google_check.rb +1 -1
  25. data/lib/fontist/import/google_import.rb +3 -4
  26. data/lib/fontist/import/otfinfo_generate.rb +1 -1
  27. data/lib/fontist/import/recursive_extraction.rb +26 -8
  28. data/lib/fontist/import/sil_import.rb +99 -0
  29. data/lib/fontist/index.rb +11 -0
  30. data/lib/fontist/indexes/base_index.rb +82 -0
  31. data/lib/fontist/indexes/filename_index.rb +19 -0
  32. data/lib/fontist/indexes/font_index.rb +21 -0
  33. data/lib/fontist/indexes/index_formula.rb +36 -0
  34. data/lib/fontist/manifest/install.rb +4 -5
  35. data/lib/fontist/manifest/locations.rb +9 -1
  36. data/lib/fontist/system_font.rb +32 -62
  37. data/lib/fontist/system_index.rb +47 -5
  38. data/lib/fontist/utils.rb +5 -0
  39. data/lib/fontist/utils/cache.rb +12 -4
  40. data/lib/fontist/utils/cpio/cpio.rb +199 -0
  41. data/lib/fontist/utils/cpio_extractor.rb +47 -0
  42. data/lib/fontist/utils/exe_extractor.rb +1 -1
  43. data/lib/fontist/utils/gzip_extractor.rb +24 -0
  44. data/lib/fontist/utils/locking.rb +17 -0
  45. data/lib/fontist/utils/rpm_extractor.rb +37 -0
  46. data/lib/fontist/utils/tar_extractor.rb +61 -0
  47. data/lib/fontist/utils/zip_extractor.rb +1 -1
  48. data/lib/fontist/version.rb +1 -1
  49. metadata +74 -26
  50. data/.github/workflows/macosx.yml +0 -33
  51. data/.github/workflows/ubuntu.yml +0 -30
  52. data/.github/workflows/windows.yml +0 -32
  53. data/bin/check_google +0 -8
  54. data/bin/console +0 -11
  55. data/bin/convert_formulas +0 -8
  56. data/bin/generate_otfinfo +0 -8
  57. data/bin/import_google +0 -8
  58. data/bin/rspec +0 -29
  59. data/bin/setup +0 -7
  60. data/lib/fontist/font_formula.rb +0 -169
  61. data/lib/fontist/formula_template.rb +0 -122
  62. data/lib/fontist/formulas.rb +0 -56
  63. data/lib/fontist/registry.rb +0 -43
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bfbc7b0d13e8084d44fe41d69ff1719a203a375cd75970cf8efa0abd2cd711af
4
- data.tar.gz: 1a259f0e45ea264ca55c1e112cb25bd672f41532ae82c58989cf368f058d2374
3
+ metadata.gz: 4b392969d430a5af69c38a73069d5a98cf90a6ef1c246f8cca215a7cd4c1202c
4
+ data.tar.gz: 97ca59729bf50acefa0bfe5ab23b82050eed8fd6ba4782a6d814a77e44939b4b
5
5
  SHA512:
6
- metadata.gz: 82a25bf83f43b02f1e8a77717d9d240ebd55910bc0c529ce0ff09d434cad829c862c8db9564597159a3214b6cffa9dce2ee8f64a6f841f5dc589e10571a94c44
7
- data.tar.gz: 91771cd423b516b6db27db7ef5e55cd24f01bea9fb368aa4331e0bc75a887e3df35d84a4fa08748e98bc41a16d8f80861cf584ff9cc6a61e938c3b7392ee94ee
6
+ metadata.gz: b5911d154187149d2d8ebc81e776b7c4b12e0a8eddf4f2540f3914b41fd29c582a29287b5ed1d3d7cccbe696aeb40908f5039bf350c281e315ac08fffe76e110
7
+ data.tar.gz: 49a7e53eff6d6b750248141a608cb3e92c03c19130f75f4ff8806c7e55ca0d478cec376ed9eaa273dedff3e05b31057892c0c47367a48f1a3eadd5599ecaf968
@@ -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
 
@@ -249,7 +249,7 @@ Prints installed font paths grouped by formula and font.
249
249
 
250
250
  ```
251
251
  $ fontist status "segoe ui"
252
- Fontist::Formulas::SegoeUIFont
252
+ segoe_ui
253
253
  Segoe UI
254
254
  Regular (/Users/user/.fontist/fonts/SEGOEUI.TTF)
255
255
  Bold (/Users/user/.fontist/fonts/SEGOEUIB.TTF)
@@ -263,7 +263,7 @@ Lists installation status of fonts supported by Fontist.
263
263
 
264
264
  ```
265
265
  $ fontist list "segoe ui"
266
- Fontist::Formulas::SegoeUIFont
266
+ segoe_ui
267
267
  Segoe UI
268
268
  Regular (installed)
269
269
  Bold (installed)
@@ -273,7 +273,7 @@ Fontist::Formulas::SegoeUIFont
273
273
 
274
274
  ```
275
275
  $ fontist list "roboto mono"
276
- Fontist::Formulas::RobotoMonoFont
276
+ google/roboto_mono
277
277
  Roboto Mono
278
278
  Regular (uninstalled)
279
279
  Italic (uninstalled)
@@ -395,8 +395,22 @@ archive:
395
395
  ```sh
396
396
  fontist create-formula https://www.latofonts.com/download/lato2ofl-zip/
397
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
398
411
  cd ~/.fontist/formulas
399
412
  git add Formulas/lato.yml
413
+ git add index.yml
400
414
  git commit -m "Add Lato formula"
401
415
  ```
402
416
 
@@ -420,6 +434,36 @@ git commit -m "Google Fonts update"
420
434
  git push
421
435
  ```
422
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
+
423
467
  ## Contributing
424
468
 
425
469
  First, thank you for contributing! We love pull requests from everyone. By
File without changes
data/fontist.gemspec CHANGED
@@ -5,15 +5,15 @@ require "fontist/version"
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fontist"
7
7
  spec.version = Fontist::VERSION
8
- spec.authors = ["Ribose Inc.", "Abu Nashir"]
9
- spec.email = ["operations@ribose.com", "abunashir@gmail.com"]
8
+ spec.authors = ["Ribose Inc."]
9
+ spec.email = ["open.source@ribose.com"]
10
10
 
11
- spec.summary = %q{A libarary find or download fonts}
12
- spec.description = %q{A libarary find or download fonts}
11
+ spec.summary = %q{Install openly-licensed fonts on Windows, Linux and Mac!}
12
+ spec.description = %q{Install openly-licensed fonts on Windows, Linux and Mac!}
13
13
  spec.homepage = "https://github.com/fontist/fontist"
14
14
  spec.license = "BSD-2-Clause"
15
15
 
16
- spec.post_install_message = "Please run `fontist update` to fetch formulas"
16
+ spec.post_install_message = "Please run `fontist update` to fetch formulas."
17
17
 
18
18
  spec.metadata["homepage_uri"] = spec.homepage
19
19
  spec.metadata["source_code_uri"] = "https://github.com/fontist/fontist"
@@ -21,12 +21,13 @@ 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
 
30
+ spec.add_runtime_dependency "arr-pm", "~> 0.0.1"
30
31
  spec.add_runtime_dependency "down", "~> 5.0"
31
32
  spec.add_runtime_dependency "libmspack", "~> 0.1.0"
32
33
  spec.add_runtime_dependency "rubyzip", "~> 2.3.0"
@@ -39,6 +40,8 @@ Gem::Specification.new do |spec|
39
40
  spec.add_development_dependency "extract_ttc", "~> 0.1"
40
41
  spec.add_development_dependency "pry"
41
42
  spec.add_development_dependency "bundler", "~> 2.0"
43
+ spec.add_development_dependency "gem-release"
44
+ spec.add_development_dependency "nokogiri", "~> 1.0"
42
45
  spec.add_development_dependency "rake", "~> 12.3.3"
43
46
  spec.add_development_dependency "rspec", "~> 3.0"
44
47
  spec.add_development_dependency "rubocop", "0.75.0"
data/lib/fontist.rb CHANGED
@@ -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
@@ -59,4 +58,12 @@ 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
65
+
66
+ def self.formula_filename_index_path
67
+ Fontist.formulas_repo_path.join("filename_index.yml")
68
+ end
62
69
  end
data/lib/fontist/cli.rb CHANGED
@@ -3,7 +3,24 @@ 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
@@ -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,20 @@ 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
- desc "status [FONT]", "Show status of FONT or all fonts in fontist"
55
+ desc "status [FONT]", "Show paths of FONT or all fonts"
42
56
  def status(font = nil)
43
- formulas = Fontist::Font.status(font)
44
- return error("No font is installed.") if formulas.empty?
57
+ paths = Fontist::Font.status(font)
58
+ return error("No font is installed.", STATUS_MISSING_FONT_ERROR) if paths.empty?
45
59
 
46
- print_formulas(formulas)
47
60
  success
48
- rescue Fontist::Errors::MissingFontError => e
49
- error(e.message)
50
- rescue Fontist::Errors::NonSupportedFontError
51
- could_not_find_font(font)
61
+ rescue Fontist::Errors::GeneralError => e
62
+ handle_error(e)
52
63
  end
53
64
 
54
65
  desc "list [FONT]", "List installation status of FONT or fonts in fontist"
@@ -56,15 +67,15 @@ module Fontist
56
67
  formulas = Fontist::Font.list(font)
57
68
  print_list(formulas)
58
69
  success
59
- rescue Fontist::Errors::NonSupportedFontError
60
- could_not_find_font(font)
70
+ rescue Fontist::Errors::GeneralError => e
71
+ handle_error(e)
61
72
  end
62
73
 
63
74
  desc "update", "Update formulas"
64
75
  def update
65
- Formulas.fetch_formulas
76
+ Formula.update_formulas_repo
66
77
  Fontist.ui.say("Formulas have been successfully updated")
67
- STATUS_SUCCESS
78
+ success
68
79
  end
69
80
 
70
81
  desc "manifest-locations MANIFEST",
@@ -73,10 +84,8 @@ module Fontist
73
84
  paths = Fontist::Manifest::Locations.from_file(manifest)
74
85
  print_yaml(paths)
75
86
  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.")
87
+ rescue Fontist::Errors::GeneralError => e
88
+ handle_error(e)
80
89
  end
81
90
 
82
91
  desc "manifest-install MANIFEST", "Install fonts from MANIFEST (yaml)"
@@ -89,66 +98,66 @@ module Fontist
89
98
 
90
99
  print_yaml(paths)
91
100
  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.")
101
+ rescue Fontist::Errors::GeneralError => e
102
+ handle_error(e)
96
103
  end
97
104
 
98
105
  desc "create-formula URL", "Create a new formula with fonts from URL"
99
106
  option :name, desc: "Example: Times New Roman"
100
107
  option :mirror, repeatable: true
101
108
  option :subarchive, desc: "Subarchive to choose when there are several ones"
102
- option :subdir, desc: "Subdirectory to take fonts from"
109
+ option :subdir, desc: "Subdirectory to take fonts from, starting with the " \
110
+ "root dir, e.g.: stixfonts-2.10/fonts/static_otf. May include `fnmatch` patterns."
103
111
  def create_formula(url)
104
112
  require "fontist/import/create_formula"
105
113
  name = Fontist::Import::CreateFormula.new(url, options).call
106
114
  Fontist.ui.say("#{name} formula has been successfully created")
115
+ success
116
+ end
117
+
118
+ desc "rebuild-index", "Rebuild formula index (used by formulas maintainers)"
119
+ long_desc <<-LONGDESC
120
+ This index is pre-built and served with formulas, so there is no need
121
+ update it unless something changes in the formulas repo.
122
+ LONGDESC
123
+ def rebuild_index
124
+ Fontist::Index.rebuild
125
+ Fontist.ui.say("Formula index has been rebuilt.")
107
126
  STATUS_SUCCESS
108
127
  end
109
128
 
129
+ desc "import-sil", "Import formulas from SIL"
130
+ def import_sil
131
+ require "fontist/import/sil_import"
132
+ Fontist::Import::SilImport.new.call
133
+ end
134
+
110
135
  private
111
136
 
112
137
  def success
113
138
  STATUS_SUCCESS
114
139
  end
115
140
 
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.")
141
+ def handle_error(exception)
142
+ status, message = ERROR_TO_STATUS[exception.class]
143
+ raise exception unless status
144
+
145
+ error(message || exception.message, status)
123
146
  end
124
147
 
125
- def error(message)
148
+ def error(message, status)
126
149
  Fontist.ui.error(message)
127
- STATUS_ERROR
150
+ status
128
151
  end
129
152
 
130
153
  def print_yaml(object)
131
154
  Fontist.ui.say(YAML.dump(object))
132
155
  end
133
156
 
134
- def print_formulas(formulas)
135
- formulas.each do |formula, fonts|
136
- Fontist.ui.success(formula.installer)
137
-
138
- fonts.each do |font, styles|
139
- Fontist.ui.success(" #{font.name}")
140
-
141
- styles.each do |style, path|
142
- Fontist.ui.success(" #{style.type} (#{path})")
143
- end
144
- end
145
- end
146
- end
147
-
148
157
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
149
158
  def print_list(formulas)
150
159
  formulas.each do |formula, fonts|
151
- Fontist.ui.say(formula.installer)
160
+ Fontist.ui.say(formula.key)
152
161
 
153
162
  fonts.each do |font, styles|
154
163
  Fontist.ui.say(" #{font.name}")