utopia-project 0.45.1 → 0.46.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: 33430162da3452b5ec4d04cd0f3321a69aee2875dc14e71de2d8c5729ef7d438
4
- data.tar.gz: 8e6e41d6ae55129bd98c3151c1282420ede8a048be23c3058224600e0d89e65e
3
+ metadata.gz: 4d35291268cc31c4024ff6d4200677f386fa498109864c54bfce893e8f508ece
4
+ data.tar.gz: ec9a466972478651161739435f9f2dba51af0c16c993d2890a58da49e0c4f297
5
5
  SHA512:
6
- metadata.gz: 42a182fd6ac02a2fb0b76df6641aabe909cc379e4cf770a88c315f6898993450f6cdb5a166801269c0315dae459de155e180d24a3bd55f4a3eb051f978b3ba98
7
- data.tar.gz: f22e1ab76faff8aecf949aba05033a948bd1cfd11ed6b57323036d71a6d83e533f7f2a257a4feeaf56bca546bdcd019ebb960694d19dc58cc8d18290750446ad
6
+ metadata.gz: 5de2b1d9065d36afda1ed73a20921cb634eb8046c72c317ad3c814421424599dcf3ebc1fd06dd68d92d9b79b1c36c427036c915cb6dbaa0c8743ea3680ba86e0
7
+ data.tar.gz: 718c11d9f1d680fdfa56a22ff1a3a56cd1631ce457b33b45b7ef718675d100b85df393f8c6eb547d9d4f1d0f6c2947bb21ec972d641db84348d3e317048572cf
checksums.yaml.gz.sig CHANGED
Binary file
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2025, by Samuel Williams.
4
+ # Copyright, 2025-2026, by Samuel Williams.
5
5
 
6
6
  def initialize(...)
7
7
  super
@@ -24,7 +24,7 @@ def update
24
24
  files << {
25
25
  "path" => guide.name + ".md",
26
26
  "title" => guide.title,
27
- "description" => guide.description.to_markdown.chomp,
27
+ "description" => guide.description&.to_markdown&.chomp || "",
28
28
  }
29
29
  end
30
30
 
@@ -121,8 +121,6 @@ def description(root: context.root)
121
121
  child = document.first_child
122
122
 
123
123
  if child&.type == :header
124
- title = child.first_child.string_content
125
-
126
124
  # First sentence
127
125
  if introduction = child.next
128
126
  $stdout.puts introduction.to_plaintext[/.*?\./]
@@ -123,11 +123,8 @@ When documenting advanced features, follow this structure:
123
123
  2. **Use Case Examples**: Provide concrete scenarios:
124
124
  - Business logic examples (user accounts, inventory, etc.)
125
125
  - Technical scenarios (performance, reliability, etc.)
126
- - Anti-patterns to avoid
127
126
 
128
127
  3. **Implementation**: Show practical code examples
129
- 4. **Best Practices**: When to use vs when not to use
130
- 5. **Common Pitfalls**: What to watch out for
131
128
 
132
129
  #### Template
133
130
 
@@ -142,14 +139,6 @@ Use [feature] when you need:
142
139
  - **[Third use case]**: [Brief explanation]
143
140
 
144
141
  [Implementation examples with practical scenarios]
