fontist 1.7.2 → 1.8.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) 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 +77 -14
  5. data/{bin → exe}/fontist +0 -0
  6. data/fontist.gemspec +10 -7
  7. data/lib/fontist.rb +5 -2
  8. data/lib/fontist/cli.rb +65 -41
  9. data/lib/fontist/errors.rb +63 -12
  10. data/lib/fontist/font.rb +23 -37
  11. data/lib/fontist/font_installer.rb +118 -0
  12. data/lib/fontist/fontist_font.rb +3 -49
  13. data/lib/fontist/formula.rb +101 -35
  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/extractors.rb +4 -0
  18. data/lib/fontist/import/extractors/cpio_extractor.rb +39 -0
  19. data/lib/fontist/import/extractors/gzip_extractor.rb +27 -0
  20. data/lib/fontist/import/extractors/rpm_extractor.rb +45 -0
  21. data/lib/fontist/import/extractors/tar_extractor.rb +47 -0
  22. data/lib/fontist/import/google/skiplist.yml +3 -0
  23. data/lib/fontist/import/google_check.rb +1 -1
  24. data/lib/fontist/import/google_import.rb +3 -4
  25. data/lib/fontist/import/otfinfo_generate.rb +1 -1
  26. data/lib/fontist/import/recursive_extraction.rb +26 -8
  27. data/lib/fontist/import/sil_import.rb +99 -0
  28. data/lib/fontist/index.rb +72 -0
  29. data/lib/fontist/index_formula.rb +30 -0
  30. data/lib/fontist/manifest/install.rb +4 -9
  31. data/lib/fontist/manifest/locations.rb +28 -20
  32. data/lib/fontist/system_font.rb +32 -62
  33. data/lib/fontist/system_index.rb +47 -5
  34. data/lib/fontist/utils.rb +5 -0
  35. data/lib/fontist/utils/cache.rb +12 -4
  36. data/lib/fontist/utils/cpio/cpio.rb +199 -0
  37. data/lib/fontist/utils/cpio_extractor.rb +47 -0
  38. data/lib/fontist/utils/exe_extractor.rb +1 -1
  39. data/lib/fontist/utils/gzip_extractor.rb +24 -0
  40. data/lib/fontist/utils/locking.rb +17 -0
  41. data/lib/fontist/utils/rpm_extractor.rb +37 -0
  42. data/lib/fontist/utils/tar_extractor.rb +61 -0
  43. data/lib/fontist/utils/zip_extractor.rb +1 -1
  44. data/lib/fontist/version.rb +1 -1
  45. metadata +68 -24
  46. data/.github/workflows/macosx.yml +0 -33
  47. data/.github/workflows/ubuntu.yml +0 -30
  48. data/.github/workflows/windows.yml +0 -32
  49. data/bin/check_google +0 -8
  50. data/bin/console +0 -11
  51. data/bin/convert_formulas +0 -8
  52. data/bin/generate_otfinfo +0 -8
  53. data/bin/import_google +0 -8
  54. data/bin/rspec +0 -29
  55. data/bin/setup +0 -7
  56. data/lib/fontist/font_formula.rb +0 -169
  57. data/lib/fontist/formula_template.rb +0 -122
  58. data/lib/fontist/formulas.rb +0 -56
  59. data/lib/fontist/registry.rb +0 -43
