1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
# frozen_string_literal: true
require 'rubocop/rake_task'
RuboCop::RakeTask.new(:rubocop)
def sub_sh(dir, cmd)
Bundler.with_original_env do
Dir.chdir(dir) do
puts "======= entering ./#{dir}/"
puts
sh(cmd)
puts
puts "======= exiting ./#{dir}/"
end
end
end
packages = %w[
nanoc
nanoc-core
nanoc-cli
nanoc-checking
nanoc-dart-sass
nanoc-deploying
nanoc-external
nanoc-live
nanoc-org-mode
nanoc-spec
nanoc-tilt
guard-nanoc
]
def name_sets(packages)
packages
.partition { |name| %w[nanoc nanoc-core nanoc-cli].include?(name) }
.map(&:sort)
end
packages.each do |package|
namespace(package.tr('-', '_')) do
desc "Build gem for #{package}"
task(:gem) { sub_sh(package, 'bundle exec rake gem') }
desc "Run tests for #{package}"
task(:test) { sub_sh(package, 'bundle exec rake test') }
desc "Run style checks for #{package}"
task(:rubocop) { sub_sh(package, 'bundle exec rake rubocop') }
end
end
desc 'Run tests for all packages'
task test: packages.map { |p| p.tr('-', '_') + ':test' }
desc 'Build gems all packages'
task gem: packages.map { |p| p.tr('-', '_') + ':gem' }
desc 'Print overview of which packages need a release'
task :needs_release do
tags = `git tags`.lines.map(&:chomp).map { |t| t.match?(/\A\d/) ? 'nanoc-v' + t : t }
tags_by_base_name = tags.group_by { |t| t[/\A.*(?=-v\d)/] }.select { |(base_name, _tags)| base_name }
versions_by_base_name = tags_by_base_name.transform_values { |list| list.map { |nv| nv.match(/\A.*-v(\d.*)/) }.compact.map { |m| Gem::Version.new(m[1]) } }
last_version_by_base_name = versions_by_base_name.transform_values(&:max)
name_length = name_sets(packages).flatten.map(&:size).max
name_sets(packages).each_with_index do |names, idx|
puts if idx.positive?
names.each do |name|
last_version = last_version_by_base_name[name]
if last_version
dir = name
tag = name == 'nanoc' ? last_version.to_s : name + '-v' + last_version.to_s
diff = `git diff --stat #{tag} #{dir}`
needs_release = diff.match?(/\d+ files changed/)
text = needs_release ? 'needs release' : 'up to date'
color = needs_release ? "\e[33m" : "\e[32m"
else
text = 'needs initial release'
color = "\e[31m"
end
puts(
format(
"%-#{name_length}s \e[1m%s%s\e[0m",
name,
color,
text,
),
)
end
end
end
desc 'Print overview of all packages and their versions'
task :summary do
versions = {}
dependencies = {}
packages.each do |name|
gemspec = Bundler.rubygems.find_name(name).first
dependencies[name] =
gemspec
.dependencies
.select { |d| d.name.match?(/nanoc/) }
versions[name] = gemspec.version
end
puts '━━━ VERSIONS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'
puts
name_length = versions.keys.map(&:size).max
name_sets(packages).each_with_index do |names, idx|
puts if idx.positive?
names.each do |name|
puts(format(" %#{name_length}s %s", name, versions[name]))
end
end
puts
puts '━━━ DEPENDENCIES ━━━━━━━━━━━━━━━━━━━━━━━━━━━━'
puts
name_sets(packages).flatten.each do |name|
puts(format(' %-s %s', name, '╌' * (40 - name.length)))
dependencies[name].sort_by(&:name).each do |dependency|
puts(format(" %-#{name_length}s %s", dependency.name, dependency.requirement))
end
puts
end
end
task default: %i[test rubocop]
|