Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: CI

on:
push:
branches: [main, master]
pull_request:
branches: [main, master]

jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
ruby: ['3.2', '3.3']
steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
bundler-cache: true
- run: bundle exec rake test
- name: Upload coverage to Codecov
if: matrix.ruby == '3.3'
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: coverage/coverage.json
fail_ci_if_error: false
26 changes: 26 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Release

on:
push:
tags: ['v*']

jobs:
publish:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
- name: Verify version matches tag
run: |
TAG_VERSION="${GITHUB_REF#refs/tags/v}"
GEM_VERSION=$(ruby -e "require './lib/ast_transform/version'; puts ASTTransform::VERSION")
if [ "$TAG_VERSION" != "$GEM_VERSION" ]; then
echo "::error::Tag ($TAG_VERSION) does not match gem version ($GEM_VERSION)"
exit 1
fi
- uses: rubygems/release-gem@v1
28 changes: 0 additions & 28 deletions .travis.yml

This file was deleted.

96 changes: 35 additions & 61 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,89 +1,63 @@
PATH
remote: .
specs:
ast_transform (1.0.0)
parser (~> 2.5)
unparser (~> 0.4)
ast_transform (2.0.0)
parser (>= 3.0)
unparser (>= 0.6)

GEM
remote: https://rubygems.org/
specs:
abstract_type (0.0.7)
adamantium (0.2.0)
ice_nine (~> 0.11.0)
memoizable (~> 0.4.0)
ansi (1.5.0)
ast (2.4.1)
builder (3.2.4)
byebug (11.1.3)
ast (2.4.3)
builder (3.3.0)
coderay (1.1.3)
concord (0.1.5)
adamantium (~> 0.2.0)
equalizer (~> 0.0.9)
coveralls (0.8.23)
json (>= 1.8, < 3)
simplecov (~> 0.16.1)
term-ansicolor (~> 1.3)
thor (>= 0.19.4, < 2.0)
tins (~> 1.6)
diff-lcs (1.4.4)
docile (1.3.2)
equalizer (0.0.11)
ice_nine (0.11.2)
json (2.3.1)
memoizable (0.4.2)
thread_safe (~> 0.3, >= 0.3.1)
method_source (1.0.0)
minitest (5.14.1)
minitest-reporters (1.4.2)
diff-lcs (1.6.2)
docile (1.4.1)
io-console (0.8.2)
method_source (1.1.0)
minitest (5.27.0)
minitest-reporters (1.7.1)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
parser (2.7.1.4)
parser (3.3.10.2)
ast (~> 2.4.1)
procto (0.0.3)
pry (0.13.1)
racc
prism (1.9.0)
pry (0.16.0)
coderay (~> 1.1)
method_source (~> 1.0)
pry-byebug (3.9.0)
byebug (~> 11.0)
pry (~> 0.13.0)
rake (13.0.1)
ruby-progressbar (1.10.1)
simplecov (0.16.1)
reline (>= 0.6.0)
racc (1.8.1)
rake (13.3.1)
reline (0.6.3)
io-console (~> 0.5)
ruby-progressbar (1.13.0)
simplecov (0.22.0)
docile (~> 1.1)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.2)
sync (0.5.0)
term-ansicolor (1.7.1)
tins (~> 1.0)
thor (1.0.1)
thread_safe (0.3.6)
tins (1.25.0)
sync
unparser (0.4.7)
abstract_type (~> 0.0.7)
adamantium (~> 0.2.0)
concord (~> 0.1.5)
diff-lcs (~> 1.3)
equalizer (~> 0.0.9)
parser (>= 2.6.5)
procto (~> 0.0.2)
simplecov-html (~> 0.11)
simplecov_json_formatter (~> 0.1)
simplecov-html (0.13.2)
simplecov_json_formatter (0.1.4)
unparser (0.8.1)
diff-lcs (~> 1.6)
parser (>= 3.3.0)
prism (>= 1.5.1)

PLATFORMS
arm64-darwin-24
ruby

DEPENDENCIES
ast_transform!
bundler (~> 2.1)
coveralls (~> 0.8)
bundler (>= 2.1)
minitest (~> 5.14)
minitest-reporters (~> 1.4)
pry (~> 0.13)
pry-byebug (~> 3.9)
pry (>= 0.14)
rake (~> 13.0)
simplecov (~> 0.22)