@@ -0,0 +1,199 @@
1
+ # code is obtained from https://github.com/jordansissel/ruby-arr-pm/blob/8071591173ebb90dea27d5acfdde69a37dcb2744/cpio.rb
2
+ # rubocop:disable all
3
+ class BoundedIO
4
+ attr_reader :length
5
+ attr_reader :remaining
6
+
7
+ def initialize(io, length, &eof_callback)
8
+ @io = io
9
+ @length = length
10
+ @remaining = length
11
+
12
+ @eof_callback = eof_callback
13
+ @eof = false
14
+ end
15
+
16
+ def read(size=nil)
17
+ return nil if eof?
18
+ size = @remaining if size.nil?
19
+ data = @io.read(size)
20
+ @remaining -= data.bytesize
21
+ eof?
22
+ data
23
+ end
24
+
25
+ def sysread(size)
26
+ raise EOFError, "end of file reached" if eof?
27
+ read(size)
28
+ end
29
+
30
+ def eof?
31
+ return false if @remaining > 0
32
+ return @eof if @eof
33
+
34
+ @eof_callback.call
35
+ @eof = true
36
+ end
37
+ end
38
+
39
+ module CPIO
40
+ FIELDS = [
41
+ :magic, :ino, :mode, :uid, :gid, :nlink, :mtime, :filesize, :devmajor,
42
+ :devminor, :rdevmajor, :rdevminor, :namesize, :check
43
+ ]
44
+ end
45
+
46
+ class CPIO::ASCIIReader
47
+ FIELD_SIZES = {
48
+ :magic => 6,
49
+ :ino => 8,
50
+ :mode => 8,
51
+ :uid => 8,
52
+ :gid => 8,
53
+ :nlink => 8,
54
+ :mtime => 8,
55
+ :filesize => 8,
56
+ :devmajor => 8,
57
+ :devminor => 8,
58
+ :rdevmajor => 8,
59
+ :rdevminor => 8,
60
+ :namesize => 8,
61
+ :check => 8
62
+ }
63
+ HEADER_LENGTH = FIELD_SIZES.reduce(0) { |m, (_, v)| m + v }
64
+ HEADER_PACK = FIELD_SIZES.collect { |_, v| "A#{v}" }.join
65
+
66
+ FIELD_ORDER = [
67
+ :magic, :ino, :mode, :uid, :gid, :nlink, :mtime, :filesize, :devmajor,
68
+ :devminor, :rdevmajor, :rdevminor, :namesize, :check
69
+ ]
70
+
71
+ def initialize(io)
72
+ @io = io
73
+ end
74
+
75
+ private
76
+
77
+ def io
78
+ @io
79
+ end
80
+
81
+ def each(&block)
82
+ while true
83
+ entry = read
84
+ break if entry.nil?
85
+ # The CPIO format has the end-of-stream marker as a file called "TRAILER!!!"
86
+ break if entry.name == "TRAILER!!!"
87
+ block.call(entry, entry.file)
88
+ verify_correct_read(entry) unless entry.directory?
89
+ end
90
+ end
91
+
92
+ def verify_correct_read(entry)
93
+ # Read and throw away the whole file if not read at all.
94
+ entry.file.tap do |file|
95
+ if file.nil? || file.remaining == 0
96
+ # All OK! :)
97
+ elsif file.remaining == file.length
98
+ file.read(16384) while !file.eof?
99
+ else
100
+ # The file was only partially read? This should be an error by the
101
+ # user.
102
+ consumed = file.length - file.remaining
103
+ raise BadState, "Only #{consumed} bytes were read of the #{file.length} byte file: #{entry.name}"
104
+ end
105
+ end
106
+ end
107
+
108
+ def read
109
+ entry = CPIOEntry.new
110
+ header = io.read(HEADER_LENGTH)
111
+ return nil if header.nil?
112
+ FIELD_ORDER.zip(header.unpack(HEADER_PACK)).each do |field, value|
113
+ entry.send("#{field}=", value.to_i(16))
114
+ end
115
+
116
+ entry.validate
117
+ entry.mtime = Time.at(entry.mtime)
118
+ read_name(entry, @io)
119
+ read_file(entry, @io)
120
+ entry
121
+ end
122
+
123
+ def read_name(entry, io)
124
+ entry.name = io.read(entry.namesize - 1) # - 1 for null terminator
125
+ nul = io.read(1)
126
+ raise ArgumentError, "Corrupt CPIO or bug? Name null terminator was not null: #{nul.inspect}" if nul != "\0"
127
+ padding_data = io.read(padding_name(entry))
128
+ # Padding should be all null bytes
129
+ if padding_data != ("\0" * padding_data.bytesize)
130
+ raise ArgumentError, "Corrupt CPIO or bug? Name null padding was #{padding_name(entry)} bytes: #{padding_data.inspect}"
131
+ end
132
+ end
133
+
134
+ def read_file(entry, io)
135
+ if entry.directory?
136
+ entry.file = nil
137
+ #read_file_padding(entry, io)
138
+ nil
139
+ else
140
+ entry.file = BoundedIO.new(io, entry.filesize) do
141
+ read_file_padding(entry, io)
142
+ end
143
+ end
144
+ end
145
+
146
+ def read_file_padding(entry, io)
147
+ padding_data = io.read(padding_file(entry))
148
+ if padding_data != ("\0" * padding_data.bytesize)
149
+ raise ArgumentError, "Corrupt CPIO or bug? File null padding was #{padding_file(entry)} bytes: #{padding_data.inspect}"
150
+ end
151
+ end
152
+
153
+ def padding_name(entry)
154
+ # name padding is padding up to a multiple of 4 after header+namesize
155
+ -(HEADER_LENGTH + entry.namesize) % 4
156
+ end
157
+
158
+ def padding_file(entry)
159
+ (-(HEADER_LENGTH + entry.filesize + 2) % 4)
160
+ end
161
+ public(:each)
162
+ end
163
+
164
+ class CPIOEntry
165
+ CPIO::FIELDS.each do |field|
166
+ attr_accessor field
167
+ end
168
+
169
+ attr_accessor :name
170
+ attr_accessor :file
171
+
172
+ DIRECTORY_FLAG = 0040000
173
+
174
+ def validate
175
+ raise "Invalid magic #{magic.inspect}" if magic != 0x070701
176
+ raise "Invalid ino #{ino.inspect}" if ino < 0
177
+ raise "Invalid mode #{mode.inspect}" if mode < 0
178
+ raise "Invalid uid #{uid.inspect}" if uid < 0
179
+ raise "Invalid gid #{gid.inspect}" if gid < 0
180
+ raise "Invalid nlink #{nlink.inspect}" if nlink < 0
181
+ raise "Invalid mtime #{mtime.inspect}" if mtime < 0
182
+ raise "Invalid filesize #{filesize.inspect}" if filesize < 0
183
+ raise "Invalid devmajor #{devmajor.inspect}" if devmajor < 0
184
+ raise "Invalid devminor #{devminor.inspect}" if devminor < 0
185
+ raise "Invalid rdevmajor #{rdevmajor.inspect}" if rdevmajor < 0
186
+ raise "Invalid rdevminor #{rdevminor.inspect}" if rdevminor < 0
187
+ raise "Invalid namesize #{namesize.inspect}" if namesize < 0
188
+ raise "Invalid check #{check.inspect}" if check < 0
189
+ end # def validate
190
+
191
+ def read(*args)
192
+ return nil if directory?
193
+ file.read(*args)
194
+ end
195
+
196
+ def directory?
197
+ mode & DIRECTORY_FLAG > 0
198
+ end
199
+ end
@@ -0,0 +1,47 @@
1
+ module Fontist
2
+ module Utils
3
+ module CpioExtractor
4
+ def cpio_extract(resource)
5
+ file = @downloaded ? resource : download_file(resource)
6
+
7
+ dir = extract_cpio_file(file)
8
+
9
+ largest_file_in_dir(dir)
10
+ end
11
+
12
+ private
13
+
14
+ def extract_cpio_file(archive_path)
15
+ archive_file = File.open(archive_path, "rb")
16
+ dir = Dir.mktmpdir
17
+ extract_cpio_file_to_dir(archive_file, dir)
18
+
19
+ dir
20
+ end
21
+
22
+ def extract_cpio_file_to_dir(archive_file, dir)
23
+ cpio_reader_class.new(archive_file).each do |entry, file|
24
+ path = File.join(dir, entry.name)
25
+ if entry.directory?
26
+ FileUtils.mkdir_p(path)
27
+ else
28
+ File.write(path, file.read, mode: "wb")
29
+ end
30
+ end
31
+ end
32
+
33
+ def cpio_reader_class
34
+ @cpio_reader_class ||= begin
35
+ require "fontist/utils/cpio/cpio"
36
+ CPIO::ASCIIReader
37
+ end
38
+ end
39
+
40
+ def largest_file_in_dir(dir)
41
+ Dir.glob(File.join(dir, "**/*")).max_by do |path|
42
+ File.size(path)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -6,7 +6,7 @@ module Fontist
6
6
 
