fontist 1.21.4 → 2.0.1
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.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +4 -0
- data/Gemfile +11 -0
- data/README.adoc +6 -6
- data/docs/guide/api-ruby.md +8 -9
- data/fontist.gemspec +14 -24
- data/formula_filename_index.yml +6210 -0
- data/formula_index.yml +2568 -0
- data/lib/fontist/cli.rb +14 -14
- data/lib/fontist/config.rb +75 -14
- data/lib/fontist/errors.rb +2 -0
- data/lib/fontist/extract.rb +25 -0
- data/lib/fontist/font.rb +6 -8
- data/lib/fontist/font_collection.rb +16 -0
- data/lib/fontist/font_installer.rb +4 -4
- data/lib/fontist/font_model.rb +15 -0
- data/lib/fontist/font_path.rb +1 -1
- data/lib/fontist/font_style.rb +37 -0
- data/lib/fontist/formula.rb +169 -112
- data/lib/fontist/import/formula_serializer.rb +4 -4
- data/lib/fontist/import/google_import.rb +1 -1
- data/lib/fontist/index.rb +47 -8
- data/lib/fontist/indexes/default_family_font_index.rb +28 -9
- data/lib/fontist/indexes/filename_index.rb +45 -8
- data/lib/fontist/indexes/font_index.rb +3 -3
- data/lib/fontist/indexes/formula_key_to_path.rb +35 -0
- data/lib/fontist/indexes/index_mixin.rb +109 -0
- data/lib/fontist/indexes/preferred_family_font_index.rb +28 -9
- data/lib/fontist/manifest.rb +144 -2
- data/lib/fontist/manifest_request.rb +64 -0
- data/lib/fontist/manifest_response.rb +66 -0
- data/lib/fontist/repo.rb +1 -1
- data/lib/fontist/system_font.rb +7 -25
- data/lib/fontist/system_index.rb +137 -126
- data/lib/fontist/utils/cache.rb +54 -4
- data/lib/fontist/version.rb +1 -1
- data/lib/fontist.rb +33 -13
- metadata +16 -136
- data/lib/fontist/indexes/base_index.rb +0 -92
- data/lib/fontist/indexes/index_formula.rb +0 -36
- data/lib/fontist/manifest/install.rb +0 -35
- data/lib/fontist/manifest/locations.rb +0 -84
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fontist
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 2.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ribose Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2025-
|
|
11
|
+
date: 2025-11-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: down
|
|
@@ -205,145 +205,19 @@ dependencies:
|
|
|
205
205
|
- !ruby/object:Gem::Version
|
|
206
206
|
version: '1.7'
|
|
207
207
|
- !ruby/object:Gem::Dependency
|
|
208
|
-
name:
|
|
208
|
+
name: lutaml-model
|
|
209
209
|
requirement: !ruby/object:Gem::Requirement
|
|
210
210
|
requirements:
|
|
211
211
|
- - "~>"
|
|
212
212
|
- !ruby/object:Gem::Version
|
|
213
|
-
version: '0.
|
|
214
|
-
type: :
|
|
215
|
-
prerelease: false
|
|
216
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
217
|
-
requirements:
|
|
218
|
-
- - "~>"
|
|
219
|
-
- !ruby/object:Gem::Version
|
|
220
|
-
version: '0.14'
|
|
221
|
-
- !ruby/object:Gem::Dependency
|
|
222
|
-
name: bundler
|
|
223
|
-
requirement: !ruby/object:Gem::Requirement
|
|
224
|
-
requirements:
|
|
225
|
-
- - "~>"
|
|
226
|
-
- !ruby/object:Gem::Version
|
|
227
|
-
version: '2.3'
|
|
228
|
-
type: :development
|
|
229
|
-
prerelease: false
|
|
230
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
231
|
-
requirements:
|
|
232
|
-
- - "~>"
|
|
233
|
-
- !ruby/object:Gem::Version
|
|
234
|
-
version: '2.3'
|
|
235
|
-
- !ruby/object:Gem::Dependency
|
|
236
|
-
name: rake
|
|
237
|
-
requirement: !ruby/object:Gem::Requirement
|
|
238
|
-
requirements:
|
|
239
|
-
- - "~>"
|
|
240
|
-
- !ruby/object:Gem::Version
|
|
241
|
-
version: '13'
|
|
242
|
-
type: :development
|
|
243
|
-
prerelease: false
|
|
244
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
245
|
-
requirements:
|
|
246
|
-
- - "~>"
|
|
247
|
-
- !ruby/object:Gem::Version
|
|
248
|
-
version: '13'
|
|
249
|
-
- !ruby/object:Gem::Dependency
|
|
250
|
-
name: rspec
|
|
251
|
-
requirement: !ruby/object:Gem::Requirement
|
|
252
|
-
requirements:
|
|
253
|
-
- - "~>"
|
|
254
|
-
- !ruby/object:Gem::Version
|
|
255
|
-
version: '3.0'
|
|
256
|
-
type: :development
|
|
257
|
-
prerelease: false
|
|
258
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
259
|
-
requirements:
|
|
260
|
-
- - "~>"
|
|
261
|
-
- !ruby/object:Gem::Version
|
|
262
|
-
version: '3.0'
|
|
263
|
-
- !ruby/object:Gem::Dependency
|
|
264
|
-
name: rspec-benchmark
|
|
265
|
-
requirement: !ruby/object:Gem::Requirement
|
|
266
|
-
requirements:
|
|
267
|
-
- - "~>"
|
|
268
|
-
- !ruby/object:Gem::Version
|
|
269
|
-
version: '0.6'
|
|
270
|
-
type: :development
|
|
271
|
-
prerelease: false
|
|
272
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
273
|
-
requirements:
|
|
274
|
-
- - "~>"
|
|
275
|
-
- !ruby/object:Gem::Version
|
|
276
|
-
version: '0.6'
|
|
277
|
-
- !ruby/object:Gem::Dependency
|
|
278
|
-
name: rubocop
|
|
279
|
-
requirement: !ruby/object:Gem::Requirement
|
|
280
|
-
requirements:
|
|
281
|
-
- - "~>"
|
|
282
|
-
- !ruby/object:Gem::Version
|
|
283
|
-
version: 1.22.1
|
|
284
|
-
type: :development
|
|
285
|
-
prerelease: false
|
|
286
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
287
|
-
requirements:
|
|
288
|
-
- - "~>"
|
|
289
|
-
- !ruby/object:Gem::Version
|
|
290
|
-
version: 1.22.1
|
|
291
|
-
- !ruby/object:Gem::Dependency
|
|
292
|
-
name: rubocop-rails
|
|
293
|
-
requirement: !ruby/object:Gem::Requirement
|
|
294
|
-
requirements:
|
|
295
|
-
- - "~>"
|
|
296
|
-
- !ruby/object:Gem::Version
|
|
297
|
-
version: '2.9'
|
|
298
|
-
type: :development
|
|
299
|
-
prerelease: false
|
|
300
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
301
|
-
requirements:
|
|
302
|
-
- - "~>"
|
|
303
|
-
- !ruby/object:Gem::Version
|
|
304
|
-
version: '2.9'
|
|
305
|
-
- !ruby/object:Gem::Dependency
|
|
306
|
-
name: rubocop-performance
|
|
307
|
-
requirement: !ruby/object:Gem::Requirement
|
|
308
|
-
requirements:
|
|
309
|
-
- - "~>"
|
|
310
|
-
- !ruby/object:Gem::Version
|
|
311
|
-
version: '1.10'
|
|
312
|
-
type: :development
|
|
213
|
+
version: '0.7'
|
|
214
|
+
type: :runtime
|
|
313
215
|
prerelease: false
|
|
314
216
|
version_requirements: !ruby/object:Gem::Requirement
|
|
315
217
|
requirements:
|
|
316
218
|
- - "~>"
|
|
317
219
|
- !ruby/object:Gem::Version
|
|
318
|
-
version: '
|
|
319
|
-
- !ruby/object:Gem::Dependency
|
|
320
|
-
name: vcr
|
|
321
|
-
requirement: !ruby/object:Gem::Requirement
|
|
322
|
-
requirements:
|
|
323
|
-
- - ">="
|
|
324
|
-
- !ruby/object:Gem::Version
|
|
325
|
-
version: '0'
|
|
326
|
-
type: :development
|
|
327
|
-
prerelease: false
|
|
328
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
329
|
-
requirements:
|
|
330
|
-
- - ">="
|
|
331
|
-
- !ruby/object:Gem::Version
|
|
332
|
-
version: '0'
|
|
333
|
-
- !ruby/object:Gem::Dependency
|
|
334
|
-
name: webmock
|
|
335
|
-
requirement: !ruby/object:Gem::Requirement
|
|
336
|
-
requirements:
|
|
337
|
-
- - ">="
|
|
338
|
-
- !ruby/object:Gem::Version
|
|
339
|
-
version: '0'
|
|
340
|
-
type: :development
|
|
341
|
-
prerelease: false
|
|
342
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
343
|
-
requirements:
|
|
344
|
-
- - ">="
|
|
345
|
-
- !ruby/object:Gem::Version
|
|
346
|
-
version: '0'
|
|
220
|
+
version: '0.7'
|
|
347
221
|
description: Install openly-licensed fonts on Windows, Linux and Mac!
|
|
348
222
|
email:
|
|
349
223
|
- open.source@ribose.com
|
|
@@ -382,6 +256,8 @@ files:
|
|
|
382
256
|
- docs/reference/index.md
|
|
383
257
|
- exe/fontist
|
|
384
258
|
- fontist.gemspec
|
|
259
|
+
- formula_filename_index.yml
|
|
260
|
+
- formula_index.yml
|
|
385
261
|
- lib/fontist.rb
|
|
386
262
|
- lib/fontist/cache_cli.rb
|
|
387
263
|
- lib/fontist/cli.rb
|
|
@@ -392,10 +268,14 @@ files:
|
|
|
392
268
|
- lib/fontist/config_cli.rb
|
|
393
269
|
- lib/fontist/errors.rb
|
|
394
270
|
- lib/fontist/exclude.yml
|
|
271
|
+
- lib/fontist/extract.rb
|
|
395
272
|
- lib/fontist/font.rb
|
|
273
|
+
- lib/fontist/font_collection.rb
|
|
396
274
|
- lib/fontist/font_file.rb
|
|
397
275
|
- lib/fontist/font_installer.rb
|
|
276
|
+
- lib/fontist/font_model.rb
|
|
398
277
|
- lib/fontist/font_path.rb
|
|
278
|
+
- lib/fontist/font_style.rb
|
|
399
279
|
- lib/fontist/fontconfig.rb
|
|
400
280
|
- lib/fontist/fontconfig_cli.rb
|
|
401
281
|
- lib/fontist/formula.rb
|
|
@@ -431,15 +311,15 @@ files:
|
|
|
431
311
|
- lib/fontist/import/text_helper.rb
|
|
432
312
|
- lib/fontist/import_cli.rb
|
|
433
313
|
- lib/fontist/index.rb
|
|
434
|
-
- lib/fontist/indexes/base_index.rb
|
|
435
314
|
- lib/fontist/indexes/default_family_font_index.rb
|
|
436
315
|
- lib/fontist/indexes/filename_index.rb
|
|
437
316
|
- lib/fontist/indexes/font_index.rb
|
|
438
|
-
- lib/fontist/indexes/
|
|
317
|
+
- lib/fontist/indexes/formula_key_to_path.rb
|
|
318
|
+
- lib/fontist/indexes/index_mixin.rb
|
|
439
319
|
- lib/fontist/indexes/preferred_family_font_index.rb
|
|
440
320
|
- lib/fontist/manifest.rb
|
|
441
|
-
- lib/fontist/
|
|
442
|
-
- lib/fontist/
|
|
321
|
+
- lib/fontist/manifest_request.rb
|
|
322
|
+
- lib/fontist/manifest_response.rb
|
|
443
323
|
- lib/fontist/repo.rb
|
|
444
324
|
- lib/fontist/repo_cli.rb
|
|
445
325
|
- lib/fontist/resources/archive_resource.rb
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
require_relative "index_formula"
|
|
2
|
-
|
|
3
|
-
module Fontist
|
|
4
|
-
module Indexes
|
|
5
|
-
class BaseIndex
|
|
6
|
-
def self.from_yaml
|
|
7
|
-
@from_yaml ||= begin
|
|
8
|
-
unless Dir.exist?(Fontist.formulas_repo_path)
|
|
9
|
-
raise Errors::MainRepoNotFoundError.new(
|
|
10
|
-
"Please fetch formulas with `fontist update`.",
|
|
11
|
-
)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
rebuild unless File.exist?(path)
|
|
15
|
-
|
|
16
|
-
data = YAML.load_file(path)
|
|
17
|
-
new(data)
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def self.path
|
|
22
|
-
raise NotImplementedError, "Please define path of an index"
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def self.reset_cache
|
|
26
|
-
@from_yaml = nil
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def self.rebuild
|
|
30
|
-
index = new
|
|
31
|
-
index.build
|
|
32
|
-
index.to_yaml
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def initialize(data = {})
|
|
36
|
-
@index = {}
|
|
37
|
-
|
|
38
|
-
data.each_pair do |key, paths|
|
|
39
|
-
paths.each do |path|
|
|
40
|
-
add_index_formula(key, IndexFormula.new(path))
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def build
|
|
46
|
-
Formula.all.each do |formula|
|
|
47
|
-
add_formula(formula)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def add_formula(_formula)
|
|
52
|
-
raise NotImplementedError, "Please define how to add formula to an index, use #add_index_formula"
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def add_index_formula(key_raw, index_formula)
|
|
56
|
-
key = normalize_key(key_raw)
|
|
57
|
-
@index[key] ||= []
|
|
58
|
-
@index[key] << index_formula unless @index[key].include?(index_formula)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def load_formulas(key)
|
|
62
|
-
index_formulas(key).map(&:to_full)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def load_index_formulas(key)
|
|
66
|
-
index_formulas(key)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def to_yaml
|
|
70
|
-
dir = File.dirname(self.class.path)
|
|
71
|
-
FileUtils.mkdir_p(dir) unless File.exist?(dir)
|
|
72
|
-
File.write(self.class.path, YAML.dump(to_h))
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def to_h
|
|
76
|
-
@index.map do |key, index_formulas|
|
|
77
|
-
[key, index_formulas.map(&:to_s)]
|
|
78
|
-
end.to_h
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
private
|
|
82
|
-
|
|
83
|
-
def index_formulas(key)
|
|
84
|
-
@index[normalize_key(key)] || []
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def normalize_key(key)
|
|
88
|
-
key
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
module Fontist
|
|
2
|
-
module Indexes
|
|
3
|
-
class IndexFormula
|
|
4
|
-
def initialize(path)
|
|
5
|
-
@path = path
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def name
|
|
9
|
-
normalized.sub(/\.yml$/, "")
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def to_s
|
|
13
|
-
normalized
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def to_full
|
|
17
|
-
Formula.new_from_file(full_path)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def ==(other)
|
|
21
|
-
to_s == other.to_s
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
def normalized
|
|
27
|
-
escaped = Regexp.escape(Fontist.formulas_path.to_s + "/")
|
|
28
|
-
@path.sub(Regexp.new("^" + escaped), "")
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def full_path
|
|
32
|
-
Fontist.formulas_path.join(normalized).to_s
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
require_relative "locations"
|
|
2
|
-
|
|
3
|
-
module Fontist
|
|
4
|
-
module Manifest
|
|
5
|
-
class Install < Locations
|
|
6
|
-
def initialize(manifest, confirmation: "no", hide_licenses: false, no_progress: false)
|
|
7
|
-
super(manifest)
|
|
8
|
-
@confirmation = confirmation
|
|
9
|
-
@hide_licenses = hide_licenses
|
|
10
|
-
@no_progress = no_progress
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
private
|
|
14
|
-
|
|
15
|
-
def file_paths(font, style)
|
|
16
|
-
paths = find_font_with_name(font, style)
|
|
17
|
-
return paths unless paths.nil?
|
|
18
|
-
|
|
19
|
-
install_font(font)
|
|
20
|
-
|
|
21
|
-
find_font_with_name(font, style)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def install_font(font)
|
|
25
|
-
Fontist::Font.install(
|
|
26
|
-
font,
|
|
27
|
-
force: true,
|
|
28
|
-
confirmation: @confirmation,
|
|
29
|
-
hide_licenses: @hide_licenses,
|
|
30
|
-
no_progress: @no_progress
|
|
31
|
-
)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
module Fontist
|
|
2
|
-
module Manifest
|
|
3
|
-
class Locations
|
|
4
|
-
def initialize(manifest)
|
|
5
|
-
Fontist.ui.debug("Manifest: #{manifest}")
|
|
6
|
-
|
|
7
|
-
@manifest = manifest
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def self.from_file(file, **keywords)
|
|
11
|
-
raise Fontist::Errors::ManifestCouldNotBeFoundError unless File.exist?(file)
|
|
12
|
-
|
|
13
|
-
manifest = YAML.load_file(file)
|
|
14
|
-
raise Fontist::Errors::ManifestCouldNotBeReadError unless manifest.is_a?(Hash)
|
|
15
|
-
|
|
16
|
-
from_hash(manifest, **keywords)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def self.from_hash(manifest, **keywords)
|
|
20
|
-
if keywords.empty?
|
|
21
|
-
new(manifest).call
|
|
22
|
-
else
|
|
23
|
-
new(manifest, **keywords).call
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def call
|
|
28
|
-
font_names.zip(font_paths).to_h
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
|
|
33
|
-
attr_reader :manifest
|
|
34
|
-
|
|
35
|
-
def font_names
|
|
36
|
-
manifest.keys
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def font_paths
|
|
40
|
-
manifest.map do |font, styles|
|
|
41
|
-
styles_to_ary = [styles].flatten
|
|
42
|
-
style_paths_map(font, styles_to_ary)
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def style_paths_map(font, names)
|
|
47
|
-
styles = style_paths(font, names)
|
|
48
|
-
group_paths(styles)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def style_paths(font, names)
|
|
52
|
-
names.flat_map do |style|
|
|
53
|
-
file_paths(font, style) || empty_paths(style)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def group_paths(styles)
|
|
58
|
-
styles.group_by { |s| s[:type] }
|
|
59
|
-
.transform_values { |group| style(group) }
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def style(styles)
|
|
63
|
-
{ "full_name" => styles.first[:full_name],
|
|
64
|
-
"paths" => styles.map { |x| x[:path] } }.compact
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def file_paths(font, style)
|
|
68
|
-
find_font_with_name(font, style).tap do |x|
|
|
69
|
-
if x.nil?
|
|
70
|
-
raise Errors::MissingFontError.new(font, style)
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def find_font_with_name(font, style)
|
|
76
|
-
Fontist::SystemFont.find_styles(font, style)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def empty_paths(style)
|
|
80
|
-
[{ "full_name" => nil, "type" => style, "path" => nil }]
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|