jekyll-polyglot 1.9.0 → 1.11.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 58fab59c4c6aabba378edb4622f960b9ee2910c41e9b7cb329218cf4602bfaa2
4
- data.tar.gz: 2a077894396baca9c8215a44abe6734abd9c1c00d0975259cf98380f77e72a10
3
+ metadata.gz: b3ca341e67c10066675cb10c5ded127cf9126c5db547d2f3fdfc3d545c43bd6a
4
+ data.tar.gz: 32315c6551ac56da248adb7d465c130d8f0ec4f03a7d589eb5e2081c1a420821
5
5
  SHA512:
6
- metadata.gz: 1c90c5e30bd2703cfab18b75b0a23d6a94350709dcd4d1acfade18497f4ce7bdddeba18cc9efd1cf527e3aeb5295e422e0108da10a12f556b2a007f5e57a26b6
7
- data.tar.gz: fdda50a81bbbd06e90e4b170be83f207b01f1f66eeabea7b4aff68421bc5bbcdf124e3cccf737d01cfa59f48fb914121953140cdde9ecadd6f572b31c1ba08d7
6
+ metadata.gz: b53d59e7090b20849d36cdfe6b54a6b0e40e40db839916f1df45c62f26b0ef541f43d30d88c3cbfcd0eb8e58ecc4e45b1f3ae1509cdd2aa0149aad4be41d9a95
7
+ data.tar.gz: 12a99dc155b5e4c7ba5f960e0267a90b547fa10576c9c3bf718784f139bf45b0da7554ac40e262b491aa113301eba5d1c16c2bb615fb901d26adf4cee90d0917
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  🔤 Polyglot
2
2
  ---