7
7
  exe_file = download_file(exe_file).path if download
8
8
 
9
- Fontist.ui.say(%(Installing font "#{key}".))
9
+ Fontist.ui.say(%(Installing font "#{formula.key}".))
10
10
  cab_file = decompressor.search(exe_file)
11
11
  cabbed_fonts = grep_fonts(cab_file.files) || []
12
12
  fonts_paths = extract_cabbed_fonts_to_assets(cabbed_fonts)
@@ -0,0 +1,24 @@
1
+ module Fontist
2
+ module Utils
3
+ module GzipExtractor
4
+ def gzip_extract(resource)
5
+ file = @downloaded ? resource : download_file(resource)
6
+
7
+ extract_gzip_file(file)
8
+ end
9
+
10
+ private
11
+
12
+ def extract_gzip_file(file)
13
+ Zlib::GzipReader.open(file) do |gz|
14
+ basename = File.basename(file, ".*")
15
+ dir = Dir.mktmpdir
16
+ path = File.join(dir, basename)
17
+ File.write(path, gz.read, mode: "wb")
18
+
19
+ path
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ module Fontist
2
+ module Utils
3
+ module Locking
4
+ def lock(lock_path)
5
+ File.dirname(lock_path).tap do |dir|
6
+ FileUtils.mkdir_p(dir) unless File.exist?(dir)
7
+ end
8
+
9
+ f = File.open(lock_path, File::CREAT)
10
+ f.flock(File::LOCK_EX)
11
+ yield
12
+ ensure
13
+ f.flock(File::LOCK_UN)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ module Fontist
2
+ module Utils
3
+ module RpmExtractor
4
+ def rpm_extract(resource)
5
+ file = download_file(resource)
6
+
7
+ extract_rpm_file(file)
8
+ end
9
+
10
+ private
11
+
12
+ def extract_rpm_file(file)
13
+ rpm = rpm_class.new(file)
14
+ content = rpm.payload.read
15
+ path = rpm_target_path(file.path, rpm.tags)
16
+ File.write(path, content, mode: "wb")
17
+
18
+ path
19
+ end
20
+
21
+ def rpm_class
22
+ @rpm_class ||= begin
23
+ require "arr-pm"
24
+ RPM::File
25
+ end
26
+ end
27
+
28
+ def rpm_target_path(archive, tags)
29
+ basename = File.basename(archive, ".*")
30
+ archive_format = tags[:payloadformat]
31
+ compression_format = tags[:payloadcompressor] == "gzip" ? "gz" : tags[:payloadcompressor]
32
+ filename = basename + "." + archive_format + "." + compression_format
33
+ File.join(Dir.mktmpdir, filename)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,61 @@
1
+ module Fontist
2
+ module Utils
3
+ module TarExtractor
4
+ def tar_extract(resource)
5
+ file = @downloaded ? resource : download_file(resource)
6
+
7
+ dir = extract_tar_file(file)
8
+
9
+ save_fonts(dir)
10
+ end
11
+
12
+ private
13
+
14
+ def extract_tar_file(file)
15
+ archive_file = File.open(file, "rb")
16
+ dir = Dir.mktmpdir
17
+ tar_reader_class.new(archive_file) do |tar|
18
+ tar.each do |tarfile|
19
+ save_tar_file(tarfile, dir)
20
+ end
21
+ end
22
+
23
+ dir
24
+ end
25
+
26
+ def tar_reader_class
27
+ @tar_reader_class ||= begin
28
+ require "rubygems/package"
29
+ Gem::Package::TarReader
30
+ end
31
+ end
32
+
33
+ def save_tar_file(file, dir)
34
+ path = File.join(dir, file.full_name)
35
+
36
+ if file.directory?
37
+ FileUtils.mkdir_p(path)
38
+ else
39
+ File.open(path, "wb") do |f|
40
+ f.print(file.read)
41
+ end
42
+ end
43
+ end
44
+
45
+ def save_fonts(dir)
46
+ Array.new.tap do |fonts_paths|
47
+ Dir.glob(File.join(dir, "**/*")).each do |path|
48
+ filename = File.basename(path)
49
+ next unless font_file?(filename)
50
+
51
+ target_filename = target_filename(filename)
52
+ font_path = fonts_path.join(target_filename).to_s
53
+ FileUtils.mv(path, font_path)
54
+
55
+ fonts_paths << font_path
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -8,7 +8,7 @@ module Fontist
8
8
  zip_file = download_file(resource) if download