145
-
146
- ### Best Practices
147
-
148
- [When to use this feature vs alternatives]
149
-
150
- ### Common Pitfalls
151
-
152
- [What to avoid and why]
153
142
  ```
154
143
 
155
144
  #### "Getting Started" Guide
@@ -233,6 +222,22 @@ Help users understand when to choose between alternatives:
233
222
 
234
223
  ## Code Examples in Guides
235
224
 
225
+ ### Inline Code
226
+
227
+ Use backticks for inline code. Markly supports a language prefix immediately before the opening backtick, with no space after the colon: `` ruby:`Object.new` ``.
228
+
229
+ ```markdown
230
+ Use ruby:`Object.new` to create an object.
231
+ ```
232
+
233
+ This renders as:
234
+
235
+ Use ruby:`Object.new` to create an object.
236
+
237
+ The language prefix enables syntax highlighting. When the code matches a definition in your project's documentation, `utopia-project` also links it to that definition. For example, `` ruby:`MyProject::MyClass` `` can link to the class documentation.
238
+
239
+ Use plain backticks for text that does not need a language, such as file paths and command names: `config/serve.rb` or `bundle`.
240
+
236
241
  ### Contextual Examples
237
242
 
238
243
  Every code example should demonstrate a realistic scenario, not abstract operations:
@@ -283,7 +288,7 @@ Following `utopia-project` guidelines, each guide should:
283
288
  1. **Start with clear purpose**: "This guide explains how to use X to solve Y problem"
284
289
  2. **Provide user context**: Explain why users would need this feature
285
290
  3. **Include practical examples**: Working code samples that demonstrate real scenarios
286
- 4. **Follow consistent structure**: Problem → Use Cases → Implementation → Best Practices
291
+ 4. **Follow consistent structure**: Problem → Use Cases → Implementation
287
292
  5. **Cross-reference appropriately**: Use ruby:`ClassName` for internal references
288
293
  6. **Include error handling**: Show how to handle common failure scenarios
289
294
  7. **Provide troubleshooting**: Common issues and solutions
@@ -296,5 +301,4 @@ Before publishing a guide section, verify:
296
301
  - [ ] Provides concrete use cases.
297
302
  - [ ] Shows realistic code examples.
298
303
  - [ ] Includes proper error handling.
299
- - [ ] Mentions when NOT to use the feature.
300
304
  - [ ] References related concepts appropriately.
@@ -107,12 +107,12 @@ module Utopia
107
107
  # @parameter definition [Decode::Definition] The definition to load documentation for.
108
108
  # @returns [Document | Nil] The supplemental document, if it exists.
109
109
  def document_for(definition)
110
- document_path = File.join("lib", definition.lexical_path.map{|_| _.to_s.downcase}) + ".md"
110
+ document_path = File.join(@root, "lib", definition.lexical_path.map{|_| _.to_s.downcase}) + ".md"
111
111
 
112
112
  if File.exist?(document_path)
113
113
  document = self.document(File.read(document_path), definition)
114
114
 
115
- if document.first_child.type == :header
115
+ if document.first_child&.type == :header
116
116
  document.first_child.delete
117
117
  end
118
118
 
@@ -33,12 +33,12 @@ module Utopia
33
33
  end
34
34
 
35
35
  # Extract the leading heading as the document title.
36
- # @returns [String | Nil] The title, if the document starts with a heading.
36
+ # @returns [String | Nil] The title, if the document starts with a non-empty heading.
37
37
  def title
38
38
  child = self.root.first_child
39
39
 
40
40
  if child && child.type == :header
41
- return child.first_child.to_plaintext
41
+ return child.first_child&.to_plaintext
42
42
  end
43
43
  end
44
44
 
@@ -61,7 +61,7 @@ module Utopia
61
61
  header = child
62
62
 
63
63
  # We found the matched header:
64
- if header.first_child.to_plaintext.include?(name)
64
+ if header.first_child&.to_plaintext&.include?(name)
65
65
  # Now subsequent children:
66
66
  current = header.next
67
67
 
@@ -44,32 +44,11 @@ module Utopia
44
44
  metadata[:order]
45
45
  end
46
46
 
47
- # Compare guides by explicit order and then by name.
47
+ # Compare guides by order (defaulting to zero) and then by name.
48
48
  # @parameter other [Guide] The other guide to compare.
49
49
  # @returns [Integer] The comparison result.
50
50
  def <=> other
51
- if order = self.order
52
- if other_order = other.order
53
- if order < other_order
54
- return -1
55
- elsif order > other_order
56
- return 1
57
- end
58
- else
59
- # If we have order, but the other doesn't, we come first:
60
- return -1
61
- end
62
- end
63
-
64
- if name = self.name
65
- if other_name = other.name
66
- return name <=> other_name
67
- else
68
- return -1
69
- end
70
- end
71
-
72
- return 0
51
+ [self.order || 0, self.name] <=> [other.order || 0, other.name]
73
52
  end
74
53
 
75
54
  README = "readme.md"
@@ -93,7 +72,7 @@ module Utopia
93
72
  child = document.first_child
94
73
 
95
74
  if child&.type == :header
96
- @title = child.first_child.string_content
75
+ @title = child.first_child&.string_content
97
76
 
98
77
  @description = child.next
99
78
  child.delete
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Utopia
7
7
  module Project
8
- VERSION = "0.45.1"
8
+ VERSION = "0.46.0"
9
9
  end
10
10
  end
data/license.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  Copyright, 2020-2026, by Samuel Williams.
4
4
  Copyright, 2020, by Olle Jonsson.
5
- Copyright, 2022-2023, by dependabot[bot].
6
5
  Copyright, 2023, by Michael Adams.
7
6
 
8
7
  Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2020-2025, by Samuel Williams.
4
+ # Copyright, 2020-2026, by Samuel Williams.
5
5
 
6
6
  prepend Actions
7
7
 
@@ -12,5 +12,7 @@ on "**/*/index" do |request, path|
12
12
  guide.name == name
13
13
  end
14
14
 
15
+ respond! Utopia::Response[404] unless @guide
16
+
15
17
  path.components = ["show"]
16
18
  end
data/pages/index.xnode CHANGED
@@ -3,12 +3,12 @@
3
3
  if document = self[:document]
4
4
  child = document.first_child
5
5
 
6
- if child.type == :header
6
+ if child&.type == :header
7
7
  header = child
8
8
  child.delete
9
9
  title = header.first_child
10
10
 
11
- case title.type
11
+ case title&.type
12
12
  when :text
13
13
  ?><content:heading>#{title.string_content}</content:heading><?r
14
14
  when :image
@@ -35,4 +35,4 @@
35
35
  <?r
36
36
  end
37
37
  ?>
38
- </content:page>
38
+ </content:page>
@@ -13,7 +13,7 @@ on "**/*/index" do |request, path|
13
13
  @node, @symbol = @base.lookup(@lexical_path)
14
14
 
15
15
  unless @symbol
16
- fail! :not_found
16
+ respond! Utopia::Response[404]
17
17
  end
18
18
 
19
19
  path.components = ["show"]
@@ -30,7 +30,7 @@ html {
30
30
  }
31
31
 
32
32
  p code {
33
- padding: 0 0.2rem;
33
+ padding: 0 0.2em;
34
34
  }
35
35
 
36
36
  p code:first-child, p code:last-child {
@@ -145,8 +145,8 @@ header .header-actions {
145
145
  header .sections a {
146
146
  text-decoration: none;
147
147
  color: var(--main-color);
148
- padding: 0.25rem 0.5rem;
149
- border-radius: 0.25rem;
148
+ padding: 0.25em 0.5em;
149
+ border-radius: 0.25em;
150
150
  white-space: nowrap;
151
151
  }
152
152
 
@@ -220,8 +220,8 @@ header .sections a:focus-visible,
220
220
  display: flex;
221
221
  align-items: center;
222
222
  flex-wrap: nowrap;
223
- gap: 0.125rem;
224
- padding: 0.25rem 0.5rem;
223
+ gap: 0.125em;
224
+ padding: 0.25em 0.5em;
225
225
  border-bottom: 1px solid var(--underlay-color);
226
226
  font-size: 0.9em;
227
227
  overflow-x: auto;
@@ -232,8 +232,8 @@ header .sections a:focus-visible,
232
232
  .subnav a {
233
233
  text-decoration: none;
234
234
  color: var(--main-color);
235
- padding: 0.15rem 0.5rem;
236
- border-radius: 0.25rem;
235
+ padding: 0.15em 0.5em;
236
+ border-radius: 0.25em;
237
237
  white-space: nowrap;
238
238
  }
239
239
 
@@ -248,8 +248,8 @@ header .sections a:focus-visible,
248
248
 
249
249
  .subnav.breadcrumb a + a::before {
250
250
  content: "::";
251
- margin-left: -0.5rem;
252
- margin-right: 0.5rem;
251
+ margin-left: -0.5em;
252
+ margin-right: 0.5em;
253
253
  opacity: 0.4;
254
254
  }
255
255
 
@@ -347,13 +347,13 @@ main {
347
347
  }
348
348
 
349
349
  .sidebar nav a {
350
- padding: 0.4rem 0.75rem;
350
+ padding: 0.4em 0.75em;
351
351
  font-size: 0.9rem;
352
352
  border-left: 3px solid transparent;
353
353
  color: var(--main-color);
354
354
  text-decoration: none;
355
355
  display: block;
356
- border-radius: 0.25rem;
356
+ border-radius: 0.25em;
357
357
  transition: background-color 0.15s, border-color 0.15s, color 0.15s;
358
358
  }
359
359
 
@@ -510,7 +510,7 @@ pre {
510
510
  details {
511
511
  margin: 1rem;
512
512
  border: 1px solid #aaa;
513
- border-radius: 0.5rem;
513
+ border-radius: 0.5em;
514
514
 
515
515
  padding: .5em .5em 0;
516
516
  }
@@ -522,18 +522,17 @@ summary > * {
522
522
 
523
523
  summary {
524
524
  font-weight: bold;
525
- margin: -.5rem -.5rem 0;
526
- padding: .5rem;
525
+ margin: -.5em -.5em 0;
526
+ padding: .5em;
527
527
  cursor: pointer;
528
528
  }
529
529
 
530
530
  details[open] {
531
- padding: .5rem;
531
+ padding: .5em;
532
532
  }
533
533
 
534
534
  details[open] summary {
535
535
  border-bottom: 1px solid #aaa;
536
- /* margin-bottom: .5rem; */
537
536
  }
538
537
 
539
538
  figure {
@@ -557,6 +556,9 @@ figure.youtube-wrapper iframe {
557
556
  }
558
557
 
559
558
  table {
559
+ display: block;
560
+ overflow-x: auto;
561
+
560
562
  width: 100%;
561
563
  margin: 1rem;
562
564
 
@@ -564,6 +566,14 @@ table {
564
566
  width: calc(100% - 2rem);
565
567
  }
566
568
 
569
+ table th, table td {
570
+ padding: 0.1em 0.4em;
571
+ }
572
+
573
+ table th:nth-child(even), table td:nth-child(even) {
574
+ background-color: color-mix(in srgb, var(--main-color) 2%, transparent);
575
+ }
576
+
567
577
  table thead {
568
578
  background-color: var(--header-color);
569
579
  border-bottom: 0.2rem solid var(--accent-color);
@@ -591,13 +601,13 @@ ul.pragmas li {
591
601
  border-radius: 0.5em;
592
602
 
593
603
  box-shadow: 0 0 2px #eee;
594
- padding: 0.1rem 0.2rem;
604
+ padding: 0.1em 0.2em;
595
605
 
596
606
  display: inline-block;
597
607
  }
598
608
 
599
609
  ul.pragmas li + li {
600
- margin-left: 0.5rem;
610
+ margin-left: 0.5em;
601
611
  }
602
612
 
603
613
  ul.pragmas li.public {
@@ -671,8 +681,8 @@ ul.pragmas li.asynchronous {
671
681
  color: var(--main-color);
672
682
  text-decoration: none;
673
683
  display: block;
674
- padding: 0.25rem 0.5rem;
675
- border-radius: 0.25rem;
684
+ padding: 0.25em 0.5em;
685
+ border-radius: 0.25em;
676
686
  transition: background-color 0.15s, border-color 0.15s, color 0.15s;
677
687
  }
678
688
 
@@ -730,13 +740,13 @@ ul.pragmas li.asynchronous {
730
740
 
731
741
  .sidebar nav a,
732
742
  .sidebar details nav a {
733
- padding: 0.4rem 0.75rem;
743
+ padding: 0.4em 0.75em;
734
744
  font-size: 0.9rem;
735
745
  border-left: 3px solid transparent;
736
746
  color: var(--main-color);
737
747
  text-decoration: none;
738
748
  display: block;
739
- border-radius: 0.25rem;
749
+ border-radius: 0.25em;
740
750
  transition: all 0.2s ease;
741
751
  }
742
752
 
@@ -746,7 +756,7 @@ ul.pragmas li.asynchronous {
746
756
  }
747
757
 
748
758
  .sidebar nav.compact a {
749
- padding: 0.25rem 0.5rem;
759
+ padding: 0.25em 0.5em;
750
760
  font-size: 0.85rem;
751
761
  line-height: 1.3;
752
762
  }
@@ -787,7 +797,7 @@ ul.pragmas li.asynchronous {
787
797
  .sidebar nav a:focus-visible {
788
798
  outline: 2px solid var(--accent-color);
789
799
  outline-offset: 2px;
790
- border-radius: 0.25rem;
800
+ border-radius: 0.25em;
791
801
  }
792
802
 
793
803
  /* Brief click feedback */
data/readme.md CHANGED
@@ -33,6 +33,17 @@ Please see the [project documentation](https://socketry.github.io/utopia-project
33
33
 
34
34
  Please see the [project releases](https://socketry.github.io/utopia-project/releases/index) for all releases.
35
35
 
36
+ ### v0.46.0
37
+
38
+ - Manage releases through GitHub pull requests and publish signed gems with RubyGems Trusted Publishing and attestations.
39
+ - Sort guides by order (defaulting to zero), then name.
40
+ - Fix supplemental documentation paths and missing guide/reference responses.
41
+ - Handle empty READMEs and guides without descriptions when rendering pages and generating agent context.
42
+ - Treat empty Markdown headings as missing titles and preserve the following content when rendering pages or updating documentation.
43
+ - Cover all Ruby, task, and rendered template lines, and exercise the generated site in Chromium at mobile and desktop widths in light and dark mode.
44
+ - Add padding to documentation table cells and allow tables to scroll whenever they exceed the available width.
45
+ - Scale table, inline code, badge, navigation link, and disclosure spacing with the local font size.
46
+
36
47
  ### v0.45.0
37
48
 
38
49
  - [Web Packages](https://socketry.github.io/utopia-project/releases/index#web-packages)
@@ -72,10 +83,6 @@ Please see the [project releases](https://socketry.github.io/utopia-project/rele
72
83
 
73
84
  - Fix schema for `index.yaml` context file.
74
85
 
75
- ### v0.34.0
76
-
77
- - Introduce `bake utopia:project:agent:context:update` command to update the agent context from the guides in the project.
78
-
79
86
  ## See Also
80
87
 
81
88
  - [Utopia](https://github.com/socketry/utopia) — The website framework which powers this web application.
@@ -101,12 +108,14 @@ $ bundle exec sus
101
108
 
102
109
  ### Making Releases
103
110
 
104
- To make a new release:
111
+ To prepare a release pull request:
105
112
 
106
113
  ``` bash
