ucode 0.1.1 → 0.2.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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/TODO.extract-code-chart/01-pdf-fetch-validation.md +80 -0
  3. data/TODO.extract-code-chart/02-block-name-resolver.md +68 -0
  4. data/TODO.extract-code-chart/03-codechart-namespace.md +82 -0
  5. data/TODO.extract-code-chart/04-codechart-extractor.md +154 -0
  6. data/TODO.extract-code-chart/05-provenance-and-sidecar.md +147 -0
  7. data/TODO.extract-code-chart/06-codechart-writer.md +134 -0
  8. data/TODO.extract-code-chart/07-codechart-cli.md +135 -0
  9. data/TODO.extract-code-chart/08-specs.md +87 -0
  10. data/lib/ucode/audit/reference_factory.rb +66 -0
  11. data/lib/ucode/audit.rb +1 -0
  12. data/lib/ucode/cli.rb +134 -16
  13. data/lib/ucode/code_chart/extractor.rb +122 -0
  14. data/lib/ucode/code_chart/provenance.rb +81 -0
  15. data/lib/ucode/code_chart/sidecar.rb +52 -0
  16. data/lib/ucode/code_chart/writer.rb +128 -0
  17. data/lib/ucode/code_chart.rb +39 -0
  18. data/lib/ucode/commands/audit.rb +0 -1
  19. data/lib/ucode/commands/build.rb +4 -0
  20. data/lib/ucode/commands/canonical_build.rb +2 -3
  21. data/lib/ucode/commands/fetch.rb +12 -14
  22. data/lib/ucode/commands/glyphs.rb +25 -67
  23. data/lib/ucode/commands/lookup.rb +11 -11
  24. data/lib/ucode/commands/parse.rb +7 -5
  25. data/lib/ucode/commands/release.rb +0 -1
  26. data/lib/ucode/commands/universal_set.rb +10 -14
  27. data/lib/ucode/coordinator/indices.rb +38 -2
  28. data/lib/ucode/error.rb +11 -0
  29. data/lib/ucode/fetch/code_charts.rb +1 -1
  30. data/lib/ucode/fetch/http.rb +84 -14
  31. data/lib/ucode/glyphs/pipeline.rb +106 -0
  32. data/lib/ucode/glyphs.rb +1 -0
  33. data/lib/ucode/parsers/blocks.rb +34 -0
  34. data/lib/ucode/repo/aggregate_writer.rb +60 -298
  35. data/lib/ucode/repo/writers/blocks_writer.rb +73 -0
  36. data/lib/ucode/repo/writers/enums_writer.rb +38 -0
  37. data/lib/ucode/repo/writers/indexes_writer.rb +53 -0
  38. data/lib/ucode/repo/writers/manifest_writer.rb +78 -0
  39. data/lib/ucode/repo/writers/named_sequences_writer.rb +47 -0
  40. data/lib/ucode/repo/writers/planes_writer.rb +82 -0
  41. data/lib/ucode/repo/writers/relationships_writer.rb +71 -0
  42. data/lib/ucode/repo/writers/scripts_writer.rb +54 -0
  43. data/lib/ucode/repo/writers.rb +20 -0
  44. data/lib/ucode/repo.rb +1 -0
  45. data/lib/ucode/version.rb +1 -1
  46. data/lib/ucode.rb +3 -0
  47. data/ucode.gemspec +56 -0
  48. metadata +31 -5
  49. data/Gemfile.lock +0 -406
  50. data/lib/ucode/commands/audit/reference_builder.rb +0 -64
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require "ucode/repo/atomic_writes"
5
+
6
+ module Ucode
7
+ module Repo
8
+ module Writers
9
+ # Writes one file per named sequence under
10
+ # `output/named_sequences/<slug>.json`. Empty input writes nothing.
11
+ #
12
+ # One of the eight per-concern writers split out from
13
+ # AggregateWriter — see Candidate 5 of the 2026-06-29 review.
14
+ class NamedSequencesWriter
15
+ include AtomicWrites
16
+
17
+ # @param output_root [Pathname]
18
+ # @param named_sequences [Array<Ucode::Models::NamedSequence>]
19
+ def initialize(output_root:, named_sequences:)
20
+ @output_root = output_root
21
+ @named_sequences = named_sequences
22
+ end
23
+
24
+ # @return [Integer] number of named-sequence files written
25
+ def write
26
+ return 0 if @named_sequences.nil? || @named_sequences.empty?
27
+
28
+ dir = Pathname(@output_root).join("named_sequences")
29
+ @named_sequences.sum do |ns|
30
+ path = dir.join("#{slug_for(ns)}.json")
31
+ write_atomic(path, ns.to_json(pretty: true)) ? 1 : 0
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ # Slug derived from the name: downcase, non-alphanumerics → "_".
38
+ def slug_for(named_sequence)
39
+ named_sequence.name
40
+ .downcase
41
+ .gsub(/[^a-z0-9]+/, "_")
42
+ .gsub(/^_+|_+$/, "")
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ucode/repo/atomic_writes"
4
+ require "ucode/repo/paths"
5
+
6
+ module Ucode
7
+ module Repo
8
+ module Writers
9
+ # Writes `output/planes/<n>.json` for every plane (0..16).
10
+ #
11
+ # One of the eight per-concern writers split out from
12
+ # AggregateWriter — see Candidate 5 of the 2026-06-29 review.
13
+ class PlanesWriter
14
+ include AtomicWrites
15
+
16
+ # Static metadata for the 17 Unicode planes. Planes 4–13 are
17
+ # unassigned in Unicode 17; their entries use placeholder names.
18
+ PLANE_TABLE = {
19
+ 0 => ["Basic Multilingual Plane", "BMP"],
20
+ 1 => ["Supplementary Multilingual Plane", "SMP"],
21
+ 2 => ["Supplementary Ideographic Plane", "SIP"],
22
+ 3 => ["Tertiary Ideographic Plane", "TIP"],
23
+ 4 => ["Unassigned Plane 4", "—"],
24
+ 5 => ["Unassigned Plane 5", "—"],
25
+ 6 => ["Unassigned Plane 6", "—"],
26
+ 7 => ["Unassigned Plane 7", "—"],
27
+ 8 => ["Unassigned Plane 8", "—"],
28
+ 9 => ["Unassigned Plane 9", "—"],
29
+ 10 => ["Unassigned Plane 10", "—"],
30
+ 11 => ["Unassigned Plane 11", "—"],
31
+ 12 => ["Unassigned Plane 12", "—"],
32
+ 13 => ["Unassigned Plane 13", "—"],
33
+ 14 => ["Supplementary Special-purpose Plane", "SSP"],
34
+ 15 => ["Supplementary Private Use Area-A", "SPUA-A"],
35
+ 16 => ["Supplementary Private Use Area-B", "SPUA-B"],
36
+ }.freeze
37
+ private_constant :PLANE_TABLE
38
+
39
+ # @param output_root [Pathname]
40
+ # @param blocks [Array<Ucode::Models::Block>]
41
+ def initialize(output_root:, blocks:)
42
+ @output_root = output_root
43
+ @blocks = blocks
44
+ end
45
+
46
+ # @return [Integer] number of plane files written (always 17
47
+ # when the directory is reachable; one per plane number)
48
+ def write
49
+ plane_block_ids = group_block_ids_by_plane
50
+ count = 0
51
+ (0..16).each do |n|
52
+ path = Paths.plane_metadata_path(@output_root, n)
53
+ count += 1 if write_atomic(path, plane_payload(n, plane_block_ids[n] || []))
54
+ end
55
+ count
56
+ end
57
+
58
+ private
59
+
60
+ def group_block_ids_by_plane
61
+ @blocks.each_with_object(Hash.new { |h, k| h[k] = [] }) do |block, h|
62
+ h[block.plane_number] << block.id
63
+ end
64
+ end
65
+
66
+ def plane_payload(plane_number, block_ids)
67
+ name, abbrev = PLANE_TABLE.fetch(plane_number)
68
+ range_first = plane_number * 0x10000
69
+ range_last = range_first + 0xFFFF
70
+ to_pretty_json(
71
+ "number" => plane_number,
72
+ "name" => name,
73
+ "abbrev" => abbrev,
74
+ "range_first" => range_first,
75
+ "range_last" => range_last,
76
+ "block_ids" => block_ids,
77
+ )
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require "ucode/coordinator"
5
+ require "ucode/repo/atomic_writes"
6
+ require "ucode/repo/paths"
7
+
8
+ module Ucode
9
+ module Repo
10
+ module Writers
11
+ # Writes one file per relationship table under
12
+ # `output/relationships/`. The set of tables is enumerated by
13
+ # `Coordinator::Indices#each_relationship` (see Candidate 1 of the
14
+ # 2026-06-29 review).
15
+ #
16
+ # One of the eight per-concern writers split out from
17
+ # AggregateWriter — see Candidate 5 of the 2026-06-29 review.
18
+ class RelationshipsWriter
19
+ include AtomicWrites
20
+
21
+ # @param output_root [Pathname]
22
+ # @param indices [Ucode::Coordinator::Indices]
23
+ def initialize(output_root:, indices:)
24
+ @output_root = output_root
25
+ @indices = indices
26
+ end
27
+
28
+ # @return [Integer] number of relationship files written
29
+ def write
30
+ @indices.each_relationship.sum do |slug, records|
31
+ write_relationship_file(slug, records)
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def write_relationship_file(slug, records)
38
+ return 0 if records.nil? || records.empty?
39
+
40
+ path = Pathname(@output_root).join("relationships", "#{slug}.json")
41
+ write_atomic(path, relationship_payload(records)) ? 1 : 0
42
+ end
43
+
44
+ # records is Hash<Integer, Record>, Hash<Integer, Array<Record>>,
45
+ # Hash<String, Record>, or Hash<String, Array<Record>>.
46
+ def relationship_payload(records)
47
+ payload = records.each_with_object({}) do |(key, value), h|
48
+ h[key_to_cp_id(key)] = serialize_value(value)
49
+ end
50
+ to_pretty_json(payload)
51
+ end
52
+
53
+ # Integer codepoint keys are formatted as "U+XXXX"; string id
54
+ # keys (cjk_radicals, standardized_variants) pass through.
55
+ def key_to_cp_id(key)
56
+ key.is_a?(Integer) ? Paths.cp_id(key) : key
57
+ end
58
+
59
+ def serialize_value(value)
60
+ return value.map { |v| serialize_one(v) } if value.is_a?(Array)
61
+
62
+ serialize_one(value)
63
+ end
64
+
65
+ def serialize_one(record)
66
+ record.to_yaml_hash
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ucode/repo/atomic_writes"
4
+ require "ucode/repo/paths"
5
+
6
+ module Ucode
7
+ module Repo
8
+ module Writers
9
+ # Writes `output/scripts/<code>.json` for every assigned script.
10
+ #
11
+ # One of the eight per-concern writers split out from
12
+ # AggregateWriter — see Candidate 5 of the 2026-06-29 review.
13
+ class ScriptsWriter
14
+ include AtomicWrites
15
+
16
+ # @param output_root [Pathname]
17
+ # @param scripts [Array<Ucode::Models::Script>] from
18
+ # Coordinator::Indices
19
+ # @param script_codepoint_ids [Hash{String => Array<String>}]
20
+ # ISO 15924 code → cp_id list, accumulated during the
21
+ # streaming pass
22
+ def initialize(output_root:, scripts:, script_codepoint_ids:)
23
+ @output_root = output_root
24
+ @scripts = scripts
25
+ @script_codepoint_ids = script_codepoint_ids
26
+ end
27
+
28
+ # @return [Integer] number of script files written
29
+ def write
30
+ count = 0
31
+ @scripts.group_by(&:code).each do |code, ranges|
32
+ next if code.nil? || code.empty?
33
+
34
+ path = Paths.script_metadata_path(@output_root, code)
35
+ count += 1 if write_atomic(path, script_payload(code, ranges))
36
+ end
37
+ count
38
+ end
39
+
40
+ private
41
+
42
+ def script_payload(code, ranges)
43
+ to_pretty_json(
44
+ "code" => code,
45
+ "name" => ranges.first&.name,
46
+ "range_first" => ranges.map(&:range_first).min,
47
+ "range_last" => ranges.map(&:range_last).max,
48
+ "codepoint_ids" => (@script_codepoint_ids[code] || []),
49
+ )
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ucode
4
+ module Repo
5
+ # Per-concern writer classes, one per output file kind. Each
6
+ # conforms to the `#write → Integer` interface (returns the count
7
+ # of files written). Composed by AggregateWriter#flush — adding a
8
+ # new aggregate = one writer class + one line in AggregateWriter.
9
+ module Writers
10
+ autoload :PlanesWriter, "ucode/repo/writers/planes_writer"
11
+ autoload :BlocksWriter, "ucode/repo/writers/blocks_writer"
12
+ autoload :ScriptsWriter, "ucode/repo/writers/scripts_writer"
13
+ autoload :IndexesWriter, "ucode/repo/writers/indexes_writer"
14
+ autoload :RelationshipsWriter, "ucode/repo/writers/relationships_writer"
15
+ autoload :EnumsWriter, "ucode/repo/writers/enums_writer"
16
+ autoload :NamedSequencesWriter, "ucode/repo/writers/named_sequences_writer"
17
+ autoload :ManifestWriter, "ucode/repo/writers/manifest_writer"
18
+ end
19
+ end
20
+ end
data/lib/ucode/repo.rb CHANGED
@@ -18,6 +18,7 @@ module Ucode
18
18
  autoload :AtomicWrites, "ucode/repo/atomic_writes"