9
9
  zip_file ||= resource.urls.first
10
10
 
11
- Fontist.ui.say(%(Installing font "#{key}".))
11
+ Fontist.ui.say(%(Installing font "#{formula.key}".))
12
12
  fonts_paths = unzip_fonts(zip_file, fonts_sub_dir)
13
13
  block_given? ? yield(fonts_paths) : fonts_paths
14
14
  end
@@ -1,3 +1,3 @@
1
1
  module Fontist
2
- VERSION = "1.7.2".freeze
2
+ VERSION = "1.8.4".freeze
3
3
  end
metadata CHANGED
@@ -1,16 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fontist
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.2
4
+ version: 1.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
- - Abu Nashir
9
8
  autorequire:
10
- bindir: bin
9
+ bindir: exe
11
10
  cert_chain: []
12
- date: 2020-12-09 00:00:00.000000000 Z
11
+ date: 2021-01-10 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: arr-pm
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.1
14
27
  - !ruby/object:Gem::Dependency
15
28
  name: down
16
29
  requirement: !ruby/object:Gem::Requirement
@@ -165,6 +178,34 @@ dependencies:
165
178
  - - "~>"
166
179
  - !ruby/object:Gem::Version
167
180
  version: '2.0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: gem-release
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: nokogiri
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '1.0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '1.0'
168
209
  - !ruby/object:Gem::Dependency
