Compare commits

...

27 commits

Author SHA1 Message Date
c985c86410
Merge pull request #103 from samsonjs/ruby-4
Add Ruby 4.0.0 to test matrix
2026-01-02 11:52:32 -08:00
55f3861ae3
Set default Grape version to ~> 3.0.0 in Gemfile 2026-01-02 11:50:51 -08:00
af29f9c76e
Add Ruby 4.0.0 to test matrix 2026-01-02 11:50:39 -08:00
7ca250a305
Preparing for next development iteration, 2.0.2. 2025-12-08 13:42:40 -08:00
61673fe322
Preparing for release, 2.0.1. 2025-12-08 13:40:57 -08:00
26767f5fac
Merge pull request #100 from samsonjs/fix/99-grape-3-support
Add support for Grape 3.0 and test in CI
2025-12-08 13:36:32 -08:00
6f1e4037bc
Add support for Grape 3.0 and test in CI 2025-12-08 13:31:38 -08:00
Mateus Nava
cce31fe187
fix: Accept nil serializer (#92)
* fix: Accept nil serializer

* Obey the law

---------

Co-authored-by: Mateus Nava <mateus.nava@corp.globo.com>
Co-authored-by: Sami Samhuri <sami@samhuri.net>
2025-06-08 09:21:41 -04:00
7f759b6560
Preparing for next development iteration, 2.0.1. 2025-06-02 19:09:00 -07:00
1a1c8b8173
Preparing for release, 2.0.0. 2025-06-02 19:04:32 -07:00
9941241efc
Update RELEASING.md with correct changelog format 2025-06-02 19:04:13 -07:00
Daniel (dB.) Doubrovkine
6ca5a7c5cf
Merge pull request #98 from samsonjs/ci-github-actions
Switch to GitHub Actions for CI and update dependencies
2025-05-26 07:13:10 -04:00
b609ebc639
Use GitHub Actions for build status badge in Readme 2025-05-25 14:38:50 -07:00
dcc17a065d
PR feedback: fix Danger's GitHub token, run on all branches 2025-05-25 14:34:16 -07:00
0da8ef5bd3
Split up workflow into 2 jobs 2025-05-24 16:12:34 -07:00
0a11b5d101
Out with Travis CI, in with GitHub Actions
* Update dependencies and appease the robot overlords, rubocop and
  danger.
2025-05-24 15:59:00 -07:00
096fd41c11
Bump version to 2.0 and update changelog 2025-04-23 15:27:00 -07:00
7e58753b76
Fix compatibility with Grape 2.3 2025-04-23 15:23:37 -07:00
Daniel Doubrovkine (dB.) @dblockdotorg
eb200812c8
Merge pull request #89 from olleolleolle/patch-1
README: Remove defunct badge
2019-01-28 15:48:16 -05:00
Olle Jonsson
a8ecfa3daf
README: Remove defunct badge 2019-01-27 23:47:20 +01:00
Daniel Doubrovkine (dB.) @dblockdotorg
7e9c064f88
Merge pull request #87 from dblock/rubocop-0.53.0
Upgraded RuboCop to 0.53.0.
2018-03-14 15:36:56 -04:00
dblock
791c1b0f5e Moved development gems out of .gemspec. 2018-03-14 14:59:50 -04:00
dblock
7670d9aed7 Upgraded RuboCop to 0.53.0. 2018-03-14 14:58:08 -04:00
Daniel Doubrovkine (dB.) @dblockdotorg
1995ba4676
Merge pull request #86 from dblock/fix-bigger-equal
Fix: markdown for >=.
2018-03-14 14:56:39 -04:00
dblock
fcb4c3a8c5 Fix: markdown for >=. 2018-03-14 14:56:04 -04:00
dblock
27ad60099e Fix ruby-grape links. [ci skip] 2018-03-14 14:51:53 -04:00
dblock
003e69d2bb Preparing for next development iteration, 1.5.3. Closes #84. 2018-03-14 14:50:16 -04:00
25 changed files with 208 additions and 137 deletions

38
.github/workflows/ci.yml vendored Normal file
View file

@ -0,0 +1,38 @@
name: CI
on: [push, pull_request]
jobs:
danger:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1
with:
ruby-version: 4.0.0
- name: Install dependencies
run: bundle install --jobs 4 --retry 3
- name: Run Danger
run: |
# the token is public, has public_repo scope and belongs to the grape-bot user owned by @dblock, this is ok
TOKEN=$(echo -n Z2hwX2lYb0dPNXNyejYzOFJyaTV3QUxUdkNiS1dtblFwZTFuRXpmMwo= | base64 --decode)
DANGER_GITHUB_API_TOKEN=$TOKEN bundle exec danger --verbose
test:
runs-on: ubuntu-latest
strategy:
matrix:
ruby-version: [4.0.0, 3.4.8, 3.3.10, 3.2.9]
grape-version: ['~> 3.0.0', '~> 2.3.0']
steps:
- uses: actions/checkout@v6
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby-version }}
- name: Install dependencies
run: bundle install --jobs 4 --retry 3
env:
GRAPE_VERSION: ${{ matrix.grape-version }}
- name: Run tests
run: bundle exec rake
env:
GRAPE_VERSION: ${{ matrix.grape-version }}

View file

@ -4,6 +4,10 @@ AllCops:
Exclude: Exclude:
- Guardfile - Guardfile
- grape-active_model_serializers.gemspec - grape-active_model_serializers.gemspec
NewCops: enable
Style/BlockDelimiters: Style/BlockDelimiters:
Enabled: false Enabled: false
Style/FrozenStringLiteralComment:
Enabled: false

View file

@ -1,33 +1,47 @@
# This configuration was generated by # This configuration was generated by
# `rubocop --auto-gen-config` # `rubocop --auto-gen-config`
# on 2017-10-09 10:22:52 -0500 using RuboCop version 0.41.2. # on 2018-03-14 14:59:23 -0400 using RuboCop version 0.53.0.
# The point is for the user to remove these configuration records # The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base. # one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new # Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again. # versions of RuboCop, may require this file to be generated again.
# Offense count: 1
# Configuration parameters: Include.
# Include: **/*.gemfile, **/Gemfile, **/gems.rb
Bundler/DuplicatedGem:
Exclude:
- 'Gemfile'
# Offense count: 1 # Offense count: 1
Metrics/AbcSize: Metrics/AbcSize:
Max: 18 Max: 18
# Offense count: 23
# Configuration parameters: CountComments, ExcludedMethods.
Metrics/BlockLength:
Max: 133
# Offense count: 1 # Offense count: 1
Metrics/CyclomaticComplexity: Metrics/CyclomaticComplexity:
Max: 9 Max: 9
# Offense count: 1
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
# URISchemes: http, https
Metrics/LineLength:
Max: 87
# Offense count: 1 # Offense count: 1
# Configuration parameters: CountComments. # Configuration parameters: CountComments.
Metrics/MethodLength: Metrics/MethodLength:
Max: 18 Max: 15
# Offense count: 1 # Offense count: 1
Metrics/PerceivedComplexity: Metrics/PerceivedComplexity:
Max: 11 Max: 10
# Offense count: 2
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
Naming/FileName:
Exclude:
- 'lib/grape-active_model_serializers.rb'
- 'spec/grape-active_model_serializers_spec.rb'
# Offense count: 5 # Offense count: 5
Style/Documentation: Style/Documentation:
@ -40,9 +54,18 @@ Style/Documentation:
- 'lib/grape-active_model_serializers/options_builder.rb' - 'lib/grape-active_model_serializers/options_builder.rb'
- 'lib/grape-active_model_serializers/serializer_resolver.rb' - 'lib/grape-active_model_serializers/serializer_resolver.rb'
# Offense count: 2 # Offense count: 1
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts. # Configuration parameters: MinBodyLength.
Style/FileName: Style/GuardClause:
Exclude: Exclude:
- 'lib/grape-active_model_serializers.rb' - 'lib/grape-active_model_serializers/serializer_resolver.rb'
- 'spec/grape-active_model_serializers_spec.rb'
# Offense count: 2
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
# URISchemes: http, https
Layout/LineLength:
Max: 87
Lint/ConstantDefinitionInBlock:
Exclude:
- spec/integration/sequel_spec.rb

View file

@ -1,39 +0,0 @@
language: ruby
sudo: false
matrix:
include:
- rvm: 2.5.0
script:
- bundle exec danger
- rvm: 2.5.0
env: GRAPE_VERSION=0.8.0
- rvm: 2.5.0
env: GRAPE_VERSION=0.9.0
- rvm: 2.5.0
env: GRAPE_VERSION=0.10.1
- rvm: 2.5.0
env: GRAPE_VERSION=0.12.0
- rvm: 2.5.0
env: GRAPE_VERSION=0.13.0
- rvm: 2.5.0
env: GRAPE_VERSION=0.14.0
- rvm: 2.5.0
env: GRAPE_VERSION=0.15.0
- rvm: 2.5.0
env: GRAPE_VERSION=0.16.2
- rvm: 2.5.0
env: GRAPE_VERSION=HEAD
- rvm: 2.4.3
- rvm: 2.3.6
- rvm: 2.2.9
- rvm: rbx-2
- rvm: jruby-19mode
- rvm: ruby-head
- rvm: jruby-head
allow_failures:
- rvm: rbx-2
- rvm: jruby-19mode
- rvm: ruby-head
- rvm: jruby-head

