html-pipeline 3.0.0.pre3 → 3.0.0.pre5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +0 -3
- data/.github/workflows/automerge.yml +2 -23
- data/.github/workflows/ci.yml +22 -0
- data/.github/workflows/lint.yml +5 -5
- data/.github/workflows/publish.yml +19 -0
- data/.ruby-version +1 -0
- data/.vscode/settings.json +8 -0
- data/Gemfile +2 -2
- data/README.md +22 -13
- data/html-pipeline.gemspec +1 -1
- data/lib/html_pipeline/convert_filter.rb +1 -1
- data/lib/html_pipeline/filter.rb +1 -1
- data/lib/html_pipeline/node_filter/absolute_source_filter.rb +13 -13
- data/lib/html_pipeline/node_filter/asset_proxy_filter.rb +86 -0
- data/lib/html_pipeline/node_filter/mention_filter.rb +1 -1
- data/lib/html_pipeline/node_filter/team_mention_filter.rb +1 -1
- data/lib/html_pipeline/sanitization_filter.rb +1 -1
- data/lib/html_pipeline/text_filter.rb +1 -1
- data/lib/html_pipeline/version.rb +1 -1
- data/lib/html_pipeline.rb +1 -1
- metadata +12 -7
- data/.github/workflows/tag_and_release.yml +0 -70
- data/.github/workflows/test.yml +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76b152d297b41b59af64604d1e0b034734c3ce6f3de999b1e614de96f500ecab
|
4
|
+
data.tar.gz: 5d06fbfb10d4390bec9b0c7efffadea4c0e7cf1aaf8ff4e57b23c4b2599bd928
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4e943345b5febc342cd26417419982be10d2bc1e393e5783c280e06333db6d0e74a92b7d3fc173e84139fa9bc34f534f8823518b2a54ce7911e2e3e94d8dd86
|
7
|
+
data.tar.gz: 7f0fcf7e8821f86acd723a402b5911a3d667a09dd1013ae452a5494395f7535cc30a3bf1b5dca5aaac2c6bb54c103ad62d5ffdaf7f52c4ece182f553ddc810fd
|
data/.github/dependabot.yml
CHANGED
@@ -9,26 +9,5 @@ permissions:
|
|
9
9
|
|
10
10
|
jobs:
|
11
11
|
dependabot:
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
if: ${{ github.actor == 'dependabot[bot]' }}
|
16
|
-
steps:
|
17
|
-
- name: Fetch Dependabot metadata
|
18
|
-
id: dependabot-metadata
|
19
|
-
uses: dependabot/fetch-metadata@v1
|
20
|
-
with:
|
21
|
-
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
22
|
-
|
23
|
-
- name: Approve Dependabot PR
|
24
|
-
if: ${{steps.dependabot-metadata.outputs.update-type != 'version-update:semver-major'}}
|
25
|
-
run: gh pr review --approve "$PR_URL"
|
26
|
-
env:
|
27
|
-
PR_URL: ${{github.event.pull_request.html_url}}
|
28
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
29
|
-
|
30
|
-
- name: Merge Dependabot PR
|
31
|
-
run: gh pr merge --auto --squash "$PR_URL"
|
32
|
-
env:
|
33
|
-
PR_URL: ${{ github.event.pull_request.html_url }}
|
34
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
12
|
+
uses: yettoapp/actions/.github/workflows/automerge_dependabot.yml@main
|
13
|
+
secrets: inherit
|
@@ -0,0 +1,22 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
pull_request:
|
5
|
+
|
6
|
+
permissions:
|
7
|
+
contents: read
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@v3
|
15
|
+
|
16
|
+
- name: Set up Ruby
|
17
|
+
uses: yettoapp/actions/setup-languages@main
|
18
|
+
with:
|
19
|
+
ruby: true
|
20
|
+
|
21
|
+
- name: Run tests
|
22
|
+
run: bundle exec rake test
|
data/.github/workflows/lint.yml
CHANGED
@@ -13,11 +13,11 @@ jobs:
|
|
13
13
|
runs-on: ubuntu-latest
|
14
14
|
steps:
|
15
15
|
- uses: actions/checkout@v3
|
16
|
-
|
16
|
+
|
17
|
+
- name: Set up Ruby
|
18
|
+
uses: yettoapp/actions/setup-languages@main
|
17
19
|
with:
|
18
|
-
ruby
|
19
|
-
|
20
|
-
bundler-cache: true
|
21
|
-
- run: bundle install
|
20
|
+
ruby: true
|
21
|
+
|
22
22
|
- name: Rubocop
|
23
23
|
run: bundle exec rake rubocop
|
@@ -0,0 +1,19 @@
|
|
1
|
+
name: Release
|
2
|
+
|
3
|
+
on:
|
4
|
+
workflow_dispatch:
|
5
|
+
push:
|
6
|
+
branches:
|
7
|
+
- main
|
8
|
+
paths:
|
9
|
+
- "lib/html_pipeline/version.rb"
|
10
|
+
|
11
|
+
jobs:
|
12
|
+
ruby:
|
13
|
+
uses: yettoapp/actions/.github/workflows/ruby_gem_release.yml@main
|
14
|
+
secrets:
|
15
|
+
rubygems_api_key: ${{ secrets.RUBYGEMS_API_BOT_KEY }}
|
16
|
+
gh_token: ${{ secrets.GITHUB_TOKEN }}
|
17
|
+
with:
|
18
|
+
gem_name: html-pipeline
|
19
|
+
version_filepath: lib/html_pipeline/version.rb
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.2.1
|
data/Gemfile
CHANGED
@@ -28,7 +28,7 @@ end
|
|
28
28
|
|
29
29
|
group :test do
|
30
30
|
gem "commonmarker", "~> 1.0.0.pre7", require: false
|
31
|
-
gem "gemoji", "~>
|
31
|
+
gem "gemoji", "~> 4.1", require: false
|
32
32
|
gem "gemojione", "~> 4.3", require: false
|
33
33
|
|
34
34
|
gem "minitest"
|
@@ -38,5 +38,5 @@ group :test do
|
|
38
38
|
gem "nokogiri", "~> 1.13"
|
39
39
|
|
40
40
|
gem "minitest-focus", "~> 1.1"
|
41
|
-
gem "rouge", "~>
|
41
|
+
gem "rouge", "~> 4.1", require: false
|
42
42
|
end
|
data/README.md
CHANGED
@@ -1,23 +1,31 @@
|
|
1
|
-
#
|
1
|
+
# HTML-Pipeline
|
2
2
|
|
3
3
|
> **Note**
|
4
|
-
> This README refers to the behavior in the new 3.0.0.
|
4
|
+
> This README refers to the behavior in the new 3.0.0.pre gem.
|
5
5
|
|
6
6
|
HTML processing filters and utilities. This module is a small
|
7
7
|
framework for defining CSS-based content filters and applying them to user
|
8
8
|
provided content.
|
9
9
|
|
10
|
-
[Although this project was started at GitHub](https://github.com/blog/1311-html-pipeline-chainable-content-filters), they no longer
|
11
|
-
|
12
|
-
- [
|
13
|
-
- [
|
14
|
-
- [
|
15
|
-
- [
|
16
|
-
- [
|
17
|
-
- [
|
18
|
-
- [
|
19
|
-
- [
|
20
|
-
- [
|
10
|
+
[Although this project was started at GitHub](https://github.com/blog/1311-html-pipeline-chainable-content-filters), they no longer use it. This gem must be considered standalone and independent from GitHub.
|
11
|
+
|
12
|
+
- [HTML-Pipeline](#html-pipeline)
|
13
|
+
- [Installation](#installation)
|
14
|
+
- [Usage](#usage)
|
15
|
+
- [More Examples](#more-examples)
|
16
|
+
- [Filters](#filters)
|
17
|
+
- [TextFilters](#textfilters)
|
18
|
+
- [ConvertFilter](#convertfilter)
|
19
|
+
- [Sanitization](#sanitization)
|
20
|
+
- [NodeFilters](#nodefilters)
|
21
|
+
- [Dependencies](#dependencies)
|
22
|
+
- [Documentation](#documentation)
|
23
|
+
- [Instrumenting](#instrumenting)
|
24
|
+
- [Third Party Extensions](#third-party-extensions)
|
25
|
+
- [FAQ](#faq)
|
26
|
+
- [1. Why doesn't my pipeline work when there's no root element in the document?](#1-why-doesnt-my-pipeline-work-when-theres-no-root-element-in-the-document)
|
27
|
+
- [2. How do I customize an allowlist for `SanitizationFilter`s?](#2-how-do-i-customize-an-allowlist-for-sanitizationfilters)
|
28
|
+
- [Contributors](#contributors)
|
21
29
|
|
22
30
|
## Installation
|
23
31
|
|
@@ -231,6 +239,7 @@ end
|
|
231
239
|
For more information on how to write effective `NodeFilter`s, refer to the provided filters, and see the underlying lib, [Selma](https://www.github.com/gjtorikian/selma) for more information.
|
232
240
|
|
233
241
|
- `AbsoluteSourceFilter`: replace relative image urls with fully qualified versions
|
242
|
+
- `AssetProxyFilter`: replace image links with an encoded link to an asset server
|
234
243
|
- `EmojiFilter`: converts `:<emoji>:` to [emoji](http://www.emoji-cheat-sheet.com/)
|
235
244
|
- (Note: the included `MarkdownFilter` will already convert emoji)
|
236
245
|
- `HttpsFilter`: Replacing http urls with https versions
|
data/html-pipeline.gemspec
CHANGED
data/lib/html_pipeline/filter.rb
CHANGED
@@ -4,6 +4,19 @@ require "uri"
|
|
4
4
|
|
5
5
|
class HTMLPipeline
|
6
6
|
class NodeFilter
|
7
|
+
# HTML Filter for replacing relative and root relative image URLs with
|
8
|
+
# fully qualified URLs
|
9
|
+
#
|
10
|
+
# This is useful if an image is root relative but should really be going
|
11
|
+
# through a cdn, or if the content for the page assumes the host is known
|
12
|
+
# i.e. scraped webpages and some RSS feeds.
|
13
|
+
#
|
14
|
+
# Context options:
|
15
|
+
# :image_base_url - Base URL for image host for root relative src.
|
16
|
+
# :image_subpage_url - For relative src.
|
17
|
+
#
|
18
|
+
# This filter does not write additional information to the context.
|
19
|
+
# Note: This filter would need to be run before AssetProxyFilter.
|
7
20
|
class AbsoluteSourceFilter < NodeFilter
|
8
21
|
SELECTOR = Selma::Selector.new(match_element: "img")
|
9
22
|
|
@@ -11,19 +24,6 @@ class HTMLPipeline
|
|
11
24
|
SELECTOR
|
12
25
|
end
|
13
26
|
|
14
|
-
# HTML Filter for replacing relative and root relative image URLs with
|
15
|
-
# fully qualified URLs
|
16
|
-
#
|
17
|
-
# This is useful if an image is root relative but should really be going
|
18
|
-
# through a cdn, or if the content for the page assumes the host is known
|
19
|
-
# i.e. scraped webpages and some RSS feeds.
|
20
|
-
#
|
21
|
-
# Context options:
|
22
|
-
# :image_base_url - Base URL for image host for root relative src.
|
23
|
-
# :image_subpage_url - For relative src.
|
24
|
-
#
|
25
|
-
# This filter does not write additional information to the context.
|
26
|
-
# This filter would need to be run before CamoFilter.
|
27
27
|
def handle_element(element)
|
28
28
|
src = element["src"]
|
29
29
|
return if src.nil? || src.empty?
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "openssl"
|
4
|
+
|
5
|
+
class HTMLPipeline
|
6
|
+
class NodeFilter
|
7
|
+
# Proxy images/assets to another server, such as
|
8
|
+
# [cactus/go-camo](https://github.com/cactus/go-camo#).
|
9
|
+
# Reduces mixed content warnings as well as hiding the customer's
|
10
|
+
# IP address when requesting images.
|
11
|
+
# Copies the original img `src` to `data-canonical-src` then replaces the
|
12
|
+
# `src` with a new url to the proxy server.
|
13
|
+
#
|
14
|
+
# Based on https://github.com/gjtorikian/html-pipeline/blob/v2.14.3/lib/html/pipeline/camo_filter.rb
|
15
|
+
class AssetProxyFilter < NodeFilter
|
16
|
+
SELECTOR = Selma::Selector.new(match_element: "img")
|
17
|
+
|
18
|
+
def selector
|
19
|
+
SELECTOR
|
20
|
+
end
|
21
|
+
|
22
|
+
def handle_element(element)
|
23
|
+
original_src = element["src"]
|
24
|
+
return unless original_src
|
25
|
+
|
26
|
+
begin
|
27
|
+
uri = URI.parse(original_src)
|
28
|
+
rescue StandardError
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
32
|
+
return if uri.host.nil? && !original_src.start_with?("///")
|
33
|
+
return if asset_host_allowed?(uri.host)
|
34
|
+
|
35
|
+
element["src"] = asset_proxy_url(original_src)
|
36
|
+
element["data-canonical-src"] = original_src
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate
|
40
|
+
needs(:asset_proxy, :asset_proxy_secret_key)
|
41
|
+
end
|
42
|
+
|
43
|
+
def asset_host_allowed?(host)
|
44
|
+
context[:asset_proxy_domain_regexp] ? context[:asset_proxy_domain_regexp].match?(host) : false
|
45
|
+
end
|
46
|
+
|
47
|
+
class << self
|
48
|
+
# This helps setup the context. It's not needed if you're always providing
|
49
|
+
# all the necessary keys in the context. One example would be to override
|
50
|
+
# this and pull the settings from a set of global application settings.
|
51
|
+
def transform_context(context, proxy_settings = {})
|
52
|
+
context[:asset_proxy] = proxy_settings[:url] if proxy_settings[:url]
|
53
|
+
context[:asset_proxy_secret_key] = proxy_settings[:secret_key] if proxy_settings[:secret_key]
|
54
|
+
|
55
|
+
allowlist = determine_allowlist(proxy_settings)
|
56
|
+
context[:asset_proxy_domain_regexp] ||= compile_allowlist(allowlist)
|
57
|
+
|
58
|
+
context
|
59
|
+
end
|
60
|
+
|
61
|
+
def compile_allowlist(domain_list)
|
62
|
+
return if domain_list.empty?
|
63
|
+
|
64
|
+
escaped = domain_list.map { |domain| Regexp.escape(domain).gsub("\\*", ".*?") }
|
65
|
+
Regexp.new("^(#{escaped.join("|")})$", Regexp::IGNORECASE)
|
66
|
+
end
|
67
|
+
|
68
|
+
def determine_allowlist(proxy_settings)
|
69
|
+
proxy_settings[:allowlist] || []
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private def asset_proxy_url(url)
|
74
|
+
"#{context[:asset_proxy]}/#{asset_url_hash(url)}/#{hexencode(url)}"
|
75
|
+
end
|
76
|
+
|
77
|
+
private def asset_url_hash(url)
|
78
|
+
OpenSSL::HMAC.hexdigest("sha1", context[:asset_proxy_secret_key], url)
|
79
|
+
end
|
80
|
+
|
81
|
+
private def hexencode(str)
|
82
|
+
str.unpack1("H*")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/html_pipeline.rb
CHANGED
@@ -81,7 +81,7 @@ class HTMLPipeline
|
|
81
81
|
def define_dependency_loaded_method(name, value)
|
82
82
|
self.class.define_method(:"#{name}_loaded?", -> { value })
|
83
83
|
end
|
84
|
-
end
|
84
|
+
end
|
85
85
|
# Public: Returns an Array of Filter objects for this Pipeline.
|
86
86
|
attr_reader :text_filters, :node_filters
|
87
87
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: html-pipeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.
|
4
|
+
version: 3.0.0.pre5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Garen J. Torikian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selma
|
@@ -16,14 +16,15 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: '0.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: '0.1'
|
27
|
+
force_ruby_platform: false
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
name: zeitwerk
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +39,7 @@ dependencies:
|
|
38
39
|
- - "~>"
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
version: '2.5'
|
42
|
+
force_ruby_platform: false
|
41
43
|
description: HTML processing filters and utilities
|
42
44
|
email:
|
43
45
|
- gjtorikian@gmail.com
|
@@ -48,11 +50,13 @@ files:
|
|
48
50
|
- ".github/FUNDING.yml"
|
49
51
|
- ".github/dependabot.yml"
|
50
52
|
- ".github/workflows/automerge.yml"
|
53
|
+
- ".github/workflows/ci.yml"
|
51
54
|
- ".github/workflows/lint.yml"
|
52
|
-
- ".github/workflows/
|
53
|
-
- ".github/workflows/test.yml"
|
55
|
+
- ".github/workflows/publish.yml"
|
54
56
|
- ".gitignore"
|
55
57
|
- ".rubocop.yml"
|
58
|
+
- ".ruby-version"
|
59
|
+
- ".vscode/settings.json"
|
56
60
|
- CHANGELOG.md
|
57
61
|
- Gemfile
|
58
62
|
- LICENSE.txt
|
@@ -67,6 +71,7 @@ files:
|
|
67
71
|
- lib/html_pipeline/filter.rb
|
68
72
|
- lib/html_pipeline/node_filter.rb
|
69
73
|
- lib/html_pipeline/node_filter/absolute_source_filter.rb
|
74
|
+
- lib/html_pipeline/node_filter/asset_proxy_filter.rb
|
70
75
|
- lib/html_pipeline/node_filter/emoji_filter.rb
|
71
76
|
- lib/html_pipeline/node_filter/https_filter.rb
|
72
77
|
- lib/html_pipeline/node_filter/image_max_width_filter.rb
|
@@ -106,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
111
|
- !ruby/object:Gem::Version
|
107
112
|
version: 3.3.22
|
108
113
|
requirements: []
|
109
|
-
rubygems_version: 3.
|
114
|
+
rubygems_version: 3.4.13
|
110
115
|
signing_key:
|
111
116
|
specification_version: 4
|
112
117
|
summary: Helpers for processing content through a chain of filters
|
@@ -1,70 +0,0 @@
|
|
1
|
-
name: Tag and Release
|
2
|
-
|
3
|
-
on:
|
4
|
-
workflow_dispatch:
|
5
|
-
push:
|
6
|
-
branches:
|
7
|
-
- main
|
8
|
-
paths:
|
9
|
-
- "lib/html_pipeline/version.rb"
|
10
|
-
|
11
|
-
jobs:
|
12
|
-
release:
|
13
|
-
env:
|
14
|
-
GEM_NAME: html-pipeline
|
15
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
16
|
-
GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_BOT_KEY }}
|
17
|
-
runs-on: ubuntu-latest
|
18
|
-
steps:
|
19
|
-
- uses: actions/checkout@v3
|
20
|
-
|
21
|
-
- name: Set up Ruby 3.1
|
22
|
-
uses: ruby/setup-ruby@v1
|
23
|
-
with:
|
24
|
-
ruby-version: 3.1
|
25
|
-
bundler-cache: true
|
26
|
-
|
27
|
-
- name: Configure Git
|
28
|
-
run: |
|
29
|
-
git config --local user.email "actions@github.com"
|
30
|
-
git config --local user.name "Actions Auto Build"
|
31
|
-
|
32
|
-
- name: Get current version
|
33
|
-
id: version-label
|
34
|
-
run: |
|
35
|
-
VERSION=$(grep VERSION lib/html_pipeline/version.rb | head -n 1 | cut -d'"' -f2)
|
36
|
-
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
37
|
-
|
38
|
-
- name: Create tag
|
39
|
-
run: |
|
40
|
-
git tag -a v${{ steps.version-label.outputs.version }} -m "Release v${{ steps.version-label.outputs.version }}"
|
41
|
-
git push origin --tags
|
42
|
-
|
43
|
-
- name: Generate CHANGELOG.md
|
44
|
-
id: changelog
|
45
|
-
run: script/generate_changelog
|
46
|
-
|
47
|
-
- name: Commit & Push Changelog
|
48
|
-
run: |
|
49
|
-
git config --local user.email "actions@github.com"
|
50
|
-
git config --local user.name "Actions Auto Build"
|
51
|
-
git add -f CHANGELOG.md
|
52
|
-
git commit -m "docs: update changelog" || true
|
53
|
-
git push
|
54
|
-
|
55
|
-
- name: Publish release
|
56
|
-
env:
|
57
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
58
|
-
run: |
|
59
|
-
gh release create v${{ steps.version-label.outputs.version }} --generate-notes
|
60
|
-
|
61
|
-
- name: Publish to RubyGems
|
62
|
-
run: |
|
63
|
-
mkdir -p $HOME/.gem
|
64
|
-
touch $HOME/.gem/credentials
|
65
|
-
chmod 0600 $HOME/.gem/credentials
|
66
|
-
printf -- "---\n:rubygems_api_key: ${RUBYGEMS_API_BOT_KEY}\n" > $HOME/.gem/credentials
|
67
|
-
bundle exec rake package
|
68
|
-
for gem in pkg/html-pipeline-${{ steps.version-label.outputs.version }}*.gem ; do
|
69
|
-
gem push "$gem" --host https://rubygems.org
|
70
|
-
done
|
data/.github/workflows/test.yml
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
name: Tests
|
2
|
-
|
3
|
-
on:
|
4
|
-
pull_request:
|
5
|
-
|
6
|
-
permissions:
|
7
|
-
contents: read
|
8
|
-
|
9
|
-
jobs:
|
10
|
-
test:
|
11
|
-
runs-on: ubuntu-latest
|
12
|
-
|
13
|
-
strategy:
|
14
|
-
fail-fast: true
|
15
|
-
matrix:
|
16
|
-
ruby-version:
|
17
|
-
- 3.1.0
|
18
|
-
|
19
|
-
steps:
|
20
|
-
- uses: actions/checkout@v3
|
21
|
-
|
22
|
-
- name: Set up Ruby ${{ matrix.ruby-version }}
|
23
|
-
uses: ruby/setup-ruby@v1
|
24
|
-
with:
|
25
|
-
ruby-version: ${{ matrix.ruby-version }}
|
26
|
-
rubygems: latest
|
27
|
-
bundler-cache: true
|
28
|
-
|
29
|
-
- name: Install dependencies
|
30
|
-
run: bundle install
|
31
|
-
|
32
|
-
- name: Run tests
|
33
|
-
run: bundle exec rake test
|