169
210
  name: rake
170
211
  requirement: !ruby/object:Gem::Requirement
@@ -249,19 +290,17 @@ dependencies:
249
290
  - - "~>"
250
291
  - !ruby/object:Gem::Version
251
292
  version: '1.0'
252
- description: A libarary find or download fonts
293
+ description: Install openly-licensed fonts on Windows, Linux and Mac!
253
294
  email:
254
- - operations@ribose.com
255
- - abunashir@gmail.com
295
+ - open.source@ribose.com
256
296
  executables:
257
297
  - fontist
258
298
  extensions: []
259
299
  extra_rdoc_files: []
260
300
  files:
261
301
  - ".github/workflows/check_google.yml"
262
- - ".github/workflows/macosx.yml"
263
- - ".github/workflows/ubuntu.yml"
264
- - ".github/workflows/windows.yml"
302
+ - ".github/workflows/release.yml"
303
+ - ".github/workflows/rspec.yml"
265
304
  - ".gitignore"
266
305
  - ".hound.yml"
267
306
  - ".rspec"
@@ -270,32 +309,29 @@ files:
270
309
  - LICENSE.txt
271
310
  - README.md
272
311
  - Rakefile
273
- - bin/check_google
274
- - bin/console
275
- - bin/convert_formulas
276
- - bin/fontist
277
- - bin/generate_otfinfo
278
- - bin/import_google
279
- - bin/rspec
280
- - bin/setup
312
+ - exe/fontist
281
313
  - fontist.gemspec
282
314
  - lib/fontist.rb
283
315
  - lib/fontist/cli.rb
284
316
  - lib/fontist/errors.rb
285
317
  - lib/fontist/font.rb
286
- - lib/fontist/font_formula.rb
318
+ - lib/fontist/font_installer.rb
287
319
  - lib/fontist/fontist_font.rb