19
19
  autoload :CodepointWriter, "ucode/repo/codepoint_writer"
20
20
  autoload :AggregateWriter, "ucode/repo/aggregate_writer"
21
+ autoload :Writers, "ucode/repo/writers"
21
22
  autoload :BuildReportAccumulator, "ucode/repo/build_report_accumulator"
22
23
  autoload :BuildReportWriter, "ucode/repo/build_report_writer"
23
24
  autoload :BuildValidator, "ucode/repo/build_validator"
data/lib/ucode/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ucode
4
- VERSION = "0.1.1"
4
+ VERSION = "0.2.1"
5
5
  end
data/lib/ucode.rb CHANGED
@@ -30,11 +30,13 @@ module Ucode
30
30
  autoload :DatabaseMissingError, "ucode/error"
31
31
  autoload :DatabaseSchemaError, "ucode/error"
32
32
  autoload :UnknownVersionError, "ucode/error"
33
+ autoload :UnknownBlockError, "ucode/error"
33
34
  autoload :GlyphError, "ucode/error"
34
35
  autoload :PdfRenderError, "ucode/error"
35
36
  autoload :GridDetectionError, "ucode/error"
36
37
  autoload :LastResortMissingError, "ucode/error"
37
38
  autoload :EmbeddedFontsMissingError, "ucode/error"
