diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..a8d3b334 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,41 @@ +name: Ruby CI + +on: + pull_request: + types: [opened, synchronize, reopened] + push: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + strategy: + fail-fast: true + matrix: + ruby-version: + - 3.0.0 + - 2.7.2 + - 2.6.6 + - 2.5.8 + experimental: [false] + include: + - ruby-version: head + experimental: true + + continue-on-error: ${{ matrix.experimental }} + + steps: + - uses: actions/checkout@v2 + - name: Set up Ruby ${{ matrix.ruby-version }} + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby-version }} + bundler-cache: true + - name: Install dependencies + run: | + bundle config set --local path '../../vendor/bundle' + bundle install + - name: Run tests + run: bundle exec rake diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..b8a5c0ed --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,22 @@ +name: Linting + +on: + pull_request: + types: [opened, synchronize, reopened] + push: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v2 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.0 + bundler-cache: true + - run: bundle install + - name: Rubocop + run: bundle exec rake rubocop diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 00000000..81748ee8 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,4 @@ +inherit_gem: + rubocop-standard: + - config/default.yml + - config/minitest.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ff321ccd..00000000 --- a/.travis.yml +++ /dev/null @@ -1,43 +0,0 @@ -language: ruby -cache: bundler -bundler_args: --path ../../vendor/bundle - -addons: - apt: - sources: - - libicu-dev - - kalakris-cmake - packages: - - cmake - -script: bundle exec rake - -gemfile: - - gemfiles/rails_6.gemfile - - gemfiles/rails_5.gemfile - - gemfiles/rails_4.gemfile - - gemfiles/rails_3.gemfile - -rvm: - - 2.4.6 - - 2.3.8 - - 2.5.7 - - ruby-head - -matrix: - fast_finish: true - allow_failures: - - rvm: ruby-head - exclude: - - gemfile: gemfiles/rails_6.gemfile - rvm: 2.4.6 - - gemfile: gemfiles/rails_6.gemfile - rvm: 2.3.8 - - gemfile: gemfiles/rails_4.gemfile - rvm: 2.5.7 - - gemfile: gemfiles/rails_4.gemfile - rvm: 2.4.6 - - gemfile: gemfiles/rails_3.gemfile - rvm: 2.5.7 - - gemfile: gemfiles/rails_3.gemfile - rvm: 2.4.6 diff --git a/Appraisals b/Appraisals deleted file mode 100644 index 6037fd68..00000000 --- a/Appraisals +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -appraise 'rails-3' do - gem 'rack', '< 2' - gem 'rails', '3.2.22.2' -end - -appraise 'rails-4' do - gem 'rack', '< 2' - gem 'rails', '~> 4.2.6' -end - -appraise 'rails-5' do - gem 'rails', '~> 5.0.0' -end - -appraise 'rails-6' do - gem 'rails', '~> 6.0.0' -end diff --git a/Gemfile b/Gemfile index adc923bd..d4890b59 100644 --- a/Gemfile +++ b/Gemfile @@ -5,8 +5,15 @@ source 'https://rubygems.org' # Specify your gem's dependencies in html-pipeline.gemspec gemspec +group :development, :test do + gem 'awesome_print' + + gem 'rubocop' + gem 'rubocop-performance' + gem 'rubocop-standard' +end + group :development do - gem 'appraisal' gem 'bundler' gem 'rake' end @@ -16,11 +23,11 @@ group :test do gem 'email_reply_parser', '~> 0.5', require: false gem 'gemoji', '~> 2.0', require: false gem 'minitest' - gem 'RedCloth', '~> 4.2.9', require: false - gem 'rinku', '~> 1.7', require: false - gem 'sanitize', '~> 4.6', require: false + gem 'RedCloth', '~> 4.3', require: false + gem 'rinku', '~> 1.7', require: false + gem 'sanitize', '~> 5.2', require: false gem 'escape_utils', '~> 1.0', require: false - gem 'rouge', '~> 3.1', require: false gem 'minitest-focus', '~> 1.1' + gem 'rouge', '~> 3.1', require: false end diff --git a/Rakefile b/Rakefile index f26f9adc..cc4508a3 100755 --- a/Rakefile +++ b/Rakefile @@ -15,3 +15,7 @@ Rake::TestTask.new do |t| end task default: :test + +require 'rubocop/rake_task' + +RuboCop::RakeTask.new(:rubocop) diff --git a/gemfiles/rails_3.gemfile b/gemfiles/rails_3.gemfile deleted file mode 100644 index d3497431..00000000 --- a/gemfiles/rails_3.gemfile +++ /dev/null @@ -1,27 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "rack", "< 2" -gem "rails", "3.2.22.2" - -group :development do - gem "appraisal" - gem "bundler" - gem "rake" -end - -group :test do - gem "commonmarker", "~> 0.16", require: false - gem "email_reply_parser", "~> 0.5", require: false - gem "gemoji", "~> 2.0", require: false - gem "minitest" - gem "RedCloth", "~> 4.2.9", require: false - gem "rinku", "~> 1.7", require: false - gem "sanitize", "~> 4.6", require: false - gem "escape_utils", "~> 1.0", require: false - gem "rouge", "~> 3.1", require: false - gem "minitest-focus", "~> 1.1" -end - -gemspec path: "../" diff --git a/gemfiles/rails_4.gemfile b/gemfiles/rails_4.gemfile deleted file mode 100644 index a00d20ad..00000000 --- a/gemfiles/rails_4.gemfile +++ /dev/null @@ -1,27 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "rack", "< 2" -gem "rails", "~> 4.2.6" - -group :development do - gem "appraisal" - gem "bundler" - gem "rake" -end - -group :test do - gem "commonmarker", "~> 0.16", require: false - gem "email_reply_parser", "~> 0.5", require: false - gem "gemoji", "~> 2.0", require: false - gem "minitest" - gem "RedCloth", "~> 4.2.9", require: false - gem "rinku", "~> 1.7", require: false - gem "sanitize", "~> 4.6", require: false - gem "escape_utils", "~> 1.0", require: false - gem "rouge", "~> 3.1", require: false - gem "minitest-focus", "~> 1.1" -end - -gemspec path: "../" diff --git a/gemfiles/rails_5.gemfile b/gemfiles/rails_5.gemfile deleted file mode 100644 index 1f64a4f9..00000000 --- a/gemfiles/rails_5.gemfile +++ /dev/null @@ -1,26 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "rails", "~> 5.0.0" - -group :development do - gem "appraisal" - gem "bundler" - gem "rake" -end - -group :test do - gem "commonmarker", "~> 0.16", require: false - gem "email_reply_parser", "~> 0.5", require: false - gem "gemoji", "~> 2.0", require: false - gem "minitest" - gem "RedCloth", "~> 4.2.9", require: false - gem "rinku", "~> 1.7", require: false - gem "sanitize", "~> 4.6", require: false - gem "escape_utils", "~> 1.0", require: false - gem "rouge", "~> 3.1", require: false - gem "minitest-focus", "~> 1.1" -end - -gemspec path: "../" diff --git a/gemfiles/rails_6.gemfile b/gemfiles/rails_6.gemfile deleted file mode 100644 index 134e8425..00000000 --- a/gemfiles/rails_6.gemfile +++ /dev/null @@ -1,26 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "rails", "~> 6.0.0" - -group :development do - gem "appraisal" - gem "bundler" - gem "rake" -end - -group :test do - gem "commonmarker", "~> 0.16", require: false - gem "email_reply_parser", "~> 0.5", require: false - gem "gemoji", "~> 2.0", require: false - gem "minitest" - gem "RedCloth", "~> 4.2.9", require: false - gem "rinku", "~> 1.7", require: false - gem "sanitize", "~> 4.6", require: false - gem "escape_utils", "~> 1.0", require: false - gem "rouge", "~> 3.1", require: false - gem "minitest-focus", "~> 1.1" -end - -gemspec path: "../" diff --git a/html-pipeline.gemspec b/html-pipeline.gemspec index ec88cfe2..cf8dccb6 100644 --- a/html-pipeline.gemspec +++ b/html-pipeline.gemspec @@ -1,6 +1,6 @@ # frozen_string_literal: true -require File.expand_path('../lib/html/pipeline/version', __FILE__) +require File.expand_path('lib/html/pipeline/version', __dir__) Gem::Specification.new do |gem| gem.name = 'html-pipeline' @@ -8,22 +8,23 @@ Gem::Specification.new do |gem| gem.license = 'MIT' gem.authors = ['Ryan Tomayko', 'Jerry Cheung', 'Garen J. Torikian'] gem.email = ['ryan@github.com', 'jerry@github.com', 'gjtorikian@gmail.com'] - gem.description = 'GitHub HTML processing filters and utilities' + gem.description = 'HTML processing filters and utilities' gem.summary = 'Helpers for processing content through a chain of filters' gem.homepage = 'https://github.com/jch/html-pipeline' gem.files = `git ls-files -z`.split("\x0").reject { |f| f =~ %r{^(test|gemfiles|script)/} } gem.require_paths = ['lib'] - gem.add_dependency 'activesupport', '>= 2' - gem.add_dependency 'nokogiri', '>= 1.4' + gem.required_ruby_version = ['>= 2.5.8', '< 4.0'] - gem.post_install_message = < 1.11' + + gem.post_install_message = <<~MSG + ------------------------------------------------- + Thank you for installing html-pipeline! + You must bundle Filter gem dependencies. + See html-pipeline README.md for more details. + https://github.com/jch/html-pipeline#dependencies + ------------------------------------------------- + MSG end diff --git a/lib/html/pipeline.rb b/lib/html/pipeline.rb index 8f5cf8db..f1277b46 100644 --- a/lib/html/pipeline.rb +++ b/lib/html/pipeline.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require 'nokogiri' -require 'active_support/xml_mini/nokogiri' # convert Documents to hashes module HTML # GitHub HTML processing filters and utilities. This module includes a small diff --git a/lib/html/pipeline/emoji_filter.rb b/lib/html/pipeline/emoji_filter.rb index d22bb479..161b4093 100644 --- a/lib/html/pipeline/emoji_filter.rb +++ b/lib/html/pipeline/emoji_filter.rb @@ -68,12 +68,15 @@ def asset_path(name) # Build an emoji image tag def emoji_image_tag(name) - require 'active_support/core_ext/hash/indifferent_access' html_attrs = - default_img_attrs(name) - .merge!((context[:img_attrs] || {}).with_indifferent_access) - .map { |attr, value| !value.nil? && %(#{attr}="#{value.respond_to?(:call) && value.call(name) || value}") } - .reject(&:blank?).join(' '.freeze) + default_img_attrs(name).transform_keys(&:to_sym) + .merge!(context[:img_attrs] || {}).transform_keys(&:to_sym) + .each_with_object([]) do |(attr, value), arr| + next if value.nil? + + value = value.respond_to?(:call) && value.call(name) || value + arr << %(#{attr}="#{value}") + end.compact.join(' '.freeze) "" end diff --git a/test/test_helper.rb b/test/test_helper.rb index ddb78e80..530e272d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -6,14 +6,12 @@ require 'minitest/pride' require 'minitest/focus' -require 'active_support/core_ext/string' - module TestHelpers # Asserts that two html fragments are equivalent. Attribute order # will be ignored. def assert_equal_html(expected, actual) - assert_equal Nokogiri::HTML::DocumentFragment.parse(expected).to_hash, - Nokogiri::HTML::DocumentFragment.parse(actual).to_hash + assert_equal Nokogiri::HTML::DocumentFragment.parse(expected).to_h, + Nokogiri::HTML::DocumentFragment.parse(actual).to_h end end