Add tooling for gem releases

This commit is contained in:
0x1eef 2024-02-07 19:39:42 -03:00
parent d0494a559c
commit 18fcafa1fd
9 changed files with 203 additions and 2 deletions

4
.gitignore vendored
View file

@ -1,5 +1,5 @@
*.gem
.localgems/
.gems/
.bundle
Gemfile.lock
.yardoc/
@ -7,3 +7,5 @@ Gemfile.lock
.doc/
pkg/
.gems/
stage/
packages/

19
Rakefile.rb Normal file
View file

@ -0,0 +1,19 @@
require_relative "rakelib/builders"
namespace :gem do
task :gemspec, [:version] do |t, args|
GemSpec.call(args[:version])
end
task :copy, [:version] => [:gemspec] do |t, args|
Copy.call(args[:version])
end
task :build, [:version] => [:copy] do |t, args|
Build.call(args[:version])
end
task :deploy, [:version] => [:build] do |t, args|
Deploy.call(args[:version])
end
end

73
rakelib/builders.rb Normal file
View file

@ -0,0 +1,73 @@
class Builder
ROOTDIR = Dir.getwd
STAGEDIR = File.join(ROOTDIR, "stage")
PKGDIR = File.join(ROOTDIR, "pkgs")
PARENT = "twenty.rb"
CHILDREN = %w[twenty-cli twenty-backend twenty-frontend]
include FileUtils
def self.call(...)
new.call(...)
end
end
class GemSpec < Builder
require "erb"
def call(version)
[PARENT, *CHILDREN].each do |node|
path = find_path(node)
spec = ERB.new(File.binread(path)).result_with_hash({version:})
File.binwrite File.join(File.dirname(path), "#{node}.gemspec"), spec
end
end
private
def find_path(node)
if node == PARENT
File.join(Dir.getwd, "#{node}.gemspec.erb")
else
File.join(Dir.getwd,node, "#{node}.gemspec.erb")
end
end
end
class Copy < Builder
def call(version)
[PARENT, *CHILDREN].each do
dest = File.join(STAGEDIR, version, _1)
mkdir_p(dest)
if _1 == PARENT
sh "cp -fv *.gemspec #{dest}"
sh "cp -Rfv lib/ #{dest}"
else
sh "cp -Rfv #{_1}/* #{dest}"
end
sh "find #{dest} -type d -exec chmod u=rwx,g=rx,o=rx {} +"
sh "find #{dest} -type f -exec chmod u=rw,g=r,o=r {} +"
end
end
end
class Build < Builder
def call(version)
dest = File.join(PKGDIR, version)
mkdir_p(dest)
[*CHILDREN, PARENT].each do |gem|
Dir.chdir(File.join(STAGEDIR, version, gem)) do
sh "gem build #{gem}.gemspec"
sh "mv #{gem}-#{version}.gem #{dest}"
end
end
end
end
class Deploy < Builder
def call(version)
Dir.chdir File.join(PKGDIR, version) do
[*CHILDREN, PARENT].each do |gem|
sh "gem push #{gem}-#{version}.gem"
end
end
end
end

View file

@ -0,0 +1,21 @@
# frozen_string_literal: true
Gem::Specification.new do |gem|
gem.name = "twenty-backend"
gem.authors = ["0x1eef"]
gem.email = ["0x1eef@protonmail.com"]
gem.homepage = "https://github.com/0x1eef/twenty#readme"
gem.version = "<%= version %>"
gem.licenses = ["0BSD"]
gem.files = `git ls-files`.split($/)
gem.require_paths = ["lib"]
gem.summary = "twenty: backend"
gem.description = gem.summary
gem.add_runtime_dependency "activerecord", "~> 7.1"
gem.add_runtime_dependency "sqlite3", "~> 1.6"
gem.add_runtime_dependency "webrick", "~> 1.8"
gem.add_runtime_dependency "graphql", "~> 2.2"
gem.add_development_dependency "test-unit", "~> 3.5.7"
gem.add_development_dependency "standard", "~> 1.13"
gem.add_development_dependency "rake", "~> 13.1"
end

View file