39
+ autoload :CodeChartNotFoundError, "ucode/error"
38
40
 
39
41
  # Infrastructure
40
42
  autoload :Cache, "ucode/cache"
@@ -54,6 +56,7 @@ module Ucode
54
56
  autoload :Repo, "ucode/repo"
55
57
  autoload :Glyphs, "ucode/glyphs"
56
58
  autoload :Audit, "ucode/audit"
59
+ autoload :CodeChart, "ucode/code_chart"
57
60
  autoload :Site, "ucode/site"
58
61
  autoload :Commands, "ucode/commands"
59
62
  autoload :Cli, "ucode/cli"
data/ucode.gemspec ADDED
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/ucode/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "ucode"
7
+ spec.version = Ucode::VERSION
8
+ spec.authors = ["Ribose Inc."]
9
+ spec.email = ["open.source@ribose.com"]
10
+
11
+ spec.summary = "Unicode Character Database toolkit — lookup, dataset, glyphs, site"
12
+ spec.description = <<~DESC
13
+ ucode turns the Unicode Character Database (UCD) text files and the official
14
+ Unicode Code Charts into a structured, browsable dataset. For every assigned
15
+ codepoint it produces a JSON document with full UCD properties, the
16
+ human-curated relationships from NamesList.txt, Unihan readings, and
17
+ machine-computed references; an SVG of the official glyph vector-extracted
18
+ from the Code Charts; and a Vitepress site for browsing Plane, Block,
19
+ and Character.
20
+ DESC
21
+
22
+ spec.homepage = "https://github.com/fontist/ucode"
23
+ spec.license = "BSD-2-Clause"
24
+ spec.required_ruby_version = ">= 3.2.0"
25
+
26
+ spec.metadata["homepage_uri"] = spec.homepage
27
+ spec.metadata["source_code_uri"] = "https://github.com/fontist/ucode"
28
+ spec.metadata["changelog_uri"] = "https://github.com/fontist/ucode/blob/main/CHANGELOG.md"
29
+ spec.metadata["rubygems_mfa_required"] = "true"
30
+
31
+ spec.files = Dir.chdir(__dir__) do
32
+ `git ls-files -z`.split("\x0").reject do |f|
33
+ f == __FILE__ ||
34
+ f.start_with?(".") ||
35
+ f.start_with?("spec/") ||
36
+ f.start_with?("benchmark/") ||
37
+ f.start_with?("TODO.impl/") ||
38
+ f.start_with?("docs/") ||
39
+ f.start_with?("site/")
40
+ end
41
+ end
42
+
43
+ spec.bindir = "exe"
44
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
45
+ spec.require_paths = ["lib"]
46
+
47
+ spec.add_dependency "base64"
48
+ spec.add_dependency "fontisan", "~> 0.2"
49
+ spec.add_dependency "fontist", "~> 3.0"
50
+ spec.add_dependency "logger"
51
+ spec.add_dependency "lutaml-model", "~> 0.8"
52
+ spec.add_dependency "nokogiri", "~> 1.16"
53
+ spec.add_dependency "rubyzip", "~> 2.3"
54
+ spec.add_dependency "sqlite3", "~> 2.0"
55
+ spec.add_dependency "thor", "~> 1.3"
56
+ end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ucode
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
+ autorequire:
8
9
  bindir: exe
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-06-30 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: base64
@@ -153,9 +154,16 @@ files:
153
154
  - CHANGELOG.md
