fontist 1.7.2 → 1.8.4

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 (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: []