fontist 1.11.1 → 1.11.2
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/metanorma.yml +2 -5
- data/README.adoc +54 -8
- data/fontist.gemspec +1 -2
- data/lib/fontist/cli.rb +5 -10
- data/lib/fontist/formula.rb +4 -0
- data/lib/fontist/google_cli.rb +29 -0
- data/lib/fontist/import/formula_builder.rb +17 -1
- data/lib/fontist/import/google/new_fonts_fetcher.rb +44 -33
- data/lib/fontist/import/google.rb +18 -0
- data/lib/fontist/import/google_check.rb +0 -7
- data/lib/fontist/import/google_import.rb +26 -142
- data/lib/fontist/import/helpers/system_helper.rb +1 -1
- data/lib/fontist/import/otf_parser.rb +2 -0
- data/lib/fontist/import/recursive_extraction.rb +2 -1
- data/lib/fontist/index.rb +0 -27
- data/lib/fontist/system_font.rb +1 -6
- data/lib/fontist/update.rb +2 -2
- data/lib/fontist/version.rb +1 -1
- data/lib/fontist.rb +21 -15
- metadata +17 -36
- data/.github/workflows/check_google.yml +0 -28
- data/README.md +0 -582
- data/lib/fontist/formula_paths.rb +0 -44
- data/lib/fontist/import/google/fonts_public.md +0 -10
- data/lib/fontist/import/google/fonts_public.pb.rb +0 -71
- data/lib/fontist/import/google/fonts_public.proto +0 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13b78039fab8bac4324cc22dc75a21beac4dd1303853ed782cabf1e89b78617c
|
4
|
+
data.tar.gz: d9ddc52af7fce3a9650b227170940c78e757266d27215add37cac136b8710548
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e88289ff2d6acac6c10599332227163d41ac6fcc7ea2f7acb6d2a4c5e62dec6ab814aecc2e807e08f5de4a3491abf69a88e9648d2ef8829dbd4885dfcd8954c
|
7
|
+
data.tar.gz: 2b67bf621a77b9d9882af25329930e3900c8e852077822dd2582ece1b6528e1fc63ec8c9f7404b89505b8a3d17377e841e476c264e2a7b837dbdab35dfe2c243
|
data/README.adoc
CHANGED
@@ -51,6 +51,34 @@ has the following requirements:
|
|
51
51
|
|
52
52
|
These dependencies are generally present on all systems.
|
53
53
|
|
54
|
+
=== Upgrading Fontist
|
55
|
+
|
56
|
+
==== To v1.10+
|
57
|
+
|
58
|
+
Fontist versions beyond v1.10 utilize a new formula format.
|
59
|
+
After the upgrade, please run `fontist update` to fetch the latest formulas.
|
60
|
+
|
61
|
+
Starting from v1.10, Fontist uses the "`default family`" instead of the "`preferred family`"
|
62
|
+
when grouping styles.
|
63
|
+
|
64
|
+
For example, a request for the "`Lato`" font prior to v1.10 will return all
|
65
|
+
styles: "`Black`", "`Black Italic`", "`Bold`", and 15 other styles.
|
66
|
+
|
67
|
+
From v1.10 onwards, Fontist will return _only_ the 4 default styles:
|
68
|
+
"`Regular`", "`Italic`", "`Bold`" and "`Bold Italic`".
|
69
|
+
|
70
|
+
In order to fetch other styles, you have to specify the exact font
|
71
|
+
"`subfamily`", such as "`Lato Black`", or "`Lato Heavy`", or use
|
72
|
+
the `--preferred-family` option with CLI and `Fontist.preferred_family = true`
|
73
|
+
with the Ruby library.
|
74
|
+
|
75
|
+
NOTE: Prior to v1.10 there was a bug with the "`Courier`" font formula, which
|
76
|
+
allowed the font to be installed when requesting the font name "`Courier`", but
|
77
|
+
its font location was only obtainable using the full "`Courier New`" font name.
|
78
|
+
From v1.10 onwards the behavior has been made consistent -- only the proper
|
79
|
+
"`Courier New`" name should be used.
|
80
|
+
|
81
|
+
|
54
82
|
== Usage of the `fontist` command
|
55
83
|
|
56
84
|
=== Fontist command-line interface
|
@@ -62,13 +90,18 @@ code higher or equal than 1.
|
|
62
90
|
|
63
91
|
All searches are case-insensitive for ease of use.
|
64
92
|
|
93
|
+
=== Global options
|
94
|
+
|
95
|
+
All commands support the following options:
|
96
|
+
|
97
|
+
* `--preferred-family` Use the preferred family names when searching for fonts. This format was used prior to v1.10.
|
98
|
+
|
65
99
|
=== Install fonts
|
66
100
|
|
67
101
|
Fontist checks whether this font is already installed, and if not, then installs
|
68
102
|
the font and returns its installed paths.
|
69
103
|
|
70
|
-
|
71
|
-
argument.
|
104
|
+
The font name is the only argument to be supplied (the font family name).
|
72
105
|
|
73
106
|
[source,sh]
|
74
107
|
----
|
@@ -80,6 +113,8 @@ These fonts are found or installed:
|
|
80
113
|
/Users/user/.fontist/fonts/SEGOEUIZ.TTF
|
81
114
|
----
|
82
115
|
|
116
|
+
NOTE: Specifying the formula's name or the font's filename is not supported.
|
117
|
+
|
83
118
|
NOTE: The `install` command is similar to the `Font.install` library call.
|
84
119
|
|
85
120
|
=== Uninstall fonts
|
@@ -350,6 +385,16 @@ operation you would do in any ruby object.
|
|
350
385
|
|
351
386
|
=== `Fontist::Manifest`
|
352
387
|
|
388
|
+
==== Global options
|
389
|
+
|
390
|
+
Fontist can be switched to use the preferred family names. This format was
|
391
|
+
used prior to v1.10.
|
392
|
+
|
393
|
+
[source,ruby]
|
394
|
+
----
|
395
|
+
Fontist.preferred_family = true
|
396
|
+
----
|
397
|
+
|
353
398
|
[[fontist-locations]]
|
354
399
|
==== `Fontist::Manifest::Locations`
|
355
400
|
|
@@ -565,7 +610,7 @@ In case an update is found, it could be fetched to the library by:
|
|
565
610
|
|
566
611
|
[source,sh]
|
567
612
|
----
|
568
|
-
bin/
|
613
|
+
bin/fontist google import
|
569
614
|
----
|
570
615
|
|
571
616
|
The script would update formulas which should be committed to a separate
|
@@ -573,8 +618,8 @@ repository https://github.com/fontist/formulas[formulas]:
|
|
573
618
|
|
574
619
|
[source,sh]
|
575
620
|
----
|
576
|
-
cd ~/.fontist/formulas
|
577
|
-
git add Formulas/google
|
621
|
+
cd ~/.fontist/versions/v2/formulas
|
622
|
+
git add Formulas/google
|
578
623
|
git commit -m "Google Fonts update"
|
579
624
|
git push
|
580
625
|
----
|
@@ -740,9 +785,10 @@ sub-licenses to third parties, under the copyright covering the contribution to
|
|
740
785
|
use the contribution by all means.
|
741
786
|
|
742
787
|
We are following Sandi Metz's Rules for this gem, you can read the
|
743
|
-
http://robots.thoughtbot.com/post/50655960596/sandi-metz-rules-for-developers[description of the rules here]
|
744
|
-
rules. If you make changes in a pre-existing
|
745
|
-
should fix the violations as part of your
|
788
|
+
http://robots.thoughtbot.com/post/50655960596/sandi-metz-rules-for-developers[description of the rules here].
|
789
|
+
All new code should follow these rules. If you make changes in a pre-existing
|
790
|
+
file that violates these rules you should fix the violations as part of your
|
791
|
+
contribution.
|
746
792
|
|
747
793
|
Here are a few technical guidelines to follow:
|
748
794
|
|
data/fontist.gemspec
CHANGED
@@ -28,12 +28,12 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
29
29
|
|
30
30
|
spec.add_runtime_dependency "down", "~> 5.0"
|
31
|
+
spec.add_runtime_dependency "extract_ttc", "~> 0.1"
|
31
32
|
spec.add_runtime_dependency "thor", "~> 1.0.1"
|
32
33
|
spec.add_runtime_dependency "git", "~> 1.0"
|
33
34
|
spec.add_runtime_dependency "ttfunk", "~> 1.6"
|
34
35
|
spec.add_runtime_dependency "excavate", "~> 0.1"
|
35
36
|
|
36
|
-
spec.add_development_dependency "extract_ttc", "~> 0.1"
|
37
37
|
spec.add_development_dependency "pry"
|
38
38
|
spec.add_development_dependency "bundler", "~> 2.0"
|
39
39
|
spec.add_development_dependency "gem-release"
|
@@ -43,7 +43,6 @@ Gem::Specification.new do |spec|
|
|
43
43
|
spec.add_development_dependency "rubocop", "1.5.2"
|
44
44
|
spec.add_development_dependency "rubocop-rails"
|
45
45
|
spec.add_development_dependency "rubocop-performance"
|
46
|
-
spec.add_development_dependency "ruby-protocol-buffers", "~> 1.0"
|
47
46
|
|
48
47
|
spec.add_runtime_dependency "socksify"
|
49
48
|
end
|
data/lib/fontist/cli.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "thor"
|
2
2
|
require "fontist/repo_cli"
|
3
|
+
require "fontist/google_cli"
|
3
4
|
|
4
5
|
module Fontist
|
5
6
|
class CLI < Thor
|
@@ -149,18 +150,9 @@ module Fontist
|
|
149
150
|
It is done automatically when formulas are updated, or private formulas
|
150
151
|
are set up.
|
151
152
|
LONGDESC
|
152
|
-
option :main_repo, type: :boolean,
|
153
|
-
desc: "Updates indexes in the main repo (for backward " \
|
154
|
-
"compatibility with versions prior to 1.9)"
|
155
153
|
def rebuild_index
|
156
154
|
handle_class_options(options)
|
157
|
-
|
158
|
-
if options[:main_repo]
|
159
|
-
Fontist::Index.rebuild_for_main_repo
|
160
|
-
else
|
161
|
-
Fontist::Index.rebuild
|
162
|
-
end
|
163
|
-
|
155
|
+
Fontist::Index.rebuild
|
164
156
|
Fontist.ui.say("Formula index has been rebuilt.")
|
165
157
|
STATUS_SUCCESS
|
166
158
|
end
|
@@ -175,6 +167,9 @@ module Fontist
|
|
175
167
|
desc "repo SUBCOMMAND ...ARGS", "Manage custom repositories"
|
176
168
|
subcommand "repo", Fontist::RepoCLI
|
177
169
|
|
170
|
+
desc "google SUBCOMMAND ...ARGS", "Manage Google formulas"
|
171
|
+
subcommand "google", Fontist::GoogleCLI
|
172
|
+
|
178
173
|
private
|
179
174
|
|
180
175
|
def handle_class_options(options)
|
data/lib/fontist/formula.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
module Fontist
|
2
|
+
class GoogleCLI < Thor
|
3
|
+
class_option :formulas_path, type: :string, desc: "Path to formulas"
|
4
|
+
|
5
|
+
desc "check", "Check Google fonts for updates"
|
6
|
+
def check
|
7
|
+
handle_class_options(options)
|
8
|
+
require "fontist/import/google_check"
|
9
|
+
Fontist::Import::GoogleCheck.new.call
|
10
|
+
CLI::STATUS_SUCCESS
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "import", "Import Google fonts"
|
14
|
+
def import
|
15
|
+
handle_class_options(options)
|
16
|
+
require "fontist/import/google_import"
|
17
|
+
Fontist::Import::GoogleImport.new.call
|
18
|
+
CLI::STATUS_SUCCESS
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def handle_class_options(options)
|
24
|
+
if options[:formulas_path]
|
25
|
+
Fontist.formulas_path = Pathname.new(options[:formulas_path])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -6,7 +6,7 @@ module Fontist
|
|
6
6
|
class FormulaBuilder
|
7
7
|
FORMULA_ATTRIBUTES = %i[name description homepage resources
|
8
8
|
font_collections fonts extract copyright
|
9
|
-
license_url open_license command].freeze
|
9
|
+
license_url open_license digest command].freeze
|
10
10
|
|
11
11
|
attr_accessor :archive,
|
12
12
|
:url,
|
@@ -60,6 +60,18 @@ module Fontist
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def resource_options
|
63
|
+
if @options[:skip_sha]
|
64
|
+
resource_options_without_sha
|
65
|
+
else
|
66
|
+
resource_options_with_sha
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def resource_options_without_sha
|
71
|
+
{ urls: [@url] + mirrors }
|
72
|
+
end
|
73
|
+
|
74
|
+
def resource_options_with_sha
|
63
75
|
urls = []
|
64
76
|
sha = []
|
65
77
|
downloads do |url, path|
|
@@ -167,6 +179,10 @@ module Fontist
|
|
167
179
|
TextHelper.cleanup(@license_text)
|
168
180
|
end
|
169
181
|
|
182
|
+
def digest
|
183
|
+
@options[:digest]
|
184
|
+
end
|
185
|
+
|
170
186
|
def command
|
171
187
|
Shellwords.shelljoin(ARGV)
|
172
188
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require_relative "fonts_public.pb"
|
2
1
|
require_relative "../google"
|
3
2
|
require_relative "../otf_parser"
|
4
3
|
|
@@ -6,7 +5,7 @@ module Fontist
|
|
6
5
|
module Import
|
7
6
|
module Google
|
8
7
|
class NewFontsFetcher
|
9
|
-
REPO_PATH = Fontist.
|
8
|
+
REPO_PATH = Fontist.fontist_path.join("google", "fonts")
|
10
9
|
REPO_URL = "https://github.com/google/fonts.git".freeze
|
11
10
|
SKIPLIST_PATH = File.expand_path("skiplist.yml", __dir__)
|
12
11
|
|
@@ -25,7 +24,8 @@ module Fontist
|
|
25
24
|
if Dir.exist?(REPO_PATH)
|
26
25
|
`cd #{REPO_PATH} && git pull`
|
27
26
|
else
|
28
|
-
|
27
|
+
FileUtils.mkdir_p(File.dirname(REPO_PATH))
|
28
|
+
`git clone --depth 1 #{REPO_URL} #{REPO_PATH}`
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -53,23 +53,11 @@ module Fontist
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def new?(path)
|
56
|
-
|
57
|
-
return unless
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
def fetch_metadata(path)
|
63
|
-
metadata_path = File.join(path, "METADATA.pb")
|
64
|
-
return unless File.exists?(metadata_path)
|
65
|
-
|
66
|
-
::Google::Fonts::FamilyProto.parse_from_text(File.read(metadata_path))
|
67
|
-
end
|
68
|
-
|
69
|
-
def font_new?(metadata, path)
|
70
|
-
return if in_skiplist?(metadata.name)
|
71
|
-
return if up_to_date?(metadata, path)
|
72
|
-
return unless downloadable?(metadata.name)
|
56
|
+
metadata_name = Google.metadata_name(path)
|
57
|
+
return unless metadata_name
|
58
|
+
return if in_skiplist?(metadata_name)
|
59
|
+
return if up_to_date?(metadata_name, path)
|
60
|
+
return unless downloadable?(metadata_name)
|
73
61
|
|
74
62
|
true
|
75
63
|
end
|
@@ -79,29 +67,47 @@ module Fontist
|
|
79
67
|
@skiplist.include?(name)
|
80
68
|
end
|
81
69
|
|
82
|
-
def up_to_date?(
|
83
|
-
formula = formula(
|
70
|
+
def up_to_date?(metadata_name, path)
|
71
|
+
formula = formula(metadata_name)
|
84
72
|
return false unless formula
|
85
73
|
|
86
|
-
|
74
|
+
repo_digest_up_to_date?(formula, path) ||
|
75
|
+
fonts_up_to_date?(formula, path)
|
76
|
+
end
|
77
|
+
|
78
|
+
def repo_digest_up_to_date?(formula, path)
|
79
|
+
return unless formula.digest
|
87
80
|
|
88
|
-
|
89
|
-
|
81
|
+
formula.digest == Google.digest(path)
|
82
|
+
end
|
83
|
+
|
84
|
+
def fonts_up_to_date?(formula, path)
|
85
|
+
styles = formula_styles(formula)
|
86
|
+
repo_fonts(path).all? do |font|
|
87
|
+
style = styles.find { |s| s.font == repo_to_archive_name(font) }
|
88
|
+
return false unless style
|
89
|
+
|
90
|
+
otfinfo_version(font) == style.version
|
90
91
|
end
|
91
92
|
end
|
92
93
|
|
93
|
-
def formula
|
94
|
-
|
95
|
-
@formulas ||= Fontist::Formula.all
|
96
|
-
@formulas["Fontist::Formulas::#{klass}Font"]
|
94
|
+
def formula_styles(formula)
|
95
|
+
formula.fonts.map(&:styles).flatten
|
97
96
|
end
|
98
97
|
|
99
|
-
def
|
100
|
-
File.join(
|
98
|
+
def repo_fonts(path)
|
99
|
+
Dir.glob(File.join(path, "*.{ttf,otf}"))
|
101
100
|
end
|
102
101
|
|
103
|
-
def
|
104
|
-
|
102
|
+
def repo_to_archive_name(font_path)
|
103
|
+
File.basename(font_path)
|
104
|
+
.sub("[wght]", "-VariableFont_wght")
|
105
|
+
.sub("[opsz]", "-Regular-VariableFont_opsz")
|
106
|
+
end
|
107
|
+
|
108
|
+
def formula(font_name)
|
109
|
+
path = Fontist::Import::Google.formula_path(font_name)
|
110
|
+
Formula.new_from_file(path) if File.exist?(path)
|
105
111
|
end
|
106
112
|
|
107
113
|
def otfinfo_version(path)
|
@@ -110,10 +116,15 @@ module Fontist
|
|
110
116
|
end
|
111
117
|
|
112
118
|
def downloadable?(name)
|
119
|
+
retries ||= 0
|
120
|
+
retries += 1
|
113
121
|
Down.open("https://fonts.google.com/download?family=#{name}")
|
114
122
|
true
|
115
123
|
rescue Down::NotFound
|
116
124
|
false
|
125
|
+
rescue Down::TimeoutError
|
126
|
+
retry unless retries >= 3
|
127
|
+
false
|
117
128
|
end
|
118
129
|
end
|
119
130
|
end
|
@@ -1,11 +1,29 @@
|
|
1
1
|
module Fontist
|
2
2
|
module Import
|
3
3
|
module Google
|
4
|
+
def self.metadata_name(path)
|
5
|
+
metadata_path = File.join(path, "METADATA.pb")
|
6
|
+
return unless File.exists?(metadata_path)
|
7
|
+
|
8
|
+
File.foreach(metadata_path) do |line|
|
9
|
+
name = line.match(/^name: "(.+)"/)
|
10
|
+
return name[1] if name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
4
14
|
def self.formula_path(name)
|
5
15
|
filename = name.downcase.gsub(" ", "_") + ".yml"
|
6
16
|
Fontist.formulas_path.join("google", filename)
|
7
17
|
end
|
8
18
|
|
19
|
+
def self.digest(path)
|
20
|
+
checksums = Dir.glob(File.join(path, "*.{ttf,otf,ttc}"))
|
21
|
+
.sort
|
22
|
+
.map { |x| Digest::SHA256.file(x).to_s }
|
23
|
+
|
24
|
+
Digest::SHA256.hexdigest(checksums.to_s)
|
25
|
+
end
|
26
|
+
|
9
27
|
def self.style_version(text)
|
10
28
|
return unless text
|
11
29
|
|
@@ -4,17 +4,12 @@ module Fontist
|
|
4
4
|
module Import
|
5
5
|
class GoogleCheck
|
6
6
|
def call
|
7
|
-
fetch_formulas
|
8
7
|
fonts = new_fonts
|
9
8
|
indicate(fonts)
|
10
9
|
end
|
11
10
|
|
12
11
|
private
|
13
12
|
|
14
|
-
def fetch_formulas
|
15
|
-
Formula.update_formulas_repo
|
16
|
-
end
|
17
|
-
|
18
13
|
def new_fonts
|
19
14
|
Fontist::Import::Google::NewFontsFetcher.new(logging: true).call
|
20
15
|
end
|
@@ -26,8 +21,6 @@ module Fontist
|
|
26
21
|
new_paths.each do |path|
|
27
22
|
puts path
|
28
23
|
end
|
29
|
-
|
30
|
-
abort
|
31
24
|
end
|
32
25
|
end
|
33
26
|
end
|