154
155
  - CLAUDE.md
155
156
  - Gemfile
156
- - Gemfile.lock
157
157
  - README.md
158
158
  - Rakefile
159
+ - TODO.extract-code-chart/01-pdf-fetch-validation.md
160
+ - TODO.extract-code-chart/02-block-name-resolver.md
161
+ - TODO.extract-code-chart/03-codechart-namespace.md
162
+ - TODO.extract-code-chart/04-codechart-extractor.md
163
+ - TODO.extract-code-chart/05-provenance-and-sidecar.md
164
+ - TODO.extract-code-chart/06-codechart-writer.md
165
+ - TODO.extract-code-chart/07-codechart-cli.md
166
+ - TODO.extract-code-chart/08-specs.md
159
167
  - TODO.full/00-README.md
160
168
  - TODO.full/01-panglyph-vision.md
161
169
  - TODO.full/02-panglyph-repo-bootstrap.md
@@ -282,6 +290,7 @@ files:
282
290
  - lib/ucode/audit/library_aggregator.rb
283
291
  - lib/ucode/audit/library_auditor.rb
284
292
  - lib/ucode/audit/plane_aggregator.rb
293
+ - lib/ucode/audit/reference_factory.rb
285
294
  - lib/ucode/audit/registry.rb
286
295
  - lib/ucode/audit/release.rb