3
3
  [![Gem Version](https://badge.fury.io/rb/jekyll-polyglot.svg)](https://badge.fury.io/rb/jekyll-polyglot)
4
- [![CircleCI](https://circleci.com/gh/untra/polyglot/tree/master.svg?style=svg)](https://circleci.com/gh/untra/polyglot/?branch=master)
4
+ [![CircleCI](https://circleci.com/gh/untra/polyglot/tree/main.svg?style=svg)](https://circleci.com/gh/untra/polyglot/?branch=main)
5
+ [![codecov](https://codecov.io/gh/untra/polyglot/graph/badge.svg?token=AAIYBIxdWr)](https://codecov.io/gh/untra/polyglot)
5
6
 
6
7
  __Polyglot__ is a fast, painless, open-source internationalization plugin for [Jekyll](http://jekyllrb.com) blogs. Polyglot is easy to set up and use with any Jekyll project, and it scales to the languages you want to support. With fallback support for missing content, automatic url relativization, and powerful SEO tools, Polyglot allows any multi-language jekyll blog to focus on content without the cruft.
7
8
 
@@ -38,9 +39,7 @@ These configuration preferences indicate
38
39
  - whether to run language processing in parallel or serial. Set to `false` if building on Windows hosts, or if Polyglot collides with other Jekyll plugins.
39
40
  - your jekyll website production url. Make sure this value is set; Polyglot requires this to relative site urls correctly, and to make functioning language switchers.
40
41
 
41
- The optional `lang_from_path: true` option enables getting page
42
- language from the first or second path segment, e.g `de/first-one.md`, or
43
- `_posts/zh_Hans_HK/use-second-segment.md` , if the lang frontmatter isn't defined.
42
+ The optional `lang_from_path: true` option enables getting the page language from a filepath segment seperated by `/` or `.`, e.g `de/first-one.md`, or `_posts/zh_HK/use-second-segment.md` , if the lang frontmatter isn't defined.
44
43
 
45
44
  ## How To Use It
46
45
  When adding new posts and pages, add to the YAML front matter:
@@ -51,7 +50,7 @@ or whatever appropriate [I18n language code](https://developer.chrome.com/docs/e
51
50
  the page should build for. And you're done. Ideally, when designing your site, you should
52
51
  organize files by their relative urls.
53
52
 
54
- You can see how the live Polyglot website [configures and supports multiple languages](https://github.com/untra/polyglot/blob/master/site/_config.yml#L28-L37), and examples of [community](https://github.com/untra/polyglot/pull/155) [language](https://github.com/untra/polyglot/pull/167) [contributions](https://github.com/untra/polyglot/pull/177).
53
+ You can see how the live Polyglot website [configures and supports multiple languages](https://github.com/untra/polyglot/blob/main/site/_config.yml#L28-L37), and examples of [community](https://github.com/untra/polyglot/pull/155) [language](https://github.com/untra/polyglot/pull/167) [contributions](https://github.com/untra/polyglot/pull/177).
55
54
 
56
55
  Polyglot works by associating documents with similar permalinks to the `lang` specified in their frontmatter. Files that correspond to similar routes should have identical permalinks. If you don't provide a permalink for a post, ___make sure you are consistent___ with how you place and name corresponding files:
57
56
  ```
@@ -113,7 +112,7 @@ Estos somos nosotros!
113
112
  ```
114
113
 
115
114
  Additionally, if you are also using the `jekyll-redirect-from` plugin, pages coordinated this way will automatically have redirects created between pages.
116
- So `/es/about` will automatically redirect to `/es/acerca-de` and `/acerca-de` can redirect to `/about`. If you use this approach, be sure to also employ a customized [redirect.html](https://github.com/untra/polyglot/blob/master/site/_layouts/redirect.html).
115
+ So `/es/about` will automatically redirect to `/es/acerca-de` and `/acerca-de` can redirect to `/about`. If you use this approach, be sure to also employ a customized [redirect.html](https://github.com/untra/polyglot/blob/main/site/_layouts/redirect.html).
117
116
 
118
117
  #### Fallback Language Support
119
118
  Lets say you are building your website. You have an `/about/` page written in *english*, *german* and
@@ -161,7 +160,7 @@ becomes
161
160
 
162
161
  ### Disabling Url Relativizing
163
162
  _New in 1.4.0_
164
- If you dont want a href attribute to be relativized (such as for making [a language switcher](https://github.com/untra/polyglot/blob/master/site/_includes/sidebar.html#L40)), you can use the block tag:
163
+ If you dont want a href attribute to be relativized (such as for making [a language switcher](https://github.com/untra/polyglot/blob/main/site/_includes/sidebar.html#L40)), you can use the block tag:
165
164
 
166
165
  ```html
167
166
  {% static_href %}href="..."{% endstatic_href %}
@@ -252,7 +251,7 @@ Polyglot will only start builds after it confirms there is a cpu core ready to a
252
251
  ### Writing Tests and Debugging
253
252
  _:wave: I need assistance with modern ruby best practices for test maintenance with rake and rspec. If you got the advice I have the ears._
254
253
 
255
- Tests are run with `bundle exec rake`. Tests are in the `/spec` directory, and test failure output detail can be examined in the `rspec.xml` file.
254
+ Tests are run with `test.sh`. Tests are in the `/spec` directory, and test failure output detail can be examined in the `rspec.json` file. Code Coverage details are in the the `coverage` directory.
256
255
 
257
256
  ## Features
258
257
  This plugin stands out from other I18n Jekyll plugins.
@@ -332,15 +331,15 @@ Feel free to open a PR and list your multilingual blog here you may want to shar
332
331
 
333
332
  ## 2.0 Roadmap
334
333
  * [x] - **site language**: portuguese Brazil `pt-BR`
335
- * [ ] - **site language**: portuguese Portugal `pt-PT`
336
- * [ ] - **site language**: arabic `ar`
337
- * [ ] - **site language**: japanese `ja`
334
+ * [x] - **site language**: arabic `ar`
335
+ * [x] - **site language**: japanese `ja`
338
336
  * [x] - **site language**: russian `ru`
339
337
  * [x] - **site language**: dutch `nl`
340
338
  * [x] - **site language**: korean `ko`
341
339
  * [x] - **site language**: hebrew `he`
342
340
  * [x] - **site language**: chinese China `zh-CN`
343
341
  * [ ] - **site language**: chinese Taiwan `zh-TW`
342
+ * [ ] - **site language**: portuguese Portugal `pt-PT`
344
343
  * [ ] - get whitelisted as an official github-pages jekyll plugin
345
344
  * [x] - update CI provider
346
345
 
@@ -8,7 +8,7 @@ def hook_coordinate(site)
8
8
  # Copy the language specific data, by recursively merging it with the default data.
9
9
  # Favour active_lang first, then default_lang, then any non-language-specific data.
10
10
  # See: https://www.ruby-forum.com/topic/142809
11
- merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
11
+ merger = proc { |_key, v1, v2| v1.is_a?(Hash) && v2.is_a?(Hash) ? v1.merge(v2, &merger) : v2 }
12
12
  if site.data.include?(site.default_lang)
13
13
  site.data = site.data.merge(site.data[site.default_lang], &merger)
14
14
  end
@@ -16,7 +16,7 @@ def hook_coordinate(site)
16
16
  site.data = site.data.merge(site.data[site.active_lang], &merger)
17
17
  end
18
18
 
19
- site.collections.each do |_, collection|
19
+ site.collections.each_value do |collection|
20
20
  collection.docs = site.coordinate_documents(collection.docs)
21
21
  end
22
22
  site.pages = site.coordinate_documents(site.pages)
@@ -4,7 +4,7 @@ Jekyll::Hooks.register :site, :post_render do |site|
4
4
  end
5
5
 
6
6
  def hook_process(site)
7
- site.collections.each do |_, collection|
7
+ site.collections.each_value do |collection|
8
8
  site.process_documents(collection.docs)
9
9
  end
10
10
  site.process_documents(site.pages)
@@ -11,18 +11,52 @@ module Jekyll
11
11
 
12
12
  def render(context)
13
13
  site = context.registers[:site]
14
- permalink = context.registers[:page]['permalink']
15
- permalink_lang = context.registers[:page]['permalink_lang']
16
- site_url = @url.empty? ? site.config['url'] : @url
14
+ page = context.registers[:page]
15
+ permalink = page['permalink'] || page['url'] || ''
16
+ permalink = "/#{permalink}" unless permalink.start_with?("/")
17
+ page_id = page['page_id']
18
+ permalink_lang = page['permalink_lang']
19
+ baseurl = site.config['baseurl'] || ''
20
+ site_url = @url.empty? ? site.config['url'] + baseurl : @url
17
21
  i18n = "<meta http-equiv=\"Content-Language\" content=\"#{site.active_lang}\">\n"
18
- i18n += "<link rel=\"alternate\" hreflang=\"#{site.default_lang}\" "\
19
- "href=\"#{site_url}/#{permalink}\"/>\n"
20
- site.languages.each do |lang|
21
- next if lang == site.default_lang
22
22
 
23
- url = permalink_lang && permalink_lang[lang] ? permalink_lang[lang] : permalink
24
- i18n += "<link rel=\"alternate\" hreflang=\"#{lang}\" "\
25
- "href=\"#{site_url}/#{lang}/#{url}\"/>\n"
23
+ # Find all documents with the same page_id
24
+ docs_with_same_id = site.collections.values
25
+ .flat_map(&:docs)
26
+ .filter { |doc| !doc.data['page_id'].nil? }
27
+ .select { |doc| doc.data['page_id'] == page_id }
28
+
29
+ # Build a hash of lang => permalink for all matching docs
30
+ lang_to_permalink = docs_with_same_id.to_h { |doc| [doc.data['lang'], doc.data['permalink']] }
31
+
32
+ # Canonical should always point to the current page's permalink (active_lang)
33
+ current_lang = site.active_lang
34
+ current_permalink = lang_to_permalink[current_lang] || (permalink_lang && permalink_lang[current_lang]) || permalink
35
+ current_permalink = "/#{current_permalink}" unless current_permalink.start_with?("/")
36
+ # Don't add language prefix if it's already in the permalink
37
+ canonical_permalink = if current_lang == site.default_lang
38
+ current_permalink
39
+ else
40
+ current_permalink.start_with?("/#{current_lang}/") ? current_permalink : "/#{current_lang}#{current_permalink}"
41
+ end
42
+ i18n += "<link rel=\"canonical\" href=\"#{site_url}#{canonical_permalink}\"/>\n"
43
+
44
+ # Get the default language permalink for x-default
45
+ default_lang_permalink = lang_to_permalink[site.default_lang] || (permalink_lang && permalink_lang[site.default_lang]) || permalink
46
+ default_lang_permalink = "/#{default_lang_permalink}" unless default_lang_permalink.start_with?("/")
47
+
48
+ site.languages.each do |lang|
49
+ alt_permalink = lang_to_permalink[lang] || (permalink_lang && permalink_lang[lang]) || permalink
50
+ alt_permalink = "/#{alt_permalink}" unless alt_permalink.start_with?("/")
51
+ i18n += if lang == site.default_lang
52
+ "<link rel=\"alternate\" hreflang=\"#{lang}\" href=\"#{site_url}#{alt_permalink}\"/>\n" \
53
+ "<link rel=\"alternate\" hreflang=\"x-default\" href=\"#{site_url}#{default_lang_permalink}\"/>\n"
54
+ else
55
+ # For non-default languages, use the language-specific permalink directly
56
+ # Don't add the language prefix if it's already in the permalink
57
+ lang_permalink = alt_permalink.start_with?("/#{lang}/") ? alt_permalink : "/#{lang}#{alt_permalink}"
58
+ "<link rel=\"alternate\" hreflang=\"#{lang}\" href=\"#{site_url}#{lang_permalink}\"/>\n"
59
+ end
26
60
  end
27
61
  i18n
28
62
  end
@@ -1,21 +1,17 @@
1
1
  module Jekyll
2
2
  module Polyglot
3
3
  module Liquid
4
- class StaticHrefTag < :: Liquid::Block
5
- def initialize(tag_name, params, tokens)
6
- super
7
- end
8
-
4
+ class StaticHrefTag < ::Liquid::Block
9
5
  def render(context)
10
6
  text = super
11
- href_attrs = text.strip.split '='
7
+ href_attrs = text.strip.split('=', 2)
12
8
  valid = (href_attrs.length == 2 && href_attrs[0] == 'href') && href_attrs[1].start_with?('"') && href_attrs[1].end_with?('"')
13
9
  unless valid
14
- raise Liquid::SyntaxError, "static_href parameters must include match href=\"...\" attribute param, eg. href=\"http://example.com\, href=\"/about\", href=\"/\" , instead got:\n#{text}"
10
+ raise Liquid::SyntaxError, "static_href parameters must include match href=\"...\" attribute param, eg. href=\"http://example.com, href=\"/about\", href=\"/\" , instead got:\n#{text}"
15
11
  end
16
12
 
17
13
  href_value = href_attrs[1]
18
- # href writes out as ferh="..." explicitly wrong, to be cauaght by seperate processor for nonrelativized links
14
+ # href writes out as ferh="..." explicitly wrong, to be caught by separate processor for nonrelativized links
19
15
  "ferh=#{href_value}"
20
16
  end
21
17
  end
@@ -1,3 +1,4 @@
1
+ require 'English'
1
2
  require 'etc'
2
3
 
3
4
  include Process
@@ -31,7 +32,7 @@ module Jekyll
31
32
  alias process_orig process
32
33
  def process
33
34
  prepare
34
- all_langs = (@languages + [@default_lang]).uniq
35
+ all_langs = ([@default_lang] + @languages).uniq
35
36
  if @parallel_localization
36
37
  nproc = Etc.nprocessors
37
38
  pids = {}
@@ -42,11 +43,11 @@ module Jekyll
42
43
  end
43
44
  while pids.length >= (lang == all_langs[-1] ? 1 : nproc)
44
45
  sleep 0.1
45
- pids.map do |lang, pid|
46
+ pids.map do |pid_lang, pid|
46
47
  next unless waitpid pid, Process::WNOHANG
47
48
 
48
- pids.delete lang
49
- raise "Polyglot subprocess #{pid} (#{lang}) failed (#{$?.exitstatus})" unless $?.success?
49
+ pids.delete pid_lang
50
+ raise "Polyglot subprocess #{pid} (#{lang}) failed (#{$CHILD_STATUS.exitstatus})" unless $CHILD_STATUS.success?
50
51
  end
51
52
  end
52
53
  end
@@ -63,7 +64,7 @@ module Jekyll
63
64
  process_language lang
64
65
  end
65
66
  end
66
- Jekyll::Hooks.trigger :polyglot, :post_write
67
+ Jekyll::Hooks.trigger :polyglot, :post_write, self
67
68
  end
68
69
 
69
70
  alias site_payload_orig site_payload
@@ -114,6 +115,16 @@ module Jekyll
114
115
  string.split(regex)
115
116
  end
116
117
 
118
+ # Convert glob pattern to regex pattern
119
+ # * matches any characters except /
120
+ # ? matches any single character except /
121
+ def glob_to_regex(pattern)
122
+ # Escape special regex characters first
123
+ escaped = Regexp.escape(pattern)
124
+ # Convert glob patterns to regex patterns
125
+ escaped.gsub("\\*", '.*').gsub("\\?", '.')
126
+ end
127
+
117
128
  def derive_lang_from_path(doc)
118
129
  unless @lang_from_path
119
130
  return nil
@@ -127,13 +138,6 @@ module Jekyll
127
138
  end
128
139
  end
129
140
 
130
- # loop through all segments and check if they match the language regex
131
- segments.each do |segment|
132
- if @languages.include?(segment)
133
- return segment
134
- end
135
- end
136
-
137
141
  nil
138
142
  end
139
143
 
@@ -163,21 +167,28 @@ module Jekyll
163
167
  approved[page_id] = doc
164
168
  @file_langs[page_id] = lang
165
169
  end
166
- approved.values.each { |doc| assignPageRedirects(doc, docs) }
167
- approved.values.each { |doc| assignPageLanguagePermalinks(doc, docs) }
170
+ approved.each_value do |doc|
171
+ assignPageRedirects(doc, docs)
172
+ assignPageLanguagePermalinks(doc, docs)
173
+ end
168
174
  approved.values
169
175
  end
170
176
 
171
177
  def assignPageRedirects(doc, docs)
172
178
  pageId = doc.data['page_id']
173
179
  if !pageId.nil? && !pageId.empty?
174
- lang = doc.data['lang'] || derive_lang_from_path(doc) || @default_lang
175
- langPrefix = lang === @default_lang ? '' : "#{lang}/"
176
- redirectDocs = docs.select do |dd|
177
- doclang = dd.data['lang'] || derive_lang_from_path(dd) || @default_lang
178
- dd.data['page_id'] == pageId && doclang != lang && dd.data['permalink'] != doc.data['permalink']
180
+ redirects = []
181
+
182
+ docs_with_same_id = docs.select { |dd| dd.data['page_id'] == pageId }
183
+
184
+ # For each document with the same page_id
185
+ docs_with_same_id.each do |dd|
186
+ # Add redirect if it's a different permalink
187
+ if dd.data['permalink'] != doc.data['permalink']
188
+ redirects << dd.data['permalink']
189
+ end
179
190
  end
180
- redirects = redirectDocs.map { |dd| dd.data['permalink'] }
191
+
181
192
  doc.data['redirect_from'] = redirects
182
193
  end
183
194
  end
@@ -221,7 +232,7 @@ module Jekyll
221
232
  def document_url_regex
222
233
  regex = ''
223
234
  (@languages || []).each do |lang|
224
- regex += "([\/\.]#{lang}[\/\.])|"
235
+ regex += "([/.]#{lang}[/.])|"
225
236
  end
226
237
  regex.chomp! '|'
227
238
  /#{regex}/
@@ -235,10 +246,12 @@ module Jekyll
235
246
  regex = ''
236
247
  unless disabled
237
248
  @exclude.each do |x|
238
- regex += "(?!#{x})"
249
+ escaped_x = glob_to_regex(x)
250
+ regex += "(?!#{escaped_x})"
239
251
  end
240
252
  @languages.each do |x|
241
- regex += "(?!#{x}\/)"
253
+ escaped_x = Regexp.escape(x)
254
+ regex += "(?!#{escaped_x}/)"
242
255
  end
243
256
  end
244
257
  start = disabled ? 'ferh' : 'href'
@@ -253,21 +266,24 @@ module Jekyll
253
266
  regex = ''
254
267
  unless disabled
255
268
  @exclude.each do |x|
256
- regex += "(?!#{x})"
269
+ escaped_x = glob_to_regex(x)
270
+ regex += "(?!#{escaped_x})"
257
271
  end
258
272
  @languages.each do |x|
259
- regex += "(?!#{x}\/)"
273
+ escaped_x = Regexp.escape(x)
274
+ regex += "(?!#{escaped_x}/)"
260
275
  end
261
276
  end
262
277
  start = disabled ? 'ferh' : 'href'
263
- %r{(?<!hreflang="#{@default_lang}" )#{start}="?#{url}#{@baseurl}/((?:#{regex}[^,'"\s/?.]+\.?)*(?:/[^\]\[)("'\s]*)?)"}
278
+ neglookbehind = disabled ? "" : "(?<!hreflang=\"#{@default_lang}\" |rel=\"canonical\" )"
279
+ %r{#{neglookbehind}#{start}="?#{url}#{@baseurl}/((?:#{regex}[^,'"\s/?.]+\.?)*(?:/[^\]\[)("'\s]*)?)"}
264
280
  end
265
281
 
266
282
  def relativize_urls(doc, regex)
267
283
  return if doc.output.nil?
268
284
 
269
285
  modified_output = doc.output.dup
270
- modified_output.gsub!(regex, "href=\"#{@baseurl}/#{@active_lang}/" + '\1"')
286
+ modified_output.gsub!(regex, "href=\"#{@baseurl}/#{@active_lang}/\\1\"")
271
287
  doc.output = modified_output
272
288
  end
273
289
 
@@ -275,7 +291,7 @@ module Jekyll
275
291
  return if doc.output.nil?
276
292
 
277
293
  modified_output = doc.output.dup
278
- modified_output.gsub!(regex, "href=\"#{url}#{@baseurl}/#{@active_lang}/" + '\1"')
294
+ modified_output.gsub!(regex, "href=\"#{url}#{@baseurl}/#{@active_lang}/\\1\"")
279
295
  doc.output = modified_output
280
296
  end
281
297
 
@@ -283,7 +299,7 @@ module Jekyll
283
299
  return if doc.output.nil?
284
300
 
285
301
  modified_output = doc.output.dup
286
- modified_output.gsub!(regex, "href=\"#{url}#{@baseurl}/" + '\1"')
302
+ modified_output.gsub!(regex, "href=\"#{url}#{@baseurl}/\\1\"")
287
303
  doc.output = modified_output
288
304
  end
289
305
 
@@ -291,7 +307,7 @@ module Jekyll
291
307
  return if doc.output.nil?
292
308
 
293
309
  modified_output = doc.output.dup
294
- modified_output.gsub!(regex, "href=\"#{@baseurl}/" + '\1"')
310
+ modified_output.gsub!(regex, "href=\"#{@baseurl}/\\1\"")
295
311
  doc.output = modified_output
296
312
  end
297
313
  end
@@ -1,19 +1,20 @@
1
-
2
1
  module Jekyll
3
2
  # Alteration to Jekyll StaticFile
4
3
  # provides aliased methods to direct write to skip files
5
4
  # excluded from localization
6
5
  class StaticFile
7
- alias_method :write_orig, :write
6
+ alias write_orig write
8
7
  def write(dest)
9
8
  return false if exclude_from_localization?
9
+
10
10
  write_orig(dest)
11
11
  end
12
12
 
13
13
  def exclude_from_localization?
14
14
  return false if @site.active_lang == @site.default_lang
15
+
15
16
  @site.exclude_from_localization.each do |e|
16
- return true if relative_path[1..-1].start_with?(e)
17
+ return true if relative_path[1..].start_with?(e)
17
18
  end
18
19
  false
19
20
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-polyglot
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Volin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-18 00:00:00.000000000 Z
11
+ date: 2025-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -54,7 +54,8 @@ files:
54
54
  homepage: https://polyglot.untra.io/
55
55
  licenses:
56
56
  - MIT
57
- metadata: {}
57
+ metadata:
58
+ rubygems_mfa_required: 'true'
58
59
  post_install_message:
59
60
  rdoc_options: []
60
61
  require_paths:
@@ -63,12 +64,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
63
64
  requirements:
64
65
  - - ">="
65
66
  - !ruby/object:Gem::Version
66
- version: 2.7.0
67
+ version: 3.1.0
67
68
  required_rubygems_version: !ruby/object:Gem::Requirement
68
69
  requirements:
69
70
  - - ">="
70
71
  - !ruby/object:Gem::Version
71
- version: 2.7.0
72
+ version: 3.1.0
72
73
  requirements: []
73
74
  rubygems_version: 3.3.7
74
75
  signing_key: