Compare commits

..

No commits in common. "master" and "v1.5.2" have entirely different histories.

25 changed files with 136 additions and 207 deletions

View file

@ -1,38 +0,0 @@
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,10 +4,6 @@ AllCops:
Exclude:
- Guardfile
- grape-active_model_serializers.gemspec
NewCops: enable
Style/BlockDelimiters:
Enabled: false
Style/FrozenStringLiteralComment:
Enabled: false

View file

@ -1,47 +1,33 @@
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2018-03-14 14:59:23 -0400 using RuboCop version 0.53.0.
# on 2017-10-09 10:22:52 -0500 using RuboCop version 0.41.2.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# 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
Metrics/AbcSize:
Max: 18
# Offense count: 23
# Configuration parameters: CountComments, ExcludedMethods.
Metrics/BlockLength:
Max: 133
# Offense count: 1
Metrics/CyclomaticComplexity:
Max: 9
# Offense count: 1
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
# URISchemes: http, https
Metrics/LineLength:
Max: 87
# Offense count: 1
# Configuration parameters: CountComments.
Metrics/MethodLength:
Max: 15
Max: 18
# Offense count: 1
Metrics/PerceivedComplexity:
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'
Max: 11
# Offense count: 5
Style/Documentation:
@ -54,18 +40,9 @@ Style/Documentation:
- 'lib/grape-active_model_serializers/options_builder.rb'
- 'lib/grape-active_model_serializers/serializer_resolver.rb'
# Offense count: 1
# Configuration parameters: MinBodyLength.
Style/GuardClause:
Exclude:
- 'lib/grape-active_model_serializers/serializer_resolver.rb'
# Offense count: 2
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
# URISchemes: http, https
Layout/LineLength:
Max: 87
Lint/ConstantDefinitionInBlock:
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts.
Style/FileName:
Exclude:
- spec/integration/sequel_spec.rb
- 'lib/grape-active_model_serializers.rb'
- 'spec/grape-active_model_serializers_spec.rb'

39
.travis.yml Normal file
View file

@ -0,0 +1,39 @@
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,31 +1,17 @@
## Changelog
### 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)
### 1.5.2 (March 14, 2018)
* [#76](https://github.com/ruby-grape/grape-active_model_serializers/pull/76): Add custom error formatter - [@xn](https://github.com/xn).
### 1.5.1 (2017/04/25)
### 1.5.1 (April 25, 2017)
* [#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).
* [#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).
### 1.5.0 (2016/08/24)
### 1.5.0 (August 24, 2016)
* [#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).
@ -33,22 +19,22 @@
* [#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).
### 1.4.0 (2016/07/14)
### 1.4.0 (July 14, 2016)
* [#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).
### 1.3.2 (2015/02/27)
### v1.3.2 (February 27, 2015)
* [#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).
### 1.3.1 (2014/11/20)
### v1.3.1 (November 20, 2014)
* [#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).
### 1.2.1 (2014/07/23)
### v1.2.1 (July 23, 2014)
* [#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).
@ -58,12 +44,12 @@
* [#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).
### 1.0.1 (2013/09/09)
### v1.0.1 (September 9, 2013)
* [#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).
* [#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.0.0 (2013/09/09)
### v1.0.0
* Initial public release - [@jrhe](https://github.com/jrhe).

15
Gemfile
View file

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

View file

@ -1,29 +1,9 @@
# 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
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)
[![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)
[![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)
## Installation
@ -37,9 +17,9 @@ See [UPGRADING](UPGRADING.md) if you're upgrading from a previous version.
## Dependencies
* >= Ruby v3.1
* >= [grape](https://github.com/ruby-grape/grape) v2.3.0
* >= [active_model_serializers](https://github.com/rails-api/active_model_serializers) v0.10.0
* >= Ruby v2.2
* >= [grape](https://github.com/intridea/grape) v0.8.0
* >= [active_model_serializers](https://github.com/rails-api/active_model_serializers) v0.10.0
## Usage
@ -303,4 +283,4 @@ See [CONTRIBUTING](CONTRIBUTING.md).
## History
Structured and based upon [grape-rabl](https://github.com/ruby-grape/grape-rabl).
Structured and based upon [grape-rabl](https://github.com/LTe/grape-rabl).

View file

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

3
Rakefile Executable file → Normal file
View file

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

View file

@ -16,6 +16,13 @@ Gem::Specification.new do |gem|
gem.version = Grape::ActiveModelSerializers::VERSION
gem.licenses = ['MIT']
gem.add_dependency 'grape', '>= 2.3.0'
gem.add_dependency 'grape', '>= 0.8.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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -5,7 +5,7 @@ describe 'Grape::EndpointExtension' do
subject do
Grape::Endpoint.new(
Grape::Util::InheritableSetting.new,
path: '/',
path: '/',
method: 'foo'
)
end
@ -27,7 +27,7 @@ describe 'Grape::EndpointExtension' do
describe '#render' do
let(:env) { {} }
let(:env_key) { nil }
let(:env_key) {}
before do
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
subject { Grape::ErrorFormatter::ActiveModelSerializers }
let(:backtrace) { ['Line:1'] }
let(:options) { {} }
let(:options) { Hash.new }
let(:env) { { 'api.endpoint' => app.endpoints.first } }
let(:original_exception) { StandardError.new('oh noes!') }

View file

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

View file

@ -0,0 +1,4 @@
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(:meta_options) {
{
meta: meta,
meta: meta,
meta_key: meta_key
}
}

View file

@ -15,8 +15,8 @@ describe Grape::ActiveModelSerializers::SerializerResolver do
let(:options) {
{
serializer: options_serializer_class, # options defined
for: V4::UsersApi, # namespace inference
version: 'v5' # version inference
for: V4::UsersApi, # namespace inference
version: 'v5' # version inference
}
}
# resource defined
@ -52,18 +52,6 @@ describe Grape::ActiveModelSerializers::SerializerResolver do
expect(serializer).to be_kind_of(serializer_class)
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
let(:options) {
super().except(:serializer).merge(

View file

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

View file

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

View file

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