Skip to content

Commit e07f3d4

Browse files
committed
Build docs/api via Rake
1 parent 258d690 commit e07f3d4

147 files changed

Lines changed: 550 additions & 91673 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
_site
22
mruby
3+
/docs/api/
34
/.bundle/
45
/vendor/
56
.worktrees

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
source 'https://rubygems.org'
22

3+
gem 'rake'
34
gem 'github-pages', group: :jekyll_plugins
45

56
group :jekyll_plugins do

Gemfile.lock

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ GEM
258258
track_open_instances (~> 0.1)
259259
public_suffix (5.1.1)
260260
racc (1.8.1)
261+
rake (13.3.1)
261262
rb-fsevent (0.11.2)
262263
rb-inotify (0.11.1)
263264
ffi (~> 1.0)
@@ -304,6 +305,7 @@ DEPENDENCIES
304305
jekyll-feed
305306
jekyll-sitemap
306307
mgem
308+
rake
307309
yard-coderay
308310
yard-mruby
309311

Rakefile

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
namespace :gen do
2+
desc 'Regenerate mrbgem library data (_data/mgems.yml)'
3+
task :mgemdata do
4+
require 'mgem'
5+
require 'yaml'
6+
7+
class File
8+
class << self
9+
alias_method :exists?, :exist? unless method_defined?(:exists?)
10+
end
11+
end
12+
13+
include Mrbgem
14+
mgems = load_gems
15+
mgems.update!
16+
17+
mgem_info = mgems.map do |mgem|
18+
{
19+
'name' => mgem.name,
20+
'description' => mgem.description,
21+
'author' => mgem.author,
22+
'website' => mgem.website,
23+
'protocol' => mgem.protocol,
24+
'repository' => mgem.repository,
25+
'repooptions' => mgem.repooptions
26+
}
27+
end
28+
29+
mgem_info.sort_by! { |g| g['name'].downcase }
30+
31+
File.open('_data/mgems.yml', 'w') { |f| f.write(mgem_info.to_yaml) }
32+
puts 'Written _data/mgems.yml'
33+
end
34+
35+
desc 'Regenerate API documentation from mruby source (clones latest release into mruby/)'
36+
task :mrbdoc do
37+
require 'json'
38+
39+
# Resolve latest stable release tag via gh CLI (mruby uses tags, not GitHub Releases)
40+
tags = JSON.parse(`gh api 'repos/mruby/mruby/tags?per_page=100'`)
41+
tag = tags.map { |t| t['name'] }.find { |n| n.match?(/^\d+\.\d+\.\d+$/) }
42+
raise "Could not determine latest stable mruby release tag" unless tag
43+
puts "Latest mruby release: #{tag}"
44+
45+
# Clone mruby at the release tag (or skip if already at the right version)
46+
mruby_dir = File.join(__dir__, 'mruby')
47+
if Dir.exist?(mruby_dir)
48+
current_tag = `git -C #{mruby_dir} describe --exact-match HEAD 2>/dev/null`.strip
49+
if current_tag == tag
50+
puts "mruby #{tag} already cloned, skipping clone"
51+
else
52+
puts "mruby dir exists at #{current_tag.empty? ? 'unknown version' : current_tag}, re-cloning at #{tag}"
53+
FileUtils.rm_rf(mruby_dir)
54+
sh "git clone --depth 1 --branch #{tag} https://github.com/mruby/mruby.git #{mruby_dir}"
55+
end
56+
else
57+
sh "git clone --depth 1 --branch #{tag} https://github.com/mruby/mruby.git #{mruby_dir}"
58+
end
59+
60+
# Run mrbdoc (from yard-mruby) in the mruby directory — equivalent to doc:api
61+
Dir.chdir(mruby_dir) do
62+
sh "BUNDLE_GEMFILE=#{__dir__}/Gemfile bundle exec mrbdoc"
63+
end
64+
65+
# Copy generated docs into our docs/api/ directory
66+
dest = File.join(__dir__, 'docs', 'api')
67+
FileUtils.mkdir_p(dest)
68+
FileUtils.cp_r(Dir.glob("#{mruby_dir}/doc/api/*"), dest)
69+
puts "Copied mruby API docs to docs/api/"
70+
end
71+
72+
desc 'Regenerate release data from GitHub API (_data/releases.yml)'
73+
task :releasedata do
74+
require 'json'
75+
require 'shellwords'
76+
require 'yaml'
77+
78+
repo = 'mruby/mruby'
79+
data_file = File.join(__dir__, '_data', 'releases.yml')
80+
81+
gh_api = lambda { |path| JSON.parse(`gh api #{Shellwords.escape(path)}`) }
82+
83+
post_dates = {}
84+
Dir.glob(File.join(__dir__, '_posts', '*.{markdown,md}')).each do |f|
85+
if (m = File.basename(f).match(/^(\d{4}-\d{2}-\d{2})-mruby-([\d.]+)-released/))
86+
post_dates[m[2]] = m[1]
87+
end
88+
end
89+
90+
tags = []
91+
page = 1
92+
loop do
93+
batch = gh_api.call("/repos/#{repo}/tags?per_page=100&page=#{page}")
94+
break if batch.empty?
95+
tags.concat(batch)
96+
break if batch.size < 100
97+
page += 1
98+
end
99+
100+
versioned = tags.select { |t| t['name'].match?(/^\d/) }
101+
102+
releases = versioned.map do |tag|
103+
version = tag['name']
104+
prerelease = !version.match?(/^\d+\.\d+\.\d+$/)
105+
date = post_dates[version] || begin
106+
commit = gh_api.call("/repos/#{repo}/commits/#{tag['commit']['sha']}")
107+
commit.dig('commit', 'committer', 'date')&.slice(0, 10)
108+
end
109+
puts " #{version}: #{date}#{' (prerelease)' if prerelease}"
110+
{ 'version' => version, 'date' => date, 'prerelease' => prerelease }
111+
end
112+
113+
File.write(data_file, releases.to_yaml)
114+
puts "\nWritten #{releases.size} releases to #{data_file}"
115+
end
116+
end
117+
118+
desc 'Build the Jekyll site'
119+
task build: %w[gen:mgemdata gen:mrbdoc gen:releasedata] do
120+
sh 'bundle exec jekyll build'
121+
end
122+
123+
desc 'Serve the Jekyll site locally with live reload'
124+
task :serve do
125+
sh 'bundle exec jekyll serve'
126+
end
127+
128+
task default: :build

0 commit comments

Comments
 (0)