288
320
  - lib/fontist/formula.rb
289
- - lib/fontist/formula_template.rb
290
- - lib/fontist/formulas.rb
321
+ - lib/fontist/formula_paths.rb
322
+ - lib/fontist/helpers.rb
291
323
  - lib/fontist/import.rb
292
324
  - lib/fontist/import/convert_formulas.rb
293
325
  - lib/fontist/import/create_formula.rb
294
326
  - lib/fontist/import/extractors.rb
295
327
  - lib/fontist/import/extractors/cab_extractor.rb
328
+ - lib/fontist/import/extractors/cpio_extractor.rb
296
329
  - lib/fontist/import/extractors/extractor.rb
330
+ - lib/fontist/import/extractors/gzip_extractor.rb
297
331
  - lib/fontist/import/extractors/ole_extractor.rb
332
+ - lib/fontist/import/extractors/rpm_extractor.rb
298
333
  - lib/fontist/import/extractors/seven_zip_extractor.rb
334
+ - lib/fontist/import/extractors/tar_extractor.rb
299
335
  - lib/fontist/import/extractors/zip_extractor.rb
300
336
  - lib/fontist/import/files/collection_file.rb
301
337
  - lib/fontist/import/files/file_requirement.rb
@@ -319,25 +355,33 @@ files:
319
355
  - lib/fontist/import/otfinfo/template.erb
320
356
  - lib/fontist/import/otfinfo_generate.rb
321
357
  - lib/fontist/import/recursive_extraction.rb
358
+ - lib/fontist/import/sil_import.rb
322
359
  - lib/fontist/import/template_helper.rb
323
360
  - lib/fontist/import/text_helper.rb
361
+ - lib/fontist/index.rb
362
+ - lib/fontist/index_formula.rb
324
363
  - lib/fontist/manifest.rb
325
364
  - lib/fontist/manifest/install.rb
326
365
  - lib/fontist/manifest/locations.rb
327
- - lib/fontist/registry.rb
328
366
  - lib/fontist/system.yml
329
367
  - lib/fontist/system_font.rb
330
368
  - lib/fontist/system_index.rb
331
369
  - lib/fontist/utils.rb
332
370
  - lib/fontist/utils/cache.rb
371
+ - lib/fontist/utils/cpio/cpio.rb
372
+ - lib/fontist/utils/cpio_extractor.rb
333
373
  - lib/fontist/utils/downloader.rb
334
374
  - lib/fontist/utils/dsl.rb
335
375
  - lib/fontist/utils/dsl/collection_font.rb
336
376
  - lib/fontist/utils/dsl/font.rb
337
377
  - lib/fontist/utils/exe_extractor.rb
378
+ - lib/fontist/utils/gzip_extractor.rb
379
+ - lib/fontist/utils/locking.rb
338
380
  - lib/fontist/utils/msi_extractor.rb
381
+ - lib/fontist/utils/rpm_extractor.rb
339
382
  - lib/fontist/utils/seven_zip_extractor.rb
340
383
  - lib/fontist/utils/system.rb
384
+ - lib/fontist/utils/tar_extractor.rb
341
385
  - lib/fontist/utils/ui.rb
342
386
  - lib/fontist/utils/zip_extractor.rb
343
387
  - lib/fontist/version.rb
@@ -348,7 +392,7 @@ metadata:
348
392
  homepage_uri: https://github.com/fontist/fontist
349
393
  source_code_uri: https://github.com/fontist/fontist
350
394
  changelog_uri: https://github.com/fontist/fontist
351
- post_install_message: Please run `fontist update` to fetch formulas
395
+ post_install_message: Please run `fontist update` to fetch formulas.
352
396
  rdoc_options: []
353
397
  require_paths:
354
398
  - lib
@@ -366,5 +410,5 @@ requirements: []
366
410
  rubygems_version: 3.0.3
367
411
  signing_key:
368
412
  specification_version: 4
369
- summary: A libarary find or download fonts
413
+ summary: Install openly-licensed fonts on Windows, Linux and Mac!
370
414
  test_files: []