BUNDLED WITH
2.1.4
2.5.22
34 changes: 31 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[![Build Status](https://travis-ci.org/rspockframework/ast-transform.svg?branch=master)](https://travis-ci.org/rspockframework/ast-transform)
[![Coverage Status](https://coveralls.io/repos/github/rspockframework/ast-transform/badge.svg?branch=master)](https://coveralls.io/github/rspockframework/ast-transform?branch=master)
[![CI](https://github.com/rspockframework/ast-transform/actions/workflows/ci.yml/badge.svg)](https://github.com/rspockframework/ast-transform/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/rspockframework/ast-transform/branch/main/graph/badge.svg)](https://codecov.io/gh/rspockframework/ast-transform)

# ASTTransform

Expand Down Expand Up @@ -183,4 +183,32 @@ end

After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. 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).
To install this gem onto your local machine, run `bundle exec rake install`.

## Releasing a New Version

There are two ways to create a release. Both require that `version.rb` has already been updated and merged to main.

### Via GitHub UI

1. Update `VERSION` in `lib/ast_transform/version.rb`, commit, open a PR, and merge to main
2. Go to the repo on GitHub → **Releases** → **Draft a new release**
3. Enter a new tag (e.g. `v2.0.0`), select `main` as the target branch
4. Add a title and release notes (GitHub can auto-generate these from merged PRs)
5. Click **Publish release**

### Via CLI

1. Update `VERSION` in `lib/ast_transform/version.rb`, commit, open a PR, and merge to main
2. Tag and push:
```
git checkout main && git pull
git tag v2.0.0
git push origin v2.0.0
```

In both cases, the [release workflow](.github/workflows/release.yml) validates that the tag matches `version.rb`, builds the gem, and publishes it to [rubygems.org](https://rubygems.org) via [Trusted Publishing](https://guides.rubygems.org/trusted-publishing/) (no API key needed). If there's a mismatch, the workflow fails before publishing.

### One-time setup

Configure the gem as a trusted publisher on rubygems.org so that the release workflow can publish automatically. See the [Trusted Publishing guide](https://guides.rubygems.org/trusted-publishing/pushing-a-new-gem-with-a-trusted-publisher/) for details.
21 changes: 6 additions & 15 deletions ast_transform.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,17 @@ Gem::Specification.new do |spec|
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]
spec.required_ruby_version = '~> 2.5'

if ENV['TRAVIS']
if ENV['TRAVIS_TAG'].nil? || ENV['TRAVIS_TAG'].empty?
spec.version = "#{spec.version}-alpha-#{ENV['TRAVIS_BUILD_NUMBER']}"
elsif ENV['TRAVIS_TAG'] != spec.version.to_s
raise "Tag name (#{ENV['TRAVIS_TAG']}) and Gem version (#{spec.version}) are different"
end
end
spec.required_ruby_version = '>= 3.2'

# Development dependencies
spec.add_development_dependency "bundler", "~> 2.1"
spec.add_development_dependency "bundler", ">= 2.1"
spec.add_development_dependency "rake", "~> 13.0"
spec.add_development_dependency "minitest", "~> 5.14"
spec.add_development_dependency "minitest-reporters", "~> 1.4"
spec.add_development_dependency "pry", "~> 0.13"
spec.add_development_dependency "pry-byebug", "~> 3.9"
spec.add_development_dependency "coveralls", "~> 0.8"
spec.add_development_dependency "pry", ">= 0.14"
spec.add_development_dependency "simplecov", "~> 0.22"

# Runtime dependencies
spec.add_runtime_dependency "parser", "~> 2.5"
spec.add_runtime_dependency "unparser", "~> 0.4"
spec.add_runtime_dependency "parser", ">= 3.0"
spec.add_runtime_dependency "unparser", ">= 0.6"
end
10 changes: 9 additions & 1 deletion lib/ast_transform/transformation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,19 @@ def process_node(node)
process_node_helper(child_node, previous_sibling)
end

count_before_reject = children.size

children.reject!.with_index { |child_node, index|
transform_node?(child_node) && transformable_node?(next_child(node, index))
}

node.updated(nil, process_all(children))
processed = process_all(children)

if node.type == :begin && processed.size == 1 && children.size < count_before_reject
processed.first
else
node.updated(nil, processed)
end
end

def previous_child(node, index)
Expand Down
2 changes: 1 addition & 1 deletion lib/ast_transform/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module ASTTransform
VERSION = "1.0.0"
VERSION = "2.0.0"
end
26 changes: 5 additions & 21 deletions test/ast_transform/source_map_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,9 @@ def run(node)
method_call
HEREDOC

expected_transformed_source = <<~HEREDOC
method_call + 1
HEREDOC

actual_transformed_source = transformer.transform_file_source(source, 'src', 'transformed')

assert_equal strip_end_line(expected_transformed_source), actual_transformed_source
assert_equal "method_call + 1", actual_transformed_source

source_map = ASTTransform::SourceMap.for_file_path('transformed')

Expand All @@ -48,13 +44,9 @@ def run(node)
method_call
HEREDOC

expected_transformed_source = <<~HEREDOC
method_call + 1
HEREDOC

actual_transformed_source = transformer.transform_file_source(source, 'src', 'transformed')

assert_equal strip_end_line(expected_transformed_source), actual_transformed_source
assert_equal "method_call + 1", actual_transformed_source

transformer.transform_file_source(source, 'src', 'transformed')
source_map = ASTTransform::SourceMap.for_file_path('transformed')
Expand All @@ -76,13 +68,9 @@ def run(node)
method_call2
HEREDOC

expected_transformed_source = <<~HEREDOC
method_call1 + method_call2
HEREDOC

actual_transformed_source = transformer.transform_file_source(source, 'src', 'transformed')

assert_equal strip_end_line(expected_transformed_source), actual_transformed_source
assert_equal "method_call1 + method_call2", actual_transformed_source

source_map = ASTTransform::SourceMap.for_file_path('transformed')

Expand All @@ -109,7 +97,7 @@ def run(node)

actual_transformed_source = transformer.transform_file_source(source, 'src', 'transformed')

assert_equal strip_end_line(expected_transformed_source), actual_transformed_source
assert_equal expected_transformed_source, actual_transformed_source

source_map = ASTTransform::SourceMap.for_file_path('transformed')

Expand All @@ -130,13 +118,9 @@ def run(node)
method_call1 + method_call2
HEREDOC

expected_transformed_source = <<~HEREDOC
1 + 2
HEREDOC

actual_transformed_source = transformer.transform_file_source(source, 'src', 'transformed')

assert_equal strip_end_line(expected_transformed_source), actual_transformed_source
assert_equal "1 + 2", actual_transformed_source

source_map = ASTTransform::SourceMap.for_file_path('transformed')

Expand Down
Loading