287
296
  - lib/ucode/audit/release/emitter.rb
@@ -294,6 +303,11 @@ files:
294
303
  - lib/ucode/audit/universal_set_reference.rb
295
304
  - lib/ucode/cache.rb
296
305
  - lib/ucode/cli.rb
306
+ - lib/ucode/code_chart.rb
307
+ - lib/ucode/code_chart/extractor.rb
308
+ - lib/ucode/code_chart/provenance.rb
309
+ - lib/ucode/code_chart/sidecar.rb
310
+ - lib/ucode/code_chart/writer.rb
297
311
  - lib/ucode/commands.rb
298
312
  - lib/ucode/commands/audit.rb
299
313
  - lib/ucode/commands/audit/browser_command.rb
@@ -301,7 +315,6 @@ files:
301
315
  - lib/ucode/commands/audit/compare_command.rb
302
316
  - lib/ucode/commands/audit/font_command.rb
303
317
  - lib/ucode/commands/audit/library_command.rb
304
- - lib/ucode/commands/audit/reference_builder.rb
305
318
  - lib/ucode/commands/block_feed.rb
306
319
  - lib/ucode/commands/build.rb
307
320
  - lib/ucode/commands/cache.rb
@@ -357,6 +370,7 @@ files:
357
370
  - lib/ucode/glyphs/pdf2svg_renderer.rb