@ -7,7 +7,12 @@ Gem::Specification.new do |gem|
gem.homepage = "https://github.com/0x1eef/twenty#readme"
gem.version = "0.1.0"
gem.licenses = ["0BSD"]
gem.files = `git ls-files`.split($/)
gem.files = [
*Dir.glob(File.join(__dir__, "lib", "*.rb")),
*Dir.glob(File.join(__dir__, "lib", "**", "*.rb")),
*Dir.glob(File.join(__dir__, "libexec", "**", "*")),
*Dir.glob(File.join(__dir__, "bin", "*"))
]
gem.require_paths = ["lib"]
gem.summary = "twenty: command-line interface"
gem.description = gem.summary

View file

@ -0,0 +1,26 @@
# frozen_string_literal: true
Gem::Specification.new do |gem|
gem.name = "twenty-cli"
gem.authors = ["0x1eef"]
gem.email = ["0x1eef@protonmail.com"]
gem.homepage = "https://github.com/0x1eef/twenty#readme"
gem.version = "<%= version %>"
gem.licenses = ["0BSD"]
gem.files = [
*Dir.glob(File.join(__dir__, "lib", "*.rb")),
*Dir.glob(File.join(__dir__, "lib", "**", "*.rb")),
*Dir.glob(File.join(__dir__, "libexec", "**", "*")),
*Dir.glob(File.join(__dir__, "bin", "*"))
]
gem.require_paths = ["lib"]
gem.summary = "twenty: command-line interface"
gem.description = gem.summary
gem.executables = "twenty"
gem.add_runtime_dependency "cmd.rb", "~> 0.2"
gem.add_development_dependency "test-unit", "~> 3.5.7"
gem.add_development_dependency "yard", "~> 0.9"
gem.add_development_dependency "redcarpet", "~> 3.5"
gem.add_development_dependency "standard", "~> 1.13"
gem.add_development_dependency "rake", "~> 13.1"
end

View file

@ -0,0 +1,17 @@
# frozen_string_literal: true
Gem::Specification.new do |gem|
gem.name = "twenty-frontend"
gem.authors = ["0x1eef"]
gem.email = ["0x1eef@protonmail.com"]
gem.homepage = "https://github.com/0x1eef/twenty#readme"
gem.version = "<%= version %>"
gem.licenses = ["0BSD"]
gem.files = File.binread(File.join(__dir__, "MANIFEST"))
.each_line
.flat_map { Dir.glob(_1.chomp) }
gem.require_paths = ["lib"]
gem.summary = "twenty: frontend"
gem.description = gem.summary
gem.add_development_dependency "rake", "~> 13.0"
end

19
twenty.rb.gemspec Normal file
View file

@ -0,0 +1,19 @@
# frozen_string_literal: true
Gem::Specification.new do |gem|
gem.name = "twenty.rb"
gem.authors = ["0x1eef"]
gem.email = ["0x1eef@protonmail.com"]
gem.homepage = "https://github.com/0x1eef/twenty#readme"
gem.version = "0.1.0"
gem.licenses = ["0BSD"]
gem.files = [
*Dir.glob(File.join(__dir__, "lib", "*.rb")),
*Dir.glob(File.join(__dir__, "lib", "**", "*.rb"))
]
gem.summary = "Minimal project management that runs on your computer"
gem.description = gem.summary
gem.add_runtime_dependency "twenty-backend", "~> 0.1"
gem.add_runtime_dependency "twenty-frontend", "~> 0.1"
gem.add_runtime_dependency "twenty-cli", "~> 0.1"
end

19
twenty.rb.gemspec.erb Normal file
View file

@ -0,0 +1,19 @@
# frozen_string_literal: true
Gem::Specification.new do |gem|
gem.name = "twenty.rb"
gem.authors = ["0x1eef"]
gem.email = ["0x1eef@protonmail.com"]
gem.homepage = "https://github.com/0x1eef/twenty#readme"
gem.version = "<%= version %>"
gem.licenses = ["0BSD"]
gem.files = [
*Dir.glob(File.join(__dir__, "lib", "*.rb")),
*Dir.glob(File.join(__dir__, "lib", "**", "*.rb"))
]
gem.summary = "Minimal project management that runs on your computer"
gem.description = gem.summary
gem.add_runtime_dependency "twenty-backend", "~> 0.1"
gem.add_runtime_dependency "twenty-frontend", "~> 0.1"
gem.add_runtime_dependency "twenty-cli", "~> 0.1"
end