restpack_serializer 0.6.7 → 0.6.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ec99f158a9e7825b3134792a1ea5ba5efb2a961f
4
- data.tar.gz: a33b39771c550f179826c344af688f5d9e84392b
2
+ SHA256:
3
+ metadata.gz: 29675ee4cb74f76f0f88dfa4ddb86484cfd5fb7c15e5e0a01ccfa2142f1086c4
4
+ data.tar.gz: f09ca1d697f23127162ebafbb57f502cb53817cee03f34fb38cbd27861921a1b
5
5
  SHA512:
6
- metadata.gz: 6412ccee09177e52299f3b8bfbfcdefc5f541f18bb3e5ab95ef126ecb178fd8a7f8304e3ceda94c838d30904056727b9e9413b3175e7cfc437a8eb33214aacf7
7
- data.tar.gz: 8c2f759aa5ca1fcf1fa4d927e4fb6c156fdabb0a66a1fbc4bce6f9683d944a861d1b2b79107ae9ca8a23e633a6953dc72f25a67cc7c3dbe35f23f7042262a44b
6
+ metadata.gz: ca2acc1214a42e32f9ccf8aab6617b7a5c914b7d0f21a5fef64152e0130ababb26844a03bf9489e178f5d32ed13e6f5224a48d6f3e0c710a62ae8ffb22ee70ac
7
+ data.tar.gz: df71b93f4a14adbdde6f953185b4d105d1f8756cff5fa3f8db3f2e8d65630c7ab53a743515600e901053093955fbebccbfa24c63b390984389a24a13f4126576
data/.gitignore CHANGED
@@ -3,3 +3,4 @@
3
3
  tmp
4
4
  /coverage
5
5
  Gemfile.lock
6
+ /.idea
data/Gemfile CHANGED
@@ -3,3 +3,4 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  gem 'coveralls', require: false
6
+ gem 'memory_profiler', require: false
data/Rakefile CHANGED
@@ -4,4 +4,5 @@ RestPack::Gem::Tasks.load_tasks
4
4
  desc "Run some performance tests"
5
5
  task :perf do
6
6
  require_relative 'performance/perf.rb'
7
+ require_relative 'performance/mem.rb'
7
8
  end
@@ -6,7 +6,7 @@ require_relative 'restpack_serializer/serializable'
6
6
  require_relative 'restpack_serializer/factory'
7
7
  require_relative 'restpack_serializer/result'
8
8
 
9
- Kaminari::Hooks.init
9
+ Kaminari::Hooks.init if defined?(Kaminari::Hooks)
10
10
 
11
11
  module RestPack
12
12
  module Serializer
@@ -34,7 +34,7 @@ module RestPack
34
34
  def as_json(model, context = {})
35
35
  return if model.nil?
36
36
  if model.kind_of?(Array)
37
- return model.map { |item| as_json(item, context) }
37
+ return model.map { |item| self.class.new.as_json(item, context) }
38
38
  end
39
39
 
40
40
  apply_whitelist_and_blacklist(context)
@@ -57,11 +57,15 @@ module RestPack
57
57
  end
58
58
 
59
59
  add_custom_attributes(data)
60
- add_links(model, data) unless self.class.associations.empty?
60
+ add_links(model, data) if self.class.has_associations?
61
61
 
62
62
  data
63
63
  end
64
64
 
65
+ def to_json(model, context = {})
66
+ as_json(model, context).to_json
67
+ end
68
+
65
69
  def custom_attributes
66
70
  nil
67
71
  end
@@ -140,9 +144,13 @@ module RestPack
140
144
  end
141
145
 
142
146
  def has_user_defined_method?(method_name)
143
- user_defined_methods = self.user_defined_methods || []
144
- return true if user_defined_methods.include?(method_name)
145
- return self.superclass.try(:has_user_defined_method?, method_name)
147
+ if user_defined_methods && user_defined_methods.include?(method_name)
148
+ true
149
+ elsif superclass.respond_to?(:has_user_defined_method?)
150
+ superclass.has_user_defined_method?(method_name)
151
+ else
152
+ false
153
+ end
146
154
  end
147
155
 
148
156
  def memoized_has_user_defined_method?(method_name)
@@ -165,6 +173,10 @@ module RestPack
165
173
  new.as_json(model, context)