358
371
  - lib/ucode/glyphs/pdf_fetcher.rb
359
372
  - lib/ucode/glyphs/pdftocairo_renderer.rb
373
+ - lib/ucode/glyphs/pipeline.rb
360
374
  - lib/ucode/glyphs/real_fonts.rb
361
375
  - lib/ucode/glyphs/real_fonts/block_coverage.rb
362
376
  - lib/ucode/glyphs/real_fonts/cmap_cache.rb
@@ -499,6 +513,15 @@ files:
499
513
  - lib/ucode/repo/build_validator.rb
500
514
  - lib/ucode/repo/codepoint_writer.rb
501
515
  - lib/ucode/repo/paths.rb
516
+ - lib/ucode/repo/writers.rb
517
+ - lib/ucode/repo/writers/blocks_writer.rb
518
+ - lib/ucode/repo/writers/enums_writer.rb
519
+ - lib/ucode/repo/writers/indexes_writer.rb
520
+ - lib/ucode/repo/writers/manifest_writer.rb
521
+ - lib/ucode/repo/writers/named_sequences_writer.rb
522
+ - lib/ucode/repo/writers/planes_writer.rb
523
+ - lib/ucode/repo/writers/relationships_writer.rb
524
+ - lib/ucode/repo/writers/scripts_writer.rb
502
525
  - lib/ucode/site.rb
503
526
  - lib/ucode/site/config_emitter.rb
504
527
  - lib/ucode/site/generator.rb
@@ -517,6 +540,7 @@ files:
517
540
  - lib/ucode/version.rb
518
541
  - lib/ucode/version_resolver.rb
519
542
  - schema/block-feed.output.schema.yml
543
+ - ucode.gemspec
520
544
  homepage: https://github.com/fontist/ucode
521
545
  licenses:
522
546
  - BSD-2-Clause
@@ -525,6 +549,7 @@ metadata:
525
549
  source_code_uri: https://github.com/fontist/ucode
526
550
  changelog_uri: https://github.com/fontist/ucode/blob/main/CHANGELOG.md
527
551
  rubygems_mfa_required: 'true'
552
+ post_install_message:
528
553
  rdoc_options: []
529
554
  require_paths:
530
555
  - lib
@@ -539,7 +564,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
539
564
  - !ruby/object:Gem::Version
540
565
  version: '0'
541
566
  requirements: []
542
- rubygems_version: 3.6.9
567
+ rubygems_version: 3.5.22
568
+ signing_key:
543
569
  specification_version: 4
544
570
  summary: Unicode Character Database toolkit — lookup, dataset, glyphs, site
545
571
  test_files: []