Skip to content

Commit

Permalink
refactor(ruby): fix interface/test/autobuild (#141)
Browse files Browse the repository at this point in the history
  • Loading branch information
deciduously authored Jan 15, 2025
1 parent be439e7 commit 59e5573
Show file tree
Hide file tree
Showing 14 changed files with 324 additions and 89 deletions.
38 changes: 38 additions & 0 deletions packages/autobuild/ruby/tangram.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import * as std from "std" with { path: "../../std" };
import * as ruby from "ruby" with { path: "../../ruby" };
import { wrapScripts } from "../common";

export type Arg = {
build?: string;
env?: std.env.Arg;
host?: string;
source: tg.Directory;
};

export const plain = tg.target(async (arg: Arg) => {
const { build, env: envArg, host, source } = arg ?? {};

const env_ = envArg ?? std.env.arg(env({ build, host }), envArg);
const toolchain = await ruby.toolchain();
const interpreter = await toolchain.get("bin/ruby").then(tg.File.expect);
return wrapScripts({
directory: source,
extension: ".rb",
interpreter,
env: env_,
});
});

export default plain;

type EnvArg = {
build?: string | undefined;
host?: string | undefined;
};

export const env = tg.target(async (arg: EnvArg) => {
const { build: build_, host: host_ } = arg ?? {};
const host = host_ ?? (await std.triple.host());
const build = build_ ?? host;
return std.env(ruby.toolchain({ ...std.triple.rotate({ build, host }) }));
});
17 changes: 17 additions & 0 deletions packages/autobuild/tangram.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import * as cmake from "./cmake";
import * as go from "./go";
import * as js from "./js";
import * as python from "./python";
import * as ruby from "./ruby";
import * as rust from "./rust";

import ccAutotoolsTest from "./tests/cc-autotools" with { type: "directory" };
Expand All @@ -21,6 +22,7 @@ import pythonPlainTest from "./tests/python-plain" with { type: "directory" };
import pythonPyprojectTest from "./tests/python-pyproject" with {
type: "directory",
};
import rubyPlainTest from "./tests/ruby-plain" with { type: "directory" };
import rustCargoTest from "./tests/rust-cargo" with { type: "directory" };
import rustPlainTest from "./tests/rust-plain" with { type: "directory" };

Expand Down Expand Up @@ -73,6 +75,9 @@ export const build = tg.target(async (arg: Arg) => {
case "python-pyproject": {
return python.pyproject(arg_);
}
case "ruby-plain": {
return ruby.plain(arg_);
}
case "rust-cargo": {
return rust.cargo(arg_);
}
Expand Down Expand Up @@ -122,6 +127,9 @@ export const env = tg.target(async (arg: EnvArg) => {
case "python-pyproject": {
return python.env(arg_);
}
case "ruby-plain": {
return ruby.env(arg_);
}
case "rust-cargo":
case "rust-plain": {
return rust.env(arg_);
Expand All @@ -143,6 +151,7 @@ export type Kind =
| "python"
| "python-plain"
| "python-pyproject"
| "ruby-plain"
| "rust-cargo"
| "rust-plain";

Expand Down Expand Up @@ -171,6 +180,7 @@ export const detectKind = async (source: tg.Directory): Promise<Kind> => {
if (hasFile("go.mod") || hasDir("vendor")) return "go";

if (hasFileWithExtension(".py")) return "python-plain";
if (hasFileWithExtension(".rb")) return "ruby-plain";
if (hasFileWithExtension(".rs")) return "rust-plain";
if (hasFileWithExtension(".js")) return "js-plain";

Expand All @@ -185,6 +195,7 @@ export const test = tg.target(async () => {
"go",
"js-plain",
"python-plain",
"ruby-plain",
"rust-cargo",
"rust-plain",
];
Expand Down Expand Up @@ -230,6 +241,11 @@ const testParamaters = (): Record<Kind, TestFnArg> => {
tg`${buildOutput}/main.py`,
},
"python-pyproject": defaultTestArg,
"ruby-plain": {
...defaultTestArg,
testFile: (buildOutput: tg.Directory): Promise<tg.Template> =>
tg`${buildOutput}/main.rb`,
},
"rust-cargo": defaultTestArg,
"rust-plain": {
...defaultTestArg,
Expand All @@ -250,6 +266,7 @@ const testDirs = async (): Promise<Record<Kind, tg.Directory>> => {
python: pythonTest,
"python-plain": pythonPlainTest,
"python-pyproject": pythonPyprojectTest,
"ruby-plain": rubyPlainTest,
"rust-cargo": rustCargoTest,
"rust-plain": rustPlainTest,
};
Expand Down
8 changes: 8 additions & 0 deletions packages/autobuild/tests/ruby-gem/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/.bundle/
/.yardoc
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/
6 changes: 6 additions & 0 deletions packages/autobuild/tests/ruby-gem/Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# Specify your gem's dependencies in ruby-gem.gemspec
gemspec
35 changes: 35 additions & 0 deletions packages/autobuild/tests/ruby-gem/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Ruby::Gem

Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/ruby/gem`. To experiment with that code, run `bin/console` for an interactive prompt.

TODO: Delete this and the text above, and describe your gem

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'ruby-gem'
```

And then execute:

$ bundle

Or install it yourself as:

$ gem install ruby-gem

## Usage

TODO: Write usage instructions here

## Development

After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/ruby-gem.
2 changes: 2 additions & 0 deletions packages/autobuild/tests/ruby-gem/Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
require "bundler/gem_tasks"
task :default => :spec
14 changes: 14 additions & 0 deletions packages/autobuild/tests/ruby-gem/bin/console
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env ruby

require "bundler/setup"
require "ruby/gem"

# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.

# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start

require "irb"
IRB.start(__FILE__)
8 changes: 8 additions & 0 deletions packages/autobuild/tests/ruby-gem/bin/setup
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
set -vx

bundle install

# Do any other automated setup that you need to do here
8 changes: 8 additions & 0 deletions packages/autobuild/tests/ruby-gem/lib/ruby/gem.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
require "ruby/gem/version"

module Ruby
module Gem
class Error < StandardError; end
# Your code goes here...
end
end
5 changes: 5 additions & 0 deletions packages/autobuild/tests/ruby-gem/lib/ruby/gem/version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module Ruby
module Gem
VERSION = "0.1.0"
end
end
40 changes: 40 additions & 0 deletions packages/autobuild/tests/ruby-gem/ruby-gem.gemspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@

lib = File.expand_path("../lib", __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "ruby/gem/version"

Gem::Specification.new do |spec|
spec.name = "ruby-gem"
spec.version = Ruby::Gem::VERSION
spec.authors = ["Ben Lovy"]
spec.email = ["[email protected]"]

spec.summary = %q{TODO: Write a short summary, because RubyGems requires one.}
spec.description = %q{TODO: Write a longer description or delete this line.}
spec.homepage = "TODO: Put your gem's website or public repo URL here."

# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
# to allow pushing to a single host or delete this section to allow pushing to any host.
if spec.respond_to?(:metadata)
spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"

spec.metadata["homepage_uri"] = spec.homepage
spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
else
raise "RubyGems 2.0 or newer is required to protect against " \
"public gem pushes."
end

# Specify which files should be added to the gem when it is released.
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
end
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]

spec.add_development_dependency "bundler", "~> 1.17"
spec.add_development_dependency "rake", "~> 10.0"
end
1 change: 1 addition & 0 deletions packages/autobuild/tests/ruby-plain/main.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
puts "Hello, world!"
29 changes: 15 additions & 14 deletions packages/ruby/bootstrap.tg.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
import * as std from "std" with { path: "../std" };
import { $ } from "std" with { path: "../std" };

/** Source code for the version of Ruby to bootstrap. Use 2.5.0, the earliest supported. */
export const source = tg.target(async () => {
const download = await std.download({
url: "https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.gz",
checksum:
"sha256:46e6f3630f1888eb653b15fa811d77b5b1df6fd7a3af436b343cfe4f4503f2ab",
});
tg.Directory.assert(download);
return tg.Directory.expect(await std.directory.unwrap(download));
return await std
.download({
url: "https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.gz",
checksum:
"sha256:46e6f3630f1888eb653b15fa811d77b5b1df6fd7a3af436b343cfe4f4503f2ab",
})
.then(tg.Directory.expect)
.then(std.directory.unwrap);
});

/** Returns an older version of Ruby that is only used to bootstrap it. */
export const ruby = tg.target(async (host: string) => {
const build = await $`
${source()}/configure --prefix $OUTPUT
make install
`
.env(std.sdk())
.then(tg.Directory.expect);
const build = await std.autotools.build({
env: {
CFLAGS: tg.Mutation.suffix("-Wno-implicit-function-declaration", " "),
},
host,
source: source(),
});

const { arch: hostArch, os: hostOs } = std.triple.components(host);
const rubylib = tg.Template.join(
Expand Down
Loading

0 comments on commit 59e5573

Please sign in to comment.