107
- $ bundle exec bake gem:release:patch # or minor or major
114
+ $ bundle exec bake gem:github:release:patch # or minor or major
108
115
  ```
109
116
 
117
+ See [bake-gem-github](https://github.com/socketry/bake-gem-github) for setup and publishing details.
118
+
110
119
  ### Developer Certificate of Origin
111
120
 
112
121
  In order to protect users of this project, we require all contributors to comply with the [Developer Certificate of Origin](https://developercertificate.org/). This ensures that all contributions are properly licensed and attributed.
data/releases.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changes
2
2
 
3
+ ## v0.46.0
4
+
5
+ - Manage releases through GitHub pull requests and publish signed gems with RubyGems Trusted Publishing and attestations.
6
+ - Sort guides by order (defaulting to zero), then name.
7
+ - Fix supplemental documentation paths and missing guide/reference responses.
8
+ - Handle empty READMEs and guides without descriptions when rendering pages and generating agent context.
9
+ - Treat empty Markdown headings as missing titles and preserve the following content when rendering pages or updating documentation.
10
+ - Cover all Ruby, task, and rendered template lines, and exercise the generated site in Chromium at mobile and desktop widths in light and dark mode.
11
+ - Add padding to documentation table cells and allow tables to scroll whenever they exceed the available width.
12
+ - Scale table, inline code, badge, navigation link, and disclosure spacing with the local font size.
13
+
3
14
  ## v0.45.0
4
15
 
5
16
  ### Web Packages
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: utopia-project
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.45.1
4
+ version: 0.46.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -12,32 +12,28 @@ bindir: bin
12
12
  cert_chain:
13
13
  - |
14
14
  -----BEGIN CERTIFICATE-----
15
- MIIE2DCCA0CgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMRgwFgYDVQQDDA9zYW11
16
- ZWwud2lsbGlhbXMxHTAbBgoJkiaJk/IsZAEZFg1vcmlvbnRyYW5zZmVyMRIwEAYK
17
- CZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJuejAeFw0yMjA4MDYwNDUz
18
- MjRaFw0zMjA4MDMwNDUzMjRaMGExGDAWBgNVBAMMD3NhbXVlbC53aWxsaWFtczEd
19
- MBsGCgmSJomT8ixkARkWDW9yaW9udHJhbnNmZXIxEjAQBgoJkiaJk/IsZAEZFgJj
20
- bzESMBAGCgmSJomT8ixkARkWAm56MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
21
- igKCAYEAomvSopQXQ24+9DBB6I6jxRI2auu3VVb4nOjmmHq7XWM4u3HL+pni63X2
22
- 9qZdoq9xt7H+RPbwL28LDpDNflYQXoOhoVhQ37Pjn9YDjl8/4/9xa9+NUpl9XDIW
23
- sGkaOY0eqsQm1pEWkHJr3zn/fxoKPZPfaJOglovdxf7dgsHz67Xgd/ka+Wo1YqoE
24
- e5AUKRwUuvaUaumAKgPH+4E4oiLXI4T1Ff5Q7xxv6yXvHuYtlMHhYfgNn8iiW8WN
25
- XibYXPNP7NtieSQqwR/xM6IRSoyXKuS+ZNGDPUUGk8RoiV/xvVN4LrVm9upSc0ss
26
- RZ6qwOQmXCo/lLcDUxJAgG95cPw//sI00tZan75VgsGzSWAOdjQpFM0l4dxvKwHn
27
- tUeT3ZsAgt0JnGqNm2Bkz81kG4A2hSyFZTFA8vZGhp+hz+8Q573tAR89y9YJBdYM
28
- zp0FM4zwMNEUwgfRzv1tEVVUEXmoFCyhzonUUw4nE4CFu/sE3ffhjKcXcY//qiSW
29
- xm4erY3XAgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
30
- BBYEFO9t7XWuFf2SKLmuijgqR4sGDlRsMC4GA1UdEQQnMCWBI3NhbXVlbC53aWxs
31
- aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWBI3NhbXVlbC53aWxs
32
- aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEBCwUAA4IBgQB5sxkE
33
- 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
- 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
- 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
- 8C/NCWgpIfzpHGJsjvmH2wAfKtTTqB9CVKLCWEnCHyCaRVuKkrKjqhYCdmMBqCws
37
- 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
- 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
- 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
- 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
41
37
  -----END CERTIFICATE-----
42
38
  date: 1980-01-02 00:00:00.000000000 Z
43
39
  dependencies:
@@ -430,7 +426,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
430
426
  - !ruby/object:Gem::Version
431
427
  version: '0'
432
428
  requirements: []
433
- rubygems_version: 4.0.10
429
+ rubygems_version: 4.0.21
434
430
  specification_version: 4
435
431
  summary: A project documentation tool based on Utopia.
436
432
  test_files: []
metadata.gz.sig CHANGED
Binary file