From 18fcafa1fdf151257d1fced3e55a64f2a2234e6d Mon Sep 17 00:00:00 2001 From: 0x1eef <0x1eef@protonmail.com> Date: Wed, 7 Feb 2024 19:39:42 -0300 Subject: [PATCH] Add tooling for gem releases --- .gitignore | 4 +- Rakefile.rb | 19 ++++++ rakelib/builders.rb | 73 +++++++++++++++++++++ twenty-backend/twenty-backend.gemspec.erb | 21 ++++++ twenty-cli/twenty-cli.gemspec | 7 +- twenty-cli/twenty-cli.gemspec.erb | 26 ++++++++ twenty-frontend/twenty-frontend.gemspec.erb | 17 +++++ twenty.rb.gemspec | 19 ++++++ twenty.rb.gemspec.erb | 19 ++++++ 9 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 Rakefile.rb create mode 100644 rakelib/builders.rb create mode 100644 twenty-backend/twenty-backend.gemspec.erb create mode 100644 twenty-cli/twenty-cli.gemspec.erb create mode 100644 twenty-frontend/twenty-frontend.gemspec.erb create mode 100644 twenty.rb.gemspec create mode 100644 twenty.rb.gemspec.erb diff --git a/.gitignore b/.gitignore index 68fecea..598b43b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ *.gem -.localgems/ +.gems/ .bundle Gemfile.lock .yardoc/ @@ -7,3 +7,5 @@ Gemfile.lock .doc/ pkg/ .gems/ +stage/ +packages/ diff --git a/Rakefile.rb b/Rakefile.rb new file mode 100644 index 0000000..05f4cde --- /dev/null +++ b/Rakefile.rb @@ -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 + diff --git a/rakelib/builders.rb b/rakelib/builders.rb new file mode 100644 index 0000000..8e00117 --- /dev/null +++ b/rakelib/builders.rb @@ -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 diff --git a/twenty-backend/twenty-backend.gemspec.erb b/twenty-backend/twenty-backend.gemspec.erb new file mode 100644 index 0000000..27a67b0 --- /dev/null +++ b/twenty-backend/twenty-backend.gemspec.erb @@ -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 diff --git a/twenty-cli/twenty-cli.gemspec b/twenty-cli/twenty-cli.gemspec index 5e842e7..43d494d 100644 --- a/twenty-cli/twenty-cli.gemspec +++ b/twenty-cli/twenty-cli.gemspec @@ -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 diff --git a/twenty-cli/twenty-cli.gemspec.erb b/twenty-cli/twenty-cli.gemspec.erb new file mode 100644 index 0000000..0822d36 --- /dev/null +++ b/twenty-cli/twenty-cli.gemspec.erb @@ -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 diff --git a/twenty-frontend/twenty-frontend.gemspec.erb b/twenty-frontend/twenty-frontend.gemspec.erb new file mode 100644 index 0000000..4f1b1de --- /dev/null +++ b/twenty-frontend/twenty-frontend.gemspec.erb @@ -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 diff --git a/twenty.rb.gemspec b/twenty.rb.gemspec new file mode 100644 index 0000000..3e85893 --- /dev/null +++ b/twenty.rb.gemspec @@ -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 diff --git a/twenty.rb.gemspec.erb b/twenty.rb.gemspec.erb new file mode 100644 index 0000000..d1ee487 --- /dev/null +++ b/twenty.rb.gemspec.erb @@ -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