grape-swagger-rails 2.0.0 → 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.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrapeSwaggerRails
4
- VERSION = '2.0.0'
5
- SWAGGER_UI_VERSION = '5.33.0'
4
+ VERSION = '2.0.1'
5
+ SWAGGER_UI_VERSION = '5.33.2'
6
6
  end
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # Prints a pull request body listing the upstream Swagger UI releases after
5
+ # FROM_VERSION up to and including TO_VERSION. Requires an authenticated `gh`.
6
+
7
+ require 'json'
8
+ require 'open3'
9
+ require 'rubygems'
10
+
11
+ REPO = 'swagger-api/swagger-ui'
12
+ # GitHub rejects pull request bodies over 65536 characters.
13
+ MAX_BODY = 60_000
14
+
15
+ from_version = Gem::Version.new(ENV.fetch('FROM_VERSION').delete_prefix('v'))
16
+ to_version = Gem::Version.new(ENV.fetch('TO_VERSION').delete_prefix('v'))
17
+
18
+ output, status = Open3.capture2('gh', 'api', '--paginate', "repos/#{REPO}/releases?per_page=100", '--jq', '.[]')
19
+ abort "Could not list #{REPO} releases." unless status.success?
20
+
21
+ releases = output.each_line.map { |line| JSON.parse(line) }.select do |release|
22
+ next false if release['draft'] || release['prerelease']
23
+
24
+ version = Gem::Version.new(release['tag_name'].delete_prefix('v'))
25
+ version > from_version && version <= to_version
26
+ rescue ArgumentError
27
+ false
28
+ end
29
+ releases.sort_by! { |release| Gem::Version.new(release['tag_name'].delete_prefix('v')) }.reverse!
30
+
31
+ # Upstream heading levels vary between releases; nest the release title and its sections under "Swagger UI changes".
32
+ def nest_headings(body)
33
+ title = true
34
+ body.gsub(/^#+ /) do
35
+ heading = title ? '### ' : '#### '
36
+ title = false
37
+ heading
38
+ end
39
+ end
40
+
41
+ def format_notes(release)
42
+ body = release['body'].to_s.gsub("\r\n", "\n").gsub(/\n{3,}/, "\n\n").strip
43
+ return "### [#{release['tag_name']}](#{release['html_url']})\n\nNo release notes." if body.empty?
44
+
45
+ # Avoid pinging upstream contributors.
46
+ nest_headings(body).gsub(%r{(?<![\w`\[/])@([\w-]+)}, '`@\1`')
47
+ end
48
+
49
+ compare_url = "https://github.com/#{REPO}/compare/v#{from_version}...v#{to_version}"
50
+ body = <<~MARKDOWN
51
+ Updates bundled Swagger UI assets from `v#{from_version}` to `v#{to_version}` ([compare](#{compare_url})).
52
+
53
+ Generated by the scheduled Swagger UI update workflow.
54
+
55
+ ## Swagger UI changes
56
+ MARKDOWN
57
+
58
+ if releases.empty?
59
+ body << "\nNo release notes found. See the [compare view](#{compare_url}).\n"
60
+ else
61
+ releases.each do |release|
62
+ notes = "\n#{format_notes(release)}\n"
63
+ if body.length + notes.length > MAX_BODY
64
+ body << "\nRelease notes truncated. See the [compare view](#{compare_url}) for the rest.\n"
65
+ break
66
+ end
67
+ body << notes
68
+ end
69
+ end
70
+
71
+ puts body
@@ -4,7 +4,8 @@
4
4
  path = ENV.fetch('CHANGELOG_PATH', 'CHANGELOG.md')
5
5
  number = ENV.fetch('PR_NUMBER')
6
6
  url = ENV.fetch('PR_URL')
7
- author = ENV.fetch('PR_AUTHOR')
7
+ # danger-changelog only accepts [\w-]+ author names, so `github-actions[bot]` becomes `github-actions`.
8
+ author = ENV.fetch('PR_AUTHOR').delete_suffix('[bot]')
8
9
  author_url = ENV.fetch('PR_AUTHOR_URL')
9
10
  title = ENV.fetch('PR_TITLE').gsub(/\s+/, ' ').strip.sub(/\.+\z/, '')
10
11
  title = title.gsub(/([\[\]])/, '\\\\\1')
@@ -12,7 +13,13 @@ title = title.gsub(/([\[\]])/, '\\\\\1')
12
13
  entry = "* [##{number}](#{url}): #{title} - [@#{author}](#{author_url})."
13
14
  changelog = File.read(path)
14
15
 
15
- exit if changelog.lines.any? { |line| line.start_with?("* [##{number}](") }
16
+ existing = changelog.lines.find { |line| line.start_with?("* [##{number}](") }
17
+ if existing
18
+ # Leave hand-edited entries alone; only repair ones Danger would reject.
19
+ exit if existing.match?(%r{ - \[@[\w-]+\]\(https://github\.com/\S*[\w-]\)\.$})
20
+ File.write(path, changelog.sub(existing, "#{entry}\n"))
21
+ exit
22
+ end
16
23
 
17
24
  next_release = /^### Next Release\s*$/
18
25
  placeholder = /^\* Your contribution here\.\s*$/
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-swagger-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Logunov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-10-02 00:00:00.000000000 Z
11
+ date: 2026-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: haml-rails
@@ -142,6 +142,7 @@ files:
142
142
  - lib/script/rails
143
143
  - lib/tasks/swagger_ui.rake
144
144
  - package.json
145
+ - script/swagger_ui_release_notes
145
146
  - script/update_changelog
146
147
  - spec/dummy/.gitignore
147
148
  - spec/dummy/Rakefile
@@ -191,7 +192,7 @@ licenses:
191
192
  metadata:
192
193
  bug_tracker_uri: https://github.com/ruby-grape/grape-swagger-rails/issues
193
194
  changelog_uri: https://github.com/ruby-grape/grape-swagger-rails/blob/master/CHANGELOG.md
194
- source_code_uri: https://github.com/ruby-grape/grape-swagger-rails/tree/v2.0.0
195
+ source_code_uri: https://github.com/ruby-grape/grape-swagger-rails/tree/v2.0.1
195
196
  rubygems_mfa_required: 'true'
196
197
  post_install_message:
197
198
  rdoc_options: []