166
174
  end
167
175
 
176
+ def to_json(model, context = {})
177
+ new.as_json(model, context).to_json
178
+ end
179
+
168
180
  def serialize(models, context = {})
169
181
  models = [models] unless models.kind_of?(Array)
170
182
 
@@ -44,8 +44,12 @@ module RestPack::Serializer::SideLoading
44
44
  end
45
45
  end
46
46
 
47
+ def has_associations?
48
+ @can_includes
49
+ end
50
+
47
51
  def associations
48
- return [] unless @can_includes
52
+ return [] unless has_associations?
49
53
  can_includes.map do |include|
50
54
  association = association_from_include(include)
51
55
  association if supported_association?(association.macro)
@@ -1,5 +1,5 @@
1
1
  module RestPack
2
2
  module Serializer
3
- VERSION = '0.6.7'
3
+ VERSION = '0.6.12'
4
4
  end
5
5
  end
@@ -0,0 +1,49 @@
1
+ require 'memory_profiler'
2
+ require_relative '../lib/restpack_serializer'
3
+
4
+ class SimpleSerializer
5
+ include RestPack::Serializer
6
+ attributes :id, :title
7
+ end
8
+
9
+ simple_model = {
10
+ id: "123",
11
+ title: 'This is the title',
12
+ }
13
+
14
+ # warmup
15
+ SimpleSerializer.as_json(simple_model)
16
+
17
+ report = MemoryProfiler.report do
18
+ SimpleSerializer.as_json(simple_model)
19
+ end
20
+
21
+ puts "="*64
22
+ puts "Simple Serializer:"
23
+ puts "="*64
24
+
25
+ report.pretty_print(detailed_report: false)
26
+
27
+ class ComplexSerializer
28
+ include RestPack::Serializer
29
+
30
+ attributes :a, :b, :c, :d, :e, :f, :g, :h, :i, :j, :k, :l, :m, :n, :o, :p, :q, :r, :s, :t
31
+ end
32
+
33
+ complex_model = {
34
+ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10,
35
+ k: 11, l: 12, m: 13, n: 14, o: 15, p: 16, q: 17, r: 18, s: 19, t: 20,
36
+ }
37
+
38
+ # warmup
39
+ ComplexSerializer.as_json(complex_model)
40
+
41
+ report = MemoryProfiler.report do
42
+ ComplexSerializer.as_json(complex_model)
43
+ end
44
+
45
+ puts "="*64
46
+ puts "Complex Serializer:"
47
+ puts "="*64
48
+
49
+ report.pretty_print(detailed_report: false)
@@ -17,17 +17,16 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
- gem.add_dependency 'activesupport', ['>= 4.0.3', '< 5.0']
21
- gem.add_dependency 'activerecord', ['>= 4.0.3', '< 5.0']
22
- gem.add_dependency 'kaminari', '~> 0.16.1'
20
+ gem.add_dependency 'activesupport', ['>= 4.0.3', '< 6.1']
21
+ gem.add_dependency 'activerecord', ['>= 4.0.3', '< 6.1']
22
+ gem.add_dependency 'kaminari', ['>= 0.17.0', '< 2.0']
23
23
 
24
24
  gem.add_development_dependency 'restpack_gem', '~> 0.0.9'
25
- gem.add_development_dependency 'rake', '~> 11.1.2'
26
- gem.add_development_dependency 'guard-rspec', '~> 4.6.4'
27
- gem.add_development_dependency 'factory_girl', '~> 4.7.0'
28
- gem.add_development_dependency 'sqlite3', '~> 1.3.7'
29
- gem.add_development_dependency 'database_cleaner', '~> 1.5.3'
25
+ gem.add_development_dependency 'rake', '~> 11.3'
26
+ gem.add_development_dependency 'guard-rspec', '~> 4.7'
27
+ gem.add_development_dependency 'factory_girl', '~> 4.7'
28
+ gem.add_development_dependency 'sqlite3', '~> 1.3'
29
+ gem.add_development_dependency 'database_cleaner', '~> 1.5'
30
30
  gem.add_development_dependency 'rspec'
31
31
  gem.add_development_dependency 'bump'
32
- gem.add_development_dependency 'protected_attributes', '~> 1.1.3'
33
32
  end
