diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..750cab2d
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,69 @@
+---
+
+name: CI
+
+on:
+ - "push"
+
+jobs:
+ test:
+ name: "Testing"
+ runs-on: ubuntu-18.04
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ # Recent Rubies and Rails
+ - ruby-version: '2.6'
+ rails-version: '6.1'
+ - ruby-version: '2.6'
+ rails-version: '6.0'
+ - ruby-version: '2.7'
+ rails-version: '6.0'
+ - ruby-version: '2.6'
+ rails-version: '5.2'
+ # Old Rubies and Rails
+ - ruby-version: '2.5'
+ rails-version: '5.1'
+ bundler: '1'
+ - ruby-version: '2.4'
+ rails-version: '5.0'
+ bundler: '1'
+ - ruby-version: '2.4'
+ rails-version: '4.2'
+ bundler: '1'
+ # Failing with a stack trace in active support
+ # - ruby-version: '2.4'
+ # rails-version: '4.1'
+ # bundler: '1'
+
+ continue-on-error: "${{ endsWith(matrix.ruby-version, 'head') }}"
+
+ env:
+ CI: "1"
+
+ steps:
+ - name: "Checkout Code"
+ uses: "actions/checkout@v2"
+ timeout-minutes: 5
+ with:
+ fetch-depth: 0
+
+ - name: Install required libs
+ run: |
+ sudo apt-get -yqq install libsqlite3-dev
+
+ - name: "Build Ruby"
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: "${{ matrix.ruby-version }}"
+ bundler: "${{ matrix.bundler || 2 }}"
+ bundler-cache: true
+ env:
+ RAILS_VERSION: ${{ matrix.rails-version }}
+
+ - name: "Run tests"
+ run: |
+ bundle exec rake
+ env:
+ RAILS_VERSION: ${{ matrix.rails-version }}
diff --git a/.simplecov b/.simplecov
deleted file mode 100644
index 955a6060..00000000
--- a/.simplecov
+++ /dev/null
@@ -1,110 +0,0 @@
-# https://github.com/colszowka/simplecov#using-simplecov-for-centralized-config
-# see https://github.com/colszowka/simplecov/blob/master/lib/simplecov/defaults.rb
-# vim: set ft=ruby
-
-## DEFINE VARIABLES
-@minimum_coverage = ENV.fetch('COVERAGE_MINIMUM') {
- case (defined?(RUBY_ENGINE) && RUBY_ENGINE) || "ruby"
- when 'jruby', 'rbx'
- 96.0
- else
- 98.1
- end
-}.to_f.round(2)
-# rubocop:disable Style/DoubleNegation
-ENV['FULL_BUILD'] ||= ENV['CI']
-@running_ci = !!(ENV['FULL_BUILD'] =~ /\Atrue\z/i)
-@generate_report = @running_ci || !!(ENV['COVERAGE'] =~ /\Atrue\z/i)
-@output = STDOUT
-# rubocop:enable Style/DoubleNegation
-
-## CONFIGURE SIMPLECOV
-
-SimpleCov.profiles.define 'app' do
- coverage_dir 'coverage'
- load_profile 'test_frameworks'
-
- add_group 'Libraries', 'lib'
-
- add_group 'Long files' do |src_file|
- src_file.lines.count > 100
- end
- class MaxLinesFilter < SimpleCov::Filter
- def matches?(source_file)
- source_file.lines.count < filter_argument
- end
- end
- add_group 'Short files', MaxLinesFilter.new(5)
-
- # Exclude these paths from analysis
- add_filter '/config/'
- add_filter '/db/'
- add_filter 'tasks'
- add_filter '/.bundle/'
-end
-
-## START TRACKING COVERAGE (before activating SimpleCov)
-require 'coverage'
-Coverage.start
-
-## ADD SOME CUSTOM REPORTING AT EXIT
-SimpleCov.at_exit do
- next if $! and not ($!.kind_of? SystemExit and $!.success?)
-
- header = "#{'*' * 20} SimpleCov Results #{'*' * 20}"
- results = SimpleCov.result.format!.join("\n")
- exit_message = <<-EOF
-
-#{header}
-{{RESULTS}}
-{{FAILURE_MESSAGE}}
-
-#{'*' * header.size}
- EOF
- percent = Float(SimpleCov.result.covered_percent)
- if percent < @minimum_coverage
- failure_message = <<-EOF
-Spec coverage was not high enough: #{percent.round(2)}% is < #{@minimum_coverage}%
- EOF
- exit_message.sub!('{{RESULTS}}', results).sub!('{{FAILURE_MESSAGE}}', failure_message)
- @output.puts exit_message
- abort(failure_message) if @generate_report
- elsif @running_ci
- exit_message.sub!('{{RESULTS}}', results).sub!('{{FAILURE_MESSAGE}}', <<-EOF)
-Nice job! Spec coverage (#{percent.round(2)}%) is still at or above #{@minimum_coverage}%
- EOF
- @output.puts exit_message
- end
-end
-
-## CAPTURE CONFIG IN CLOSURE 'AppCoverage.start'
-## to defer running until test/test_helper.rb is loaded.
-# rubocop:disable Style/MultilineBlockChain
-AppCoverage = Class.new do
- def initialize(&block)
- @block = block
- end
-
- def start
- @block.call
- end
-end.new do
- SimpleCov.start 'app'
- if @generate_report
- if @running_ci
- require 'codeclimate-test-reporter'
- @output.puts '[COVERAGE] Running with SimpleCov Simple Formatter and CodeClimate Test Reporter'
- formatters = [
- SimpleCov::Formatter::SimpleFormatter,
- CodeClimate::TestReporter::Formatter
- ]
- else
- @output.puts '[COVERAGE] Running with SimpleCov HTML Formatter'
- formatters = [SimpleCov::Formatter::HTMLFormatter]
- end
- else
- formatters = []
- end
- SimpleCov.formatters = formatters
-end
-# rubocop:enable Style/MultilineBlockChain
diff --git a/README.md b/README.md
index 295ed228..88033a3e 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,6 @@
-
|
diff --git a/Rakefile b/Rakefile
index f45d4479..bb1a08de 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,10 +5,6 @@ begin
rescue LoadError
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
end
-begin
- require 'simplecov'
-rescue LoadError # rubocop:disable Lint/HandleExceptions
-end
import('lib/tasks/rubocop.rake')
Bundler::GemHelper.install_tasks
@@ -56,13 +52,20 @@ namespace :test do
# https://github.com/rails/rails/blob/3d590add45/railties/lib/rails/generators/app_base.rb#L345-L363
_bundle_command = Gem.bin_path('bundler', 'bundle')
require 'bundler'
- Bundler.with_clean_env do
+ with_clean_env = proc do
isolated_test_files.all? do |test_file|
command = "-w -I#{dir}/lib -I#{dir}/test #{Shellwords.shellescape(test_file)}"
full_command = %("#{Gem.ruby}" #{command})
system(full_command)
end or fail 'Failures' # rubocop:disable Style/AndOr
end
+ bundler_method =
+ if Bundler.method_defined?(:with_unbundled_env)
+ :with_unbundled_env
+ else
+ :with_clean_env
+ end
+ Bundler.public_send(bundler_method, &with_clean_env)
end
end
diff --git a/active_model_serializers.gemspec b/active_model_serializers.gemspec
index f37f5a8a..e50275b1 100644
--- a/active_model_serializers.gemspec
+++ b/active_model_serializers.gemspec
@@ -55,9 +55,8 @@ Gem::Specification.new do |spec|
spec.add_development_dependency 'will_paginate', '~> 3.0', '>= 3.0.7'
spec.add_development_dependency 'bundler'
- spec.add_development_dependency 'simplecov', '>= 0.11'
spec.add_development_dependency 'timecop', '~> 0.7'
- spec.add_development_dependency 'grape', ['>= 0.13', '< 0.19.1']
+ spec.add_development_dependency 'grape', '>= 0.13'
spec.add_development_dependency 'json_schema'
- spec.add_development_dependency 'rake', ['>= 10.0', '< 13.0']
+ spec.add_development_dependency 'rake', '>= 10.0'
end
diff --git a/docs/STYLE.md b/docs/STYLE.md
index ccd75dd4..236c5138 100644
--- a/docs/STYLE.md
+++ b/docs/STYLE.md
@@ -18,8 +18,6 @@
- [Improve code quality](https://codeclimate.com/github/rails-api/active_model_serializers/code?sort=smell_count&sort_direction=desc).
-- [Improve amount of code exercised by tests](https://codeclimate.com/github/rails-api/active_model_serializers/coverage?sort=covered_percent&sort_direction=asc).
-
- [Fix RuboCop (Style) TODOS](https://github.com/rails-api/active_model_serializers/blob/master/.rubocop_todo.yml).
- Delete and offsense, run `rake rubocop` (or possibly `rake rubocop:auto_correct`),
and [submit a PR](CONTRIBUTING.md#submitting-a-pull-request-pr).
diff --git a/test/action_controller/explicit_serializer_test.rb b/test/action_controller/explicit_serializer_test.rb
index 71df54b2..2d39e7b6 100644
--- a/test/action_controller/explicit_serializer_test.rb
+++ b/test/action_controller/explicit_serializer_test.rb
@@ -71,13 +71,13 @@ module ActionController
def test_render_using_explicit_serializer
get :render_using_explicit_serializer
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal '{"name":"Name 1"}', @response.body
end
def test_render_array_using_explicit_serializer
get :render_array_using_explicit_serializer
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
expected = [
{ 'name' => 'Name 1' },
@@ -89,7 +89,7 @@ module ActionController
def test_render_array_using_implicit_serializer
get :render_array_using_implicit_serializer
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
expected = [
{ 'name' => 'Name 1' },
diff --git a/test/action_controller/serialization_test.rb b/test/action_controller/serialization_test.rb
index 6e9bb454..8d360b6f 100644
--- a/test/action_controller/serialization_test.rb
+++ b/test/action_controller/serialization_test.rb
@@ -155,7 +155,7 @@ module ActionController
description: 'Description 1'
}
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body
end
@@ -174,7 +174,7 @@ module ActionController
}
}
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body
end
@@ -183,7 +183,7 @@ module ActionController
get :render_array_using_custom_root
end
expected = { custom_root: [{ name: 'Name 1', description: 'Description 1' }] }
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body
end
@@ -193,7 +193,7 @@ module ActionController
end
expected = { custom_root: [] }
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body
end
@@ -203,14 +203,14 @@ module ActionController
end
expected = { custom_root: { name: 'Name 1', description: 'Description 1' } }
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body
end
def test_render_json_object_without_serializer
get :render_json_object_without_serializer
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
expected_body = { error: 'Result is Invalid' }
assert_equal expected_body.to_json, @response.body
end
@@ -218,14 +218,14 @@ module ActionController
def test_render_json_array_object_without_serializer
get :render_json_array_object_without_serializer
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
expected_body = [{ error: 'Result is Invalid' }]
assert_equal expected_body.to_json, @response.body
end
def test_render_array_using_implicit_serializer
get :render_array_using_implicit_serializer
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
expected = [
{
@@ -261,7 +261,7 @@ module ActionController
}
}
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body
end
@@ -284,7 +284,7 @@ module ActionController
}
}
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body
end
@@ -313,7 +313,7 @@ module ActionController
Timecop.freeze(Time.zone.now) do
get :render_object_with_cache_enabled
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected.to_json, @response.body
get :render_changed_object_with_cache_enabled
@@ -349,7 +349,7 @@ module ActionController
}
}
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
actual = @response.body
expected = expected.to_json
if ENV['APPVEYOR'] && actual != expected
@@ -364,7 +364,7 @@ module ActionController
get :render_fragment_changed_object_with_only_cache_enabled
response = JSON.parse(@response.body)
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal 'ZOMG A ROLE', response['name']
assert_equal 'HUEHUEBRBR', response['description']
end
@@ -374,7 +374,7 @@ module ActionController
get :render_fragment_changed_object_with_except_cache_enabled
response = JSON.parse(@response.body)
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal 5, response['rating']
assert_equal 'lol', response['content']
end
@@ -395,7 +395,7 @@ module ActionController
}
}
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
assert_equal expected_return, response
end
end
@@ -426,7 +426,7 @@ module ActionController
get :update_and_render_object_with_cache_enabled
- assert_equal 'application/json', @response.content_type
+ assert_match(%r{\Aapplication/json}, @response.content_type)
actual = @response.body
expected = expected.to_json
if ENV['APPVEYOR'] && actual != expected
diff --git a/test/grape_test.rb b/test/grape_test.rb
deleted file mode 100644
index 3abcd1db..00000000
--- a/test/grape_test.rb
+++ /dev/null
@@ -1,198 +0,0 @@
-# frozen_string_literal: true
-
-require 'test_helper'
-TestHelper.silence_warnings do
- require 'grape'
-end
-require 'grape/active_model_serializers'
-require 'kaminari'
-require 'kaminari/hooks'
-::Kaminari::Hooks.init
-
-module ActiveModelSerializers
- class GrapeTest < ActiveSupport::TestCase
- include Rack::Test::Methods
- module Models
- def self.model1
- ARModels::Post.new(id: 1, title: 'Dummy Title', body: 'Lorem Ipsum')
- end
-
- def self.model2
- ARModels::Post.new(id: 2, title: 'Second Dummy Title', body: 'Second Lorem Ipsum')
- end
-
- def self.all
- @all ||=
- begin
- model1.save!
- model2.save!
- ARModels::Post.all
- end
- end
-
- def self.reset_all
- ARModels::Post.delete_all
- @all = nil
- end
-
- def self.collection_per
- 2
- end
-
- def self.collection
- @collection ||=
- begin
- Kaminari.paginate_array(
- [
- Profile.new(id: 1, name: 'Name 1', description: 'Description 1', comments: 'Comments 1'),
- Profile.new(id: 2, name: 'Name 2', description: 'Description 2', comments: 'Comments 2'),
- Profile.new(id: 3, name: 'Name 3', description: 'Description 3', comments: 'Comments 3'),
- Profile.new(id: 4, name: 'Name 4', description: 'Description 4', comments: 'Comments 4'),
- Profile.new(id: 5, name: 'Name 5', description: 'Description 5', comments: 'Comments 5')
- ]
- ).page(1).per(collection_per)
- end
- end
- end
-
- class GrapeTest < Grape::API
- format :json
- TestHelper.silence_warnings do
- include Grape::ActiveModelSerializers
- end
-
- def self.resources(*)
- TestHelper.silence_warnings do
- super
- end
- end
-
- resources :grape do
- get '/render' do
- render Models.model1
- end
-
- get '/render_with_json_api' do
- post = Models.model1
- render post, meta: { page: 1, total_pages: 2 }, adapter: :json_api
- end
-
- get '/render_array_with_json_api' do
- posts = Models.all
- render posts, adapter: :json_api
- end
-
- get '/render_collection_with_json_api' do
- posts = Models.collection
- render posts, adapter: :json_api
- end
-
- get '/render_with_implicit_formatter' do
- Models.model1
- end
-
- get '/render_array_with_implicit_formatter' do
- Models.all
- end
-
- get '/render_collection_with_implicit_formatter' do
- Models.collection
- end
- end
- end
-
- def app
- Grape::Middleware::Globals.new(GrapeTest.new)
- end
-
- extend Minitest::Assertions
- def self.run_one_method(*)
- _, stderr = capture_io do
- super
- end
- fail Minitest::Assertion, stderr if stderr !~ /grape/
- end
-
- def test_formatter_returns_json
- get '/grape/render'
-
- post = Models.model1
- serializable_resource = serializable(post)
-
- assert last_response.ok?
- assert_equal serializable_resource.to_json, last_response.body
- end
-
- def test_render_helper_passes_through_options_correctly
- get '/grape/render_with_json_api'
-
- post = Models.model1
- serializable_resource = serializable(post, serializer: ARModels::PostSerializer, adapter: :json_api, meta: { page: 1, total_pages: 2 })
-
- assert last_response.ok?
- assert_equal serializable_resource.to_json, last_response.body
- end
-
- def test_formatter_handles_arrays
- get '/grape/render_array_with_json_api'
-
- posts = Models.all
- serializable_resource = serializable(posts, adapter: :json_api)
-
- assert last_response.ok?
- assert_equal serializable_resource.to_json, last_response.body
- ensure
- Models.reset_all
- end
-
- def test_formatter_handles_collections
- get '/grape/render_collection_with_json_api'
- assert last_response.ok?
-
- representation = JSON.parse(last_response.body)
- assert representation.include?('data')
- assert representation['data'].count == Models.collection_per
- assert representation.include?('links')
- assert representation['links'].count > 0
- end
-
- def test_implicit_formatter
- post = Models.model1
- serializable_resource = serializable(post, adapter: :json_api)
-
- with_adapter :json_api do
- get '/grape/render_with_implicit_formatter'
- end
-
- assert last_response.ok?
- assert_equal serializable_resource.to_json, last_response.body
- end
-
- def test_implicit_formatter_handles_arrays
- posts = Models.all
- serializable_resource = serializable(posts, adapter: :json_api)
-
- with_adapter :json_api do
- get '/grape/render_array_with_implicit_formatter'
- end
-
- assert last_response.ok?
- assert_equal serializable_resource.to_json, last_response.body
- ensure
- Models.reset_all
- end
-
- def test_implicit_formatter_handles_collections
- with_adapter :json_api do
- get '/grape/render_collection_with_implicit_formatter'
- end
-
- representation = JSON.parse(last_response.body)
- assert last_response.ok?
- assert representation.include?('data')
- assert representation['data'].count == Models.collection_per
- assert representation.include?('links')
- assert representation['links'].count > 0
- end
- end
-end
diff --git a/test/support/isolated_unit.rb b/test/support/isolated_unit.rb
index 968ae007..b83e0b29 100644
--- a/test/support/isolated_unit.rb
+++ b/test/support/isolated_unit.rb
@@ -68,6 +68,7 @@ module TestHelpers
fake_logger = Logger.new(nil)
config.logger = fake_logger
Rails.application.routes.default_url_options = { host: 'example.com' }
+ config.hosts << 'www.example.com' if Rails.version >= '6.0'
end
def app.name; 'IsolatedRailsApp'; end # rubocop:disable Style/SingleLineMethods
app.respond_to?(:secrets) && app.secrets.secret_key_base = '3b7cd727ee24e8444053437c36cc66c4'
diff --git a/test/support/rails_app.rb b/test/support/rails_app.rb
index 5f81d434..26cc770e 100644
--- a/test/support/rails_app.rb
+++ b/test/support/rails_app.rb
@@ -14,6 +14,8 @@ module ActiveModelSerializers
end
config.filter_parameters += [:password]
+
+ config.hosts << 'www.example.com' if Rails.version >= '6.0'
end
app.routes.default_url_options = { host: 'example.com' }
diff --git a/test/test_helper.rb b/test/test_helper.rb
index e8f60cc9..7d8ca63e 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -4,13 +4,6 @@
ENV['RAILS_ENV'] = 'test'
require 'bundler/setup'
-begin
- require 'simplecov'
- AppCoverage.start
-rescue LoadError
- STDERR.puts 'Running without SimpleCov'
-end
-
require 'pry'
require 'timecop'
require 'rails'