View file

@ -1,17 +1,31 @@
## Changelog ## Changelog
### 1.5.2 (March 14, 2018) ### 2.0.2 (Next)
* Your contribution here.
### 2.0.1 (2025/12/08)
* [#92](https://github.com/ruby-grape/grape-active_model_serializers/pull/92): Fix: accept nil serializer - [@mateusnava](https://github.com/mateusnava).
* [#100](https://github.com/ruby-grape/grape-active_model_serializers/pull/100): Fix compatibility with Grape 3.0 and test in CI - [@samsonjs](https://github.com/samsonjs).
### 2.0.0 (2025/06/02)
* [#96](https://github.com/ruby-grape/grape-active_model_serializers/pull/96): Add compatibility for Grape 2.3 - [@samsonjs](https://github.com/samsonjs).
* [#98](https://github.com/ruby-grape/grape-active_model_serializers/pull/98): Out with Travis CI, in with GitHub Actions - [@samsonjs](https://github.com/samsonjs).
### 1.5.2 (2018/03/14)
* [#76](https://github.com/ruby-grape/grape-active_model_serializers/pull/76): Add custom error formatter - [@xn](https://github.com/xn). * [#76](https://github.com/ruby-grape/grape-active_model_serializers/pull/76): Add custom error formatter - [@xn](https://github.com/xn).
### 1.5.1 (April 25, 2017) ### 1.5.1 (2017/04/25)
* [#74](https://github.com/ruby-grape/grape-active_model_serializers/pull/74): Add support for Sequel - [@drn](https://github.com/drn). * [#74](https://github.com/ruby-grape/grape-active_model_serializers/pull/74): Add support for Sequel - [@drn](https://github.com/drn).
* [#73](https://github.com/ruby-grape/grape-active_model_serializers/pull/73): Ensure all AMS options are passed through - [@drn](https://github.com/drn). * [#73](https://github.com/ruby-grape/grape-active_model_serializers/pull/73): Ensure all AMS options are passed through - [@drn](https://github.com/drn).
* [#65](https://github.com/ruby-grape/grape-active_model_serializers/pull/65): Added Danger, PR linter - [@dblock](https://github.com/dblock). * [#65](https://github.com/ruby-grape/grape-active_model_serializers/pull/65): Added Danger, PR linter - [@dblock](https://github.com/dblock).
* [#63](https://github.com/ruby-grape/grape-active_model_serializers/pull/63): Pass adapter options through render - [@drn](https://github.com/drn). * [#63](https://github.com/ruby-grape/grape-active_model_serializers/pull/63): Pass adapter options through render - [@drn](https://github.com/drn).
### 1.5.0 (August 24, 2016) ### 1.5.0 (2016/08/24)
* [#61](https://github.com/ruby-grape/grape-active_model_serializers/pull/61): Adds support for collection serializers - [@drn](https://github.com/drn). * [#61](https://github.com/ruby-grape/grape-active_model_serializers/pull/61): Adds support for collection serializers - [@drn](https://github.com/drn).
* [#60](https://github.com/ruby-grape/grape-active_model_serializers/pull/60): Namespace serializer inference - [@drn](https://github.com/drn). * [#60](https://github.com/ruby-grape/grape-active_model_serializers/pull/60): Namespace serializer inference - [@drn](https://github.com/drn).
@ -19,22 +33,22 @@
* [#57](https://github.com/ruby-grape/grape-active_model_serializers/pull/57): Solve line length linter issues - [@drn](https://github.com/drn). * [#57](https://github.com/ruby-grape/grape-active_model_serializers/pull/57): Solve line length linter issues - [@drn](https://github.com/drn).
* [#54](https://github.com/ruby-grape/grape-active_model_serializers/pull/54): Adding support for ASM v0.10. Drops support for ASM v0.9 - [@drn](https://github.com/drn). * [#54](https://github.com/ruby-grape/grape-active_model_serializers/pull/54): Adding support for ASM v0.10. Drops support for ASM v0.9 - [@drn](https://github.com/drn).
### 1.4.0 (July 14, 2016) ### 1.4.0 (2016/07/14)
* [#49](https://github.com/ruby-grape/grape-active_model_serializers/pull/49): Adds support for active model serializer namespace - [@syntaxTerr0r](https://github.com/syntaxTerr0r). * [#49](https://github.com/ruby-grape/grape-active_model_serializers/pull/49): Adds support for active model serializer namespace - [@syntaxTerr0r](https://github.com/syntaxTerr0r).
* [#36](https://github.com/ruby-grape/grape-active_model_serializers/pull/36), [#50](https://github.com/jrhe/grape-active_model_serializers/pull/50): Added support through Grape 0.16.x - [@dblock](https://github.com/dblock). * [#36](https://github.com/ruby-grape/grape-active_model_serializers/pull/36), [#50](https://github.com/jrhe/grape-active_model_serializers/pull/50): Added support through Grape 0.16.x - [@dblock](https://github.com/dblock).
### v1.3.2 (February 27, 2015) ### 1.3.2 (2015/02/27)
* [#40](https://github.com/ruby-grape/grape-active_model_serializers/pull/40): Use env to pass AMS meta around - [@dblock](https://github.com/dblock). * [#40](https://github.com/ruby-grape/grape-active_model_serializers/pull/40): Use env to pass AMS meta around - [@dblock](https://github.com/dblock).
* [#39](https://github.com/ruby-grape/grape-active_model_serializers/pull/39): Look for namespace and other options to configure serializers - [@jwkoelewijn](https://github.com/jwkoelewijn). * [#39](https://github.com/ruby-grape/grape-active_model_serializers/pull/39): Look for namespace and other options to configure serializers - [@jwkoelewijn](https://github.com/jwkoelewijn).
### v1.3.1 (November 20, 2014) ### 1.3.1 (2014/11/20)
* [#30](https://github.com/ruby-grape/grape-active_model_serializers/pull/30): Read options from default_serializer_options - [@siong1987](https://github.com/siong1987). * [#30](https://github.com/ruby-grape/grape-active_model_serializers/pull/30): Read options from default_serializer_options - [@siong1987](https://github.com/siong1987).
* [#24](https://github.com/ruby-grape/grape-active_model_serializers/pull/24): Makes it possible to use `current_user` within serializers - [@sonxurxo](https://github.com/sonxurxo). * [#24](https://github.com/ruby-grape/grape-active_model_serializers/pull/24): Makes it possible to use `current_user` within serializers - [@sonxurxo](https://github.com/sonxurxo).
### v1.2.1 (July 23, 2014) ### 1.2.1 (2014/07/23)
* [#21](https://github.com/ruby-grape/grape-active_model_serializers/pull/21): Correctly fetch serialization scope - [@radanskoric](https://github.com/radanskoric). * [#21](https://github.com/ruby-grape/grape-active_model_serializers/pull/21): Correctly fetch serialization scope - [@radanskoric](https://github.com/radanskoric).
* [#18](https://github.com/ruby-grape/grape-active_model_serializers/pull/18): Added support for active model serializer 0.9.x - [@sbounmy](https://github.com/sbounmy). * [#18](https://github.com/ruby-grape/grape-active_model_serializers/pull/18): Added support for active model serializer 0.9.x - [@sbounmy](https://github.com/sbounmy).
@ -44,12 +58,12 @@
* [#12](https://github.com/ruby-grape/grape-active_model_serializers/pull/12): Added support for `current_user` - [@kpassapk](https://github.com/kpassapk). * [#12](https://github.com/ruby-grape/grape-active_model_serializers/pull/12): Added support for `current_user` - [@kpassapk](https://github.com/kpassapk).
* [#11](https://github.com/ruby-grape/grape-active_model_serializers/pull/11): Fixed require path - [@schickling](https://github.com/schickling). * [#11](https://github.com/ruby-grape/grape-active_model_serializers/pull/11): Fixed require path - [@schickling](https://github.com/schickling).
### v1.0.1 (September 9, 2013) ### 1.0.1 (2013/09/09)
* [#6](https://github.com/ruby-grape/grape-active_model_serializers/pull/6): Conform to ActiveModel::Serializers way of determining array-ness - [@tfe](https://github.com/tfe). * [#6](https://github.com/ruby-grape/grape-active_model_serializers/pull/6): Conform to ActiveModel::Serializers way of determining array-ness - [@tfe](https://github.com/tfe).
* [#4](https://github.com/ruby-grape/grape-active_model_serializers/pull/4): Support for namespace options and rely more on active_model_serializers - [@johnallen3d](https://github.com/johnallen3d). * [#4](https://github.com/ruby-grape/grape-active_model_serializers/pull/4): Support for namespace options and rely more on active_model_serializers - [@johnallen3d](https://github.com/johnallen3d).
* [#1](https://github.com/ruby-grape/grape-active_model_serializers/pull/1): Fix: Grape::ActiveModelSerializers for models with compound names - [@george](https://github.com/george). * [#1](https://github.com/ruby-grape/grape-active_model_serializers/pull/1): Fix: Grape::ActiveModelSerializers for models with compound names - [@george](https://github.com/george).
### v1.0.0 ### 1.0.0 (2013/09/09)
* Initial public release - [@jrhe](https://github.com/jrhe). * Initial public release - [@jrhe](https://github.com/jrhe).

15
Gemfile
View file

@ -2,7 +2,7 @@ source 'https://rubygems.org'
gemspec gemspec
case version = ENV['GRAPE_VERSION'] || '~> 1.0.0' case version = ENV['GRAPE_VERSION'] || '~> 3.0.0'
when 'HEAD' when 'HEAD'
gem 'grape', github: 'intridea/grape' gem 'grape', github: 'intridea/grape'
else else
@ -10,7 +10,16 @@ else
end end
group :test do group :test do
gem 'rack-test'
gem 'ruby-grape-danger', '~> 0.2.0', require: false
gem 'sequel', '~> 5.91', require: false
gem 'sqlite3' gem 'sqlite3'
gem 'sequel', '~> 4.37', require: false end
gem 'ruby-grape-danger', '~> 0.1.0', require: false
group :development, :test do
gem 'guard-rspec'
gem 'listen', '~> 3.9.0'
gem 'rake'
gem 'rspec'
gem 'rubocop', '1.75.7'
end end

View file

@ -1,9 +1,29 @@
# Table of Contents
- [Grape::ActiveModelSerializers](#grapeactivemodelserializers)
- [Installation](#installation)
- [Dependencies](#dependencies)
- [Usage](#usage)
- [Require grape-active_model_serializers](#require-grape-active_model_serializers)
- [Tell your API to use Grape::Formatter::ActiveModelSerializers](#tell-your-api-to-use-grapeformatteractivemodelserializers)
- [Writing Serializers](#writing-serializers)
- [Serializers are inferred by active_record model names](#serializers-are-inferred-by-active_record-model-names)
- [Array Roots](#array-roots)
- [API Versioning](#api-versioning)
- [Manually specifying serializer / adapter options](#manually-specifying-serializer--adapter-options)
- [Custom Metadata](#custom-metadata)
- [Default Serializer Options](#default-serializer-options)
- [Current User](#current-user)
- [Full Example](#full-example)
- [Contributing](#contributing)
- [History](#history)
# Grape::ActiveModelSerializers # Grape::ActiveModelSerializers
Use [active_model_serializers](https://github.com/rails-api/active_model_serializers) with [Grape](https://github.com/intridea/grape)! Use [active_model_serializers](https://github.com/rails-api/active_model_serializers) with [Grape](https://github.com/intridea/grape)!
[![Gem Version](https://badge.fury.io/rb/grape-active_model_serializers.svg)](https://badge.fury.io/rb/grape-active_model_serializers) [![Gem Version](https://badge.fury.io/rb/grape-active_model_serializers.svg)](https://badge.fury.io/rb/grape-active_model_serializers)
[![Build Status](https://api.travis-ci.org/ruby-grape/grape-active_model_serializers.svg)](http://travis-ci.org/ruby-grape/grape-active_model_serializers) [![Dependency Status](https://gemnasium.com/ruby-grape/grape-active_model_serializers.svg)](https://gemnasium.com/ruby-grape/grape-active_model_serializers) [![Code Climate](https://codeclimate.com/github/ruby-grape/grape-active_model_serializers.svg)](https://codeclimate.com/github/ruby-grape/grape-active_model_serializers) [![Build Status](https://github.com/ruby-grape/grape-active_model_serializers/actions/workflows/ci.yml/badge.svg)](https://github.com/ruby-grape/grape-active_model_serializers/actions/workflows/ci.yml) [![Code Climate](https://codeclimate.com/github/ruby-grape/grape-active_model_serializers.svg)](https://codeclimate.com/github/ruby-grape/grape-active_model_serializers)
## Installation ## Installation
@ -17,9 +37,9 @@ See [UPGRADING](UPGRADING.md) if you're upgrading from a previous version.
## Dependencies ## Dependencies
* >= Ruby v2.2 * &gt;= Ruby v3.1
* >= [grape](https://github.com/intridea/grape) v0.8.0 * &gt;= [grape](https://github.com/ruby-grape/grape) v2.3.0
* >= [active_model_serializers](https://github.com/rails-api/active_model_serializers) v0.10.0 * &gt;= [active_model_serializers](https://github.com/rails-api/active_model_serializers) v0.10.0
## Usage ## Usage
@ -283,4 +303,4 @@ See [CONTRIBUTING](CONTRIBUTING.md).
## History ## History
Structured and based upon [grape-rabl](https://github.com/LTe/grape-rabl). Structured and based upon [grape-rabl](https://github.com/ruby-grape/grape-rabl).

View file

@ -11,12 +11,12 @@ bundle install
rake rake
``` ```
Check that the last build succeeded in [Travis CI](https://travis-ci.org/ruby-grape/grape-active_model_serializers) for all supported platforms. Check that the last build succeeded in [GitHub Actions](https://github.com/ruby-grape/grape-active_model_serializers/actions/workflows/ci.yml) for all supported platforms.
Change "Next Release" in [CHANGELOG.md](CHANGELOG.md) to the new version. Change "Next Release" in [CHANGELOG.md](CHANGELOG.md) to the new version.
``` ```
### 0.7.2 (February 6, 2014) ### 0.7.2 (2014/02/06)
``` ```
Remove the line with "Your contribution here.", since there will be no more contributions to this release. Remove the line with "Your contribution here.", since there will be no more contributions to this release.

3
Rakefile Normal file → Executable file
View file

@ -1,4 +1,5 @@
#!/usr/bin/env rake #!/usr/bin/env rake
require 'bundler/gem_tasks' require 'bundler/gem_tasks'
require 'rspec/core' require 'rspec/core'
@ -11,4 +12,4 @@ end
require 'rubocop/rake_task' require 'rubocop/rake_task'
RuboCop::RakeTask.new(:rubocop) RuboCop::RakeTask.new(:rubocop)
task default: [:rubocop, :spec] task default: %i[rubocop spec]

View file

@ -16,13 +16,6 @@ Gem::Specification.new do |gem|
gem.version = Grape::ActiveModelSerializers::VERSION gem.version = Grape::ActiveModelSerializers::VERSION
gem.licenses = ['MIT'] gem.licenses = ['MIT']
gem.add_dependency 'grape', '>= 0.8.0' gem.add_dependency 'grape', '>= 2.3.0'
gem.add_dependency 'active_model_serializers', '>= 0.10.0' gem.add_dependency 'active_model_serializers', '>= 0.10.0'
gem.add_development_dependency 'listen', '~> 3.0.7'
gem.add_development_dependency 'rspec'
gem.add_development_dependency 'rack-test'
gem.add_development_dependency 'rake'
gem.add_development_dependency 'guard-rspec'
gem.add_development_dependency 'rubocop', '0.41.2'
end end

View file

@ -32,6 +32,7 @@ module Grape
def serialization_scope def serialization_scope
return unless _serialization_scope return unless _serialization_scope
return unless respond_to?(_serialization_scope, true) return unless respond_to?(_serialization_scope, true)
send(_serialization_scope) send(_serialization_scope)
end end
end end
@ -50,12 +51,10 @@ module Grape
resources resources
end end
def default_serializer_options def default_serializer_options; end
end
def url_options def url_options; end
end
end end
Endpoint.send(:include, EndpointExtension) Endpoint.include EndpointExtension
end end

View file

@ -1,8 +1,6 @@
module Grape module Grape
module ErrorFormatter module ErrorFormatter
module ActiveModelSerializers class ActiveModelSerializers < Base
extend Base
class << self class << self
def call(message, backtrace, options = {}, env = nil, original_exception = nil) def call(message, backtrace, options = {}, env = nil, original_exception = nil)
message = present(message, env) if respond_to?(:present) message = present(message, env) if respond_to?(:present)

View file

@ -1,6 +1,6 @@
module Grape module Grape
module Formatter module Formatter
module ActiveModelSerializers class ActiveModelSerializers
class << self class << self
def call(resource, env) def call(resource, env)
options = build_options(resource, env) options = build_options(resource, env)

View file

@ -7,7 +7,7 @@ module Grape
end end
def options def options
@options ||= ( @options ||= begin
options = endpoint_options options = endpoint_options
options[:scope] = endpoint unless options.key?(:scope) options[:scope] = endpoint unless options.key?(:scope)
options.merge!(default_root_options) unless options.key?(:root) options.merge!(default_root_options) unless options.key?(:root)
@ -15,7 +15,7 @@ module Grape
options.merge!(adapter_options) options.merge!(adapter_options)
options.merge!(extra_options) options.merge!(extra_options)
options options
) end
end end
private private
@ -49,11 +49,7 @@ module Grape
end end
def innermost_scope def innermost_scope
if endpoint.respond_to?(:namespace_stackable) endpoint.inheritable_setting.namespace_stackable[:namespace]&.last
endpoint.namespace_stackable(:namespace).last
else
endpoint.settings.peek[:namespace]
end
end end
def meta_options def meta_options
@ -73,6 +69,7 @@ module Grape
def extra_options def extra_options
options = env['ams_extra'] || {} options = env['ams_extra'] || {}
return options if options.is_a?(Hash) return options if options.is_a?(Hash)
raise 'Extra options must be a hash' raise 'Extra options must be a hash'
end end
end end

View file

@ -7,7 +7,7 @@ module Grape
end end
def serializer def serializer
serializer_class.new(resource, serializer_options) if serializer_class serializer_class&.new(resource, serializer_options)
end end
private private
@ -16,12 +16,15 @@ module Grape
def serializer_class def serializer_class
return @serializer_class if defined?(@serializer_class) return @serializer_class if defined?(@serializer_class)
@serializer_class = resource_defined_class
@serializer_class ||= collection_class return nil if options.key?(:serializer) && options[:serializer].nil?
@serializer_class ||= options[:serializer]
@serializer_class ||= namespace_inferred_class @serializer_class = resource_defined_class ||
@serializer_class ||= version_inferred_class collection_class ||
@serializer_class ||= resource_serializer_class options[:serializer] ||
namespace_inferred_class ||
version_inferred_class ||
resource_serializer_class
end end
def serializer_options def serializer_options
@ -55,12 +58,14 @@ module Grape
def namespace_inferred_class def namespace_inferred_class
return nil unless options.key?(:for) return nil unless options.key?(:for)
namespace = options[:for].to_s.deconstantize namespace = options[:for].to_s.deconstantize
"#{namespace}::#{resource_serializer_klass}".safe_constantize "#{namespace}::#{resource_serializer_klass}".safe_constantize
end end
def version_inferred_class def version_inferred_class
return nil unless options.key?(:version) return nil unless options.key?(:version)
"#{version}::#{resource_serializer_klass}".safe_constantize "#{version}::#{resource_serializer_klass}".safe_constantize
end end

View file

@ -1,5 +1,5 @@
module Grape module Grape
module ActiveModelSerializers module ActiveModelSerializers
VERSION = '1.5.2'.freeze VERSION = '2.0.2'.freeze
end end
end end

View file

@ -5,7 +5,7 @@ describe 'Grape::EndpointExtension' do
subject do subject do
Grape::Endpoint.new( Grape::Endpoint.new(
Grape::Util::InheritableSetting.new, Grape::Util::InheritableSetting.new,
path: '/', path: '/',
method: 'foo' method: 'foo'
) )
end end
@ -27,7 +27,7 @@ describe 'Grape::EndpointExtension' do
describe '#render' do describe '#render' do
let(:env) { {} } let(:env) { {} }
let(:env_key) {} let(:env_key) { nil }
before do before do
allow(subject).to receive(:env).and_return(env) allow(subject).to receive(:env).and_return(env)

View file

@ -4,7 +4,7 @@ require 'grape-active_model_serializers/error_formatter'
describe Grape::ErrorFormatter::ActiveModelSerializers do describe Grape::ErrorFormatter::ActiveModelSerializers do
subject { Grape::ErrorFormatter::ActiveModelSerializers } subject { Grape::ErrorFormatter::ActiveModelSerializers }
let(:backtrace) { ['Line:1'] } let(:backtrace) { ['Line:1'] }
let(:options) { Hash.new } let(:options) { {} }
let(:env) { { 'api.endpoint' => app.endpoints.first } } let(:env) { { 'api.endpoint' => app.endpoints.first } }
let(:original_exception) { StandardError.new('oh noes!') } let(:original_exception) { StandardError.new('oh noes!') }

View file

@ -18,8 +18,8 @@ describe Grape::Formatter::ActiveModelSerializers do
{ {
user: { user: {
first_name: 'JR', first_name: 'JR',
last_name: 'HE', last_name: 'HE',
email: 'jrhe@github.com' email: 'jrhe@github.com'
} }
} }
end end

View file

@ -1,4 +0,0 @@
require 'spec_helper'
describe 'grape-active_model_serializers' do
end

View file

@ -12,7 +12,7 @@ describe Grape::ActiveModelSerializers::OptionsBuilder do
let(:env) { super().merge('ams_meta' => meta_options) } let(:env) { super().merge('ams_meta' => meta_options) }
let(:meta_options) { let(:meta_options) {
{ {
meta: meta, meta: meta,
meta_key: meta_key meta_key: meta_key
} }
} }

View file

@ -15,8 +15,8 @@ describe Grape::ActiveModelSerializers::SerializerResolver do
let(:options) { let(:options) {
{ {
serializer: options_serializer_class, # options defined serializer: options_serializer_class, # options defined
for: V4::UsersApi, # namespace inference for: V4::UsersApi, # namespace inference
version: 'v5' # version inference version: 'v5' # version inference
} }
} }
# resource defined # resource defined
@ -52,6 +52,18 @@ describe Grape::ActiveModelSerializers::SerializerResolver do
expect(serializer).to be_kind_of(serializer_class) expect(serializer).to be_kind_of(serializer_class)
end end
context 'specified nil by options' do
let(:options) {
super().merge(
serializer: nil
)
}
it 'returns nil' do
expect(serializer).to be_nil
end
end
context 'each serializer' do context 'each serializer' do
let(:options) { let(:options) {
super().except(:serializer).merge( super().except(:serializer).merge(

View file

@ -22,6 +22,7 @@ describe 'Sequel Integration' do
let!(:model) { let!(:model) {
SequelUser = Class.new(Sequel::Model(:users)) do SequelUser = Class.new(Sequel::Model(:users)) do
include ActiveModel::Serialization include ActiveModel::Serialization
def self.model_name def self.model_name
'User' 'User'
end end

View file

@ -42,8 +42,8 @@ describe Grape::ActiveModelSerializers do
app.get('/home') do app.get('/home') do
User.new( User.new(
first_name: 'JR', first_name: 'JR',
last_name: 'HE', last_name: 'HE',
email: 'contact@jrhe.co.uk' email: 'contact@jrhe.co.uk'
) )
end end
end end
@ -60,17 +60,17 @@ describe Grape::ActiveModelSerializers do
app.get('/users') do app.get('/users') do
user = User.new( user = User.new(
first_name: 'JR', first_name: 'JR',
last_name: 'HE', last_name: 'HE',
email: 'contact@jrhe.co.uk' email: 'contact@jrhe.co.uk'
) )
[user, user] [user, user]
end end
get '/users' get '/users'
expect(subject).to eq( expect(subject).to eq(
'{"users":['\ '{"users":[' \
'{"first_name":"JR","last_name":"HE"},'\ '{"first_name":"JR","last_name":"HE"},' \
'{"first_name":"JR","last_name":"HE"}'\ '{"first_name":"JR","last_name":"HE"}' \
']}' ']}'
) )
end end
@ -83,8 +83,8 @@ describe Grape::ActiveModelSerializers do
get '/home' get '/home'
expect(subject).to eq( expect(subject).to eq(
'{"blog_post":'\ '{"blog_post":' \
'{"title":"Grape AM::S Rocks!","body":"Really, it does."}'\ '{"title":"Grape AM::S Rocks!","body":"Really, it does."}' \
'}' '}'
) )
end end
@ -93,16 +93,16 @@ describe Grape::ActiveModelSerializers do
app.get('/blog_posts') do app.get('/blog_posts') do
blog_post = BlogPost.new( blog_post = BlogPost.new(
title: 'Grape AM::S Rocks!', title: 'Grape AM::S Rocks!',
body: 'Really, it does.' body: 'Really, it does.'
) )
[blog_post, blog_post] [blog_post, blog_post]
end end
get '/blog_posts' get '/blog_posts'
expect(subject).to eq( expect(subject).to eq(
'{"blog_posts":['\ '{"blog_posts":[' \
'{"title":"Grape AM::S Rocks!","body":"Really, it does."},'\ '{"title":"Grape AM::S Rocks!","body":"Really, it does."},' \
'{"title":"Grape AM::S Rocks!","body":"Really, it does."}'\ '{"title":"Grape AM::S Rocks!","body":"Really, it does."}' \
']}' ']}'
) )
end end
@ -132,9 +132,9 @@ describe Grape::ActiveModelSerializers do
get '/admin/jeff' get '/admin/jeff'
expect(subject).to eq( expect(subject).to eq(
'{"admin":['\ '{"admin":[' \
'{"first_name":"Jeff","last_name":null},'\ '{"first_name":"Jeff","last_name":null},' \
'{"first_name":"Jeff","last_name":null}'\ '{"first_name":"Jeff","last_name":null}' \
']}' ']}'
) )
end end
@ -149,9 +149,9 @@ describe Grape::ActiveModelSerializers do
get '/people' get '/people'
expect(subject).to eq( expect(subject).to eq(
'{"people":['\ '{"people":[' \
'{"first_name":"Jeff","last_name":null},'\ '{"first_name":"Jeff","last_name":null},' \
'{"first_name":"Jeff","last_name":null}'\ '{"first_name":"Jeff","last_name":null}' \
']}' ']}'
) )
end end

View file

@ -15,4 +15,4 @@ RSpec.configure do |config|
config.include Rack::Test::Methods config.include Rack::Test::Methods
end end
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f } Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f }