@@ -5,45 +5,52 @@ describe RestPack::Serializer::Factory do
5
5
 
6
6
  describe "single-word" do
7
7
  it "creates by string" do
8
- factory.create("Song").should be_an_instance_of(MyApp::SongSerializer)
8
+ expect(factory.create("Song")).to be_an_instance_of(MyApp::SongSerializer)
9
9
  end
10
+
10
11
  it "creates by lowercase string" do
11
- factory.create("song").should be_an_instance_of(MyApp::SongSerializer)
12
+ expect(factory.create("song")).to be_an_instance_of(MyApp::SongSerializer)
12
13
  end
14
+
13
15
  it "creates by lowercase plural string" do
14
- factory.create("songs").should be_an_instance_of(MyApp::SongSerializer)
16
+ expect(factory.create("songs")).to be_an_instance_of(MyApp::SongSerializer)
15
17
  end
18
+
16
19
  it "creates by symbol" do
17
- factory.create(:song).should be_an_instance_of(MyApp::SongSerializer)
20
+ expect(factory.create(:song)).to be_an_instance_of(MyApp::SongSerializer)
18
21
  end
22
+
19
23
  it "creates by class" do
20
- factory.create(MyApp::Song).should be_an_instance_of(MyApp::SongSerializer)
24
+ expect(factory.create(MyApp::Song)).to be_an_instance_of(MyApp::SongSerializer)
21
25
  end
22
26
 
23
27
  it "creates multiple with Array" do
24
28
  serializers = factory.create("Song", "artists", :album)
25
- serializers[0].should be_an_instance_of(MyApp::SongSerializer)
26
- serializers[1].should be_an_instance_of(MyApp::ArtistSerializer)
27
- serializers[2].should be_an_instance_of(MyApp::AlbumSerializer)
29
+ expect(serializers[0]).to be_an_instance_of(MyApp::SongSerializer)
30
+ expect(serializers[1]).to be_an_instance_of(MyApp::ArtistSerializer)
31
+ expect(serializers[2]).to be_an_instance_of(MyApp::AlbumSerializer)
28
32
  end
29
33
  end
30
34
 
31
35
  describe "multi-word" do
32
36
  it "creates multi-word string" do
33
- factory.create("AlbumReview").should be_an_instance_of(MyApp::AlbumReviewSerializer)
37
+ expect(factory.create("AlbumReview")).to be_an_instance_of(MyApp::AlbumReviewSerializer)
34
38
  end
39
+
35
40
  it "creates multi-word lowercase string" do
36
- factory.create("album_review").should be_an_instance_of(MyApp::AlbumReviewSerializer)
41
+ expect(factory.create("album_review")).to be_an_instance_of(MyApp::AlbumReviewSerializer)
37
42
  end
43
+
38
44
  it "creates multi-word lowercase plural string" do
39
- factory.create("album_reviews").should be_an_instance_of(MyApp::AlbumReviewSerializer)
45
+ expect(factory.create("album_reviews")).to be_an_instance_of(MyApp::AlbumReviewSerializer)
40
46
  end
47
+
41
48
  it "creates multi-word symbol" do
42
- factory.create(:album_review).should be_an_instance_of(MyApp::AlbumReviewSerializer)
49
+ expect(factory.create(:album_review)).to be_an_instance_of(MyApp::AlbumReviewSerializer)
43
50
  end
51
+
44
52
  it "creates multi-word class" do
45
- factory.create(MyApp::AlbumReview).should be_an_instance_of(MyApp::AlbumReviewSerializer)
53
+ expect(factory.create(MyApp::AlbumReview)).to be_an_instance_of(MyApp::AlbumReviewSerializer)
46
54
  end
47
55
  end
48
-
49
56
  end
@@ -1,6 +1,5 @@
1
1
  require 'sqlite3'
2
2
  require 'active_record'
3
- require 'protected_attributes'
4
3
 
5
4
  ActiveRecord::Base.establish_connection(
6
5
  :adapter => 'sqlite3',
@@ -66,8 +65,6 @@ end
66
65
 
67
66
  module MyApp
68
67
  class Artist < ActiveRecord::Base
69
- attr_accessible :name, :website
70
-
71
68
  has_many :albums
72
69
  has_many :songs
73
70
  has_many :payments
@@ -76,7 +73,6 @@ module MyApp
76
73
  end
77
74
 
78
75
  class Album < ActiveRecord::Base
79
- attr_accessible :title, :year, :artist
80
76
  scope :classic, -> { where("year < 1950") }
81
77
 
82
78
  belongs_to :artist
@@ -85,34 +81,27 @@ module MyApp
85
81
  end
86
82
 
87
83
  class AlbumReview < ActiveRecord::Base
88
- attr_accessible :message
89
84
  belongs_to :album
90
85
  end
91
86
 
92
87
  class Song < ActiveRecord::Base
93
88
  default_scope -> { order(id: :asc) }
94
89
 
95
- attr_accessible :title, :artist, :album
96
-
97
90
  belongs_to :artist
98
91
  belongs_to :album
99
92
  end
100
93
 
101
94
  class Payment < ActiveRecord::Base
102
- attr_accessible :amount, :artist
103
-
104
95
  belongs_to :artist
105
96
  belongs_to :fan
106
97
  end
107
98
 
108
99
  class Fan < ActiveRecord::Base
109
- attr_accessible :name
110
100
  has_many :payments
111
101
  has_many :artists, :through => :albums
112
102
  end
113
103
 
114
104
  class Stalker < ActiveRecord::Base
115
- attr_accessible :name
116
105
  has_and_belongs_to_many :artists
117
106
  end
118
107
  end
@@ -6,8 +6,8 @@ describe RestPack::Serializer do
6
6
 
7
7
  context "#setup" do
8
8
  it "has defaults" do
9
- subject.config.href_prefix.should == ''
10
- subject.config.page_size.should == 10
9
+ expect(subject.config.href_prefix).to eq('')
10
+ expect(subject.config.page_size).to eq(10)
11
11
  end
12
12
 
13
13
  it "can be configured" do
@@ -16,8 +16,8 @@ describe RestPack::Serializer do
16
16
  config.page_size = 50
17
17
  end
18
18
 
19
- subject.config.href_prefix.should == '/api/v1'
20
- subject.config.page_size.should == 50
19
+ expect(subject.config.href_prefix).to eq('/api/v1')
20
+ expect(subject.config.page_size).to eq(50)
21
21
  end
22
22
  end
23
23
  end
@@ -3,18 +3,19 @@ require 'spec_helper'
3
3
  describe RestPack::Serializer::Result do
4
4
  context 'a new instance' do
5
5
  it 'has defaults' do
6
- subject.resources.should == {}
7
- subject.meta.should == {}
8
- subject.links.should == {}
6
+ expect(subject.resources).to eq({})
7
+ expect(subject.meta).to eq({})
8
+ expect(subject.links).to eq({})
9
9
  end
10
10
  end
11
11
 
12
12
  context 'when serializing' do
13
13
  let(:result) { subject.serialize }
14
+
14
15
  context 'in jsonapi.org format' do
15
16
  context 'an empty result' do
16
17
  it 'returns an empty result' do
17
- result.should == {}
18
+ expect(result).to eq({})
18
19
  end
19
20
  end
20
21
 
@@ -26,9 +27,9 @@ describe RestPack::Serializer::Result do
26
27
  end
27
28
 
28
29
  it 'returns correct jsonapi.org format' do
29
- result[:albums].should == subject.resources[:albums]
30
- result[:meta].should == subject.meta
31
- result[:links].should == subject.links
30
+ expect(result[:albums]).to eq(subject.resources[:albums])
31
+ expect(result[:meta]).to eq(subject.meta)
32
+ expect(result[:links]).to eq(subject.links)
32
33
  end
33
34
  end
34
35
 
@@ -43,16 +44,16 @@ describe RestPack::Serializer::Result do
43
44
  end
44
45
 
45
46
  it 'returns correct jsonapi.org format, including injected has_many links' do
46
- result[:albums].should == [{ id: '1', name: 'AMOK', links: { songs: ['91'] } }]
47
- result[:links].should == subject.links
48
- result[:linked][:songs].should == subject.resources[:songs]
47
+ expect(result[:albums]).to eq([{ id: '1', name: 'AMOK', links: { songs: ['91'] } }])
48
+ expect(result[:links]).to eq(subject.links)
49
+ expect(result[:linked][:songs]).to eq(subject.resources[:songs])
49
50
  end
50
51
 
51
52
  it 'includes resources in correct order' do
52
- result.keys[0].should == :albums
53
- result.keys[1].should == :linked
54
- result.keys[2].should == :links
55
- result.keys[3].should == :meta
53
+ expect(result.keys[0]).to eq(:albums)
54
+ expect(result.keys[1]).to eq(:linked)
55
+ expect(result.keys[2]).to eq(:links)
56
+ expect(result.keys[3]).to eq(:meta)
56
57
  end
57
58
 
58
59
  context 'with multiple calls to serialize' do
@@ -62,7 +63,7 @@ describe RestPack::Serializer::Result do
62
63
  end
63
64
 
64
65
  it 'does not create duplicate has_many links' do
65
- result[:albums].first[:links][:songs].count.should == 1
66
+ expect(result[:albums].first[:links][:songs].count).to eq(1)
66
67
  end
67
68
  end
68
69
  end
@@ -9,6 +9,6 @@ describe RestPack::Serializer::Filterable do
9
9
  end
10
10
 
11
11
  it "captures the specified filters" do
12
- CustomSerializer.serializable_filters.should == [:a, :c]
12
+ expect(CustomSerializer.serializable_filters).to eq([:a, :c])
13
13
  end
14
14
  end
@@ -6,94 +6,99 @@ describe RestPack::Serializer::Options do
6
6
  let(:scope) { nil }
7
7
 
8
8
  describe 'default values' do
9
- it { subject.model_class.should == MyApp::Song }
10
- it { subject.include.should == [] }
11
- it { subject.page.should == 1 }
12
- it { subject.page_size.should == 10 }
13
- it { subject.filters.should == {} }
14
- it { subject.scope.should == MyApp::Song.all }
15
- it { subject.default_page_size?.should == true }
16
- it { subject.filters_as_url_params.should == '' }
9
+ it { expect(subject.model_class).to eq(MyApp::Song) }
10
+ it { expect(subject.include).to eq([]) }
11
+ it { expect(subject.page).to eq(1) }
12
+ it { expect(subject.page_size).to eq(10) }
13
+ it { expect(subject.filters).to eq({}) }
14
+ it { expect(subject.scope).to eq(MyApp::Song.all) }
15
+ it { expect(subject.default_page_size?).to eq(true) }
16
+ it { expect(subject.filters_as_url_params).to eq('') }
17
17
  end
18
18
 
19
19
  describe 'with paging params' do
20
20
  let(:params) { { 'page' => '2', 'page_size' => '8' } }
21
- it { subject.page.should == 2 }
22
- it { subject.page_size.should == 8 }
21
+ it { expect(subject.page).to eq(2) }
22
+ it { expect(subject.page_size).to eq(8) }
23
23
  end
24
24
 
25
25
  describe 'with include' do
26
26
  let(:params) { { 'include' => 'model1,model2' } }
27
- it { subject.include.should == ["model1", "model2"] }
27
+ it { expect(subject.include).to eq(%w(model1 model2)) }
28
28
  end
29
29
 
30
30
  context 'with filters' do
31
31
  describe 'with no filter params' do
32
- let(:params) { { } }
33
- it { subject.filters.should == {} }
32
+ let(:params) { {} }
33
+ it { expect(subject.filters).to eq({}) }
34
34
  end
35
+
35
36
  describe 'with a primary key with a single value' do
36
37
  let(:params) { { 'id' => '142857' } }
37
- it { subject.filters.should == { id: ['142857'] } }
38
- it { subject.filters_as_url_params.should == 'id=142857' }
38
+ it { expect(subject.filters).to eq(id: %w(142857)) }
39
+ it { expect(subject.filters_as_url_params).to eq('id=142857') }
39
40
  end
41
+
40
42
  describe 'with a primary key with multiple values' do
41
43
  let(:params) { { 'ids' => '42,142857' } }
42
- it { subject.filters.should == { id: ['42', '142857'] } }
43
- it { subject.filters_as_url_params.should == 'id=42,142857' }
44
+ it { expect(subject.filters).to eq(id: %w(42 142857)) }
45
+ it { expect(subject.filters_as_url_params).to eq('id=42,142857') }
44
46
  end
47
+
45
48
  describe 'with a foreign key with a single value' do
46
49
  let(:params) { { 'album_id' => '789' } }
47
- it { subject.filters.should == { album_id: ['789'] } }
48
- it { subject.filters_as_url_params.should == 'album_id=789' }
50
+ it { expect(subject.filters).to eq(album_id: %w(789)) }
51
+ it { expect(subject.filters_as_url_params).to eq('album_id=789') }
49
52
  end
53
+
50
54
  describe 'with a foreign key with multiple values' do
51
55
  let(:params) { { 'album_id' => '789,678,567' } }
52
- it { subject.filters.should == { album_id: ['789', '678', '567'] } }
53
- it { subject.filters_as_url_params.should == 'album_id=789,678,567' }
56
+ it { expect(subject.filters).to eq(album_id: %w(789 678 567)) }
57
+ it { expect(subject.filters_as_url_params).to eq('album_id=789,678,567') }
54
58
  end
59
+
55
60
  describe 'with multiple foreign keys' do
56
61
  let(:params) { { 'album_id' => '111,222', 'artist_id' => '888,999' } }
57
- it { subject.filters.should == { album_id: ['111', '222'], artist_id: ['888', '999'] } }
58
- it { subject.filters_as_url_params.should == 'album_id=111,222&artist_id=888,999' }
62
+ it { expect(subject.filters).to eq(album_id: %w(111 222), artist_id: %w(888 999)) }
63
+ it { expect(subject.filters_as_url_params).to eq('album_id=111,222&artist_id=888,999') }
59
64
  end
60
65
  end
61
66
 
62
67
  context 'with sorting parameters' do
63
68
  describe 'with no params' do
64
- let(:params) { { } }
65
- it { subject.sorting.should == {} }
69
+ let(:params) { {} }
70
+ it { expect(subject.sorting).to eq({}) }
66
71
  end
67
72
  describe 'with a sorting value' do
68
73
  let(:params) { { 'sort' => 'Title' } }
69
- it { subject.sorting.should == { title: :asc } }
70
- it { subject.sorting_as_url_params.should == 'sort=title' }
74
+ it { expect(subject.sorting).to eq(title: :asc) }
75
+ it { expect(subject.sorting_as_url_params).to eq('sort=title') }
71
76
  end
72
77
  describe 'with a descending sorting value' do
73
78
  let(:params) { { 'sort' => '-title' } }
74
- it { subject.sorting.should == { title: :desc } }
75
- it { subject.sorting_as_url_params.should == 'sort=-title' }
79
+ it { expect(subject.sorting).to eq(title: :desc) }
80
+ it { expect(subject.sorting_as_url_params).to eq('sort=-title') }
76
81
  end
77
82
  describe 'with multiple sorting values' do
78
83
  let(:params) { { 'sort' => '-Title,ID' } }
79
- it { subject.sorting.should == { title: :desc, id: :asc } }
80
- it { subject.sorting_as_url_params.should == 'sort=-title,id' }
84
+ it { expect(subject.sorting).to eq(title: :desc, id: :asc) }
85
+ it { expect(subject.sorting_as_url_params).to eq('sort=-title,id') }
81
86
  end
82
87
  describe 'with a not allowed sorting value' do
83
88
  let(:params) { { 'sort' => '-title,album_id,id' } }
84
- it { subject.sorting.should == { title: :desc, id: :asc } }
85
- it { subject.sorting_as_url_params.should == 'sort=-title,id' }
89
+ it { expect(subject.sorting).to eq(title: :desc, id: :asc) }
90
+ it { expect(subject.sorting_as_url_params).to eq('sort=-title,id') }
86
91
  end
87
92
  end
88
93
 
89
94
  context 'scopes' do
90
95
  describe 'with default scope' do
91
- it { subject.scope.should == MyApp::Song.all }
96
+ it { expect(subject.scope).to eq(MyApp::Song.all) }
92
97
  end
93
98
 
94
99
  describe 'with custom scope' do
95
100
  let(:scope) { MyApp::Song.where("id >= 100") }
96
- it { subject.scope.should == scope }
101
+ it { expect(subject.scope).to eq(scope) }
97
102
  end
98
103
  end
99
104
  end