restpack_serializer 0.6.8 → 0.6.13

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: 7af1bc27d7c8835c4661909c30fc9dd85db99379
4
- data.tar.gz: cdd08668865b3200810f2f296a6729b5aa29a1e1
2
+ SHA256:
3
+ metadata.gz: 5cbdfc54c01006c75a8db9b73a60b7dc713e17257e77991b82bf4b3f3d22b537
4
+ data.tar.gz: 126c3c857097eb24d9f45aa1d9a1a2b40363f1246edc869350249b6fba30c3f8
5
5
  SHA512:
6
- metadata.gz: a9186bacc0ef4f585bd8e053e2ba678f980ce263f026fb6623812076bc22f3dc0d10490ac29f4bf31fa0c397dd205e86e96a59825c5cda097516a01914612fd5
7
- data.tar.gz: e7e1ab1b5d90c07c5868a106888a0079f8fa3e4ad638ec97ba2d7d5b2114f75cd9d63e6f4898563fe208625d8bac8f02496c60b2633c5582ee55dac0349784cc
6
+ metadata.gz: 6002f9e445e71c1d4353b7954421dc80d6e1742ff5444f5701e3612a78a2cbd21b03de9a2347b0d8f534034e75a3d5badfdd75a7a26c037ef7897f394a5f7784
7
+ data.tar.gz: 7f81b17da0dd9cf8855108a00174c8ac0ce9df55732f87b0a1691f838abf90f18d7711363cdbf8b43326b759350250ef9e84e4dbc08b0e0c93280798205c20fb
@@ -0,0 +1,29 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-latest
8
+
9
+ strategy:
10
+ fail-fast: false
11
+
12
+ matrix:
13
+ ruby-version:
14
+ - 2.1
15
+ - 2.2
16
+ - 2.3
17
+ - 2.4
18
+ - 2.5
19
+ - 2.6
20
+ - 2.7
21
+ - 3.0
22
+
23
+ steps:
24
+ - uses: actions/checkout@v2
25
+ - uses: ruby/setup-ruby@v1
26
+ with:
27
+ ruby-version: ${{ matrix.ruby-version }}
28
+ bundler-cache: true
29
+ - run: bundle exec rake test
@@ -1 +1 @@
1
- 2.3.1
1
+ 2.7.2
data/Gemfile CHANGED
@@ -3,3 +3,8 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  gem 'coveralls', require: false
6
+ gem 'memory_profiler', require: false
7
+
8
+ if RUBY_VERSION < "2.2"
9
+ gem "sqlite3", "~> 1.3.0"
10
+ end
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.8'
3
+ VERSION = '0.6.13'
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,10 +17,9 @@ 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', '< 6.0']
21
- gem.add_dependency 'activerecord', ['>= 4.0.3', '< 6.0']
22
- gem.add_dependency 'kaminari', '~> 0.17.0'
23
- gem.add_dependency 'kaminari-mongoid', '~> 0.1'
20
+ gem.add_dependency 'activesupport', ['>= 4.0.3', '< 7.0']
21
+ gem.add_dependency 'activerecord', ['>= 4.0.3', '< 7.0']
22
+ gem.add_dependency 'kaminari', ['>= 0.17.0', '< 2.0']
24
23
 
25
24
  gem.add_development_dependency 'restpack_gem', '~> 0.0.9'
26
25
  gem.add_development_dependency 'rake', '~> 11.3'
@@ -30,5 +29,4 @@ Gem::Specification.new do |gem|
30
29
  gem.add_development_dependency 'database_cleaner', '~> 1.5'
31
30
  gem.add_development_dependency 'rspec'
32
31
  gem.add_development_dependency 'bump'
33
- gem.add_development_dependency 'protected_attributes_continued', '~> 1.2'
34
32
  end
@@ -1,12 +1,13 @@
1
1
  require 'sqlite3'
2
2
  require 'active_record'
3
- require 'protected_attributes_continued'
4
3
 
5
4
  ActiveRecord::Base.establish_connection(
6
5
  :adapter => 'sqlite3',
7
6
  :database => 'test.db'
8
7
  )
9
8
 
9
+ ActiveRecord::Migration.verbose = false
10
+
10
11
  ActiveRecord::Schema.define(:version => 1) do
11
12
  create_table "artists", :force => true do |t|
12
13
  t.string "name"
@@ -66,8 +67,6 @@ end
66
67
 
67
68
  module MyApp
68
69
  class Artist < ActiveRecord::Base
69
- attr_accessible :name, :website
70
-
71
70
  has_many :albums
72
71
  has_many :songs
73
72
  has_many :payments
@@ -76,7 +75,6 @@ module MyApp
76
75
  end
77
76
 
78
77
  class Album < ActiveRecord::Base
79
- attr_accessible :title, :year, :artist
80
78
  scope :classic, -> { where("year < 1950") }
81
79
 
82
80
  belongs_to :artist
@@ -85,34 +83,27 @@ module MyApp
85
83
  end
86
84
 
87
85
  class AlbumReview < ActiveRecord::Base
88
- attr_accessible :message
89
86
  belongs_to :album
90
87
  end
91
88
 
92
89
  class Song < ActiveRecord::Base
93
90
  default_scope -> { order(id: :asc) }
94
91
 
95
- attr_accessible :title, :artist, :album
96
-
97
92
  belongs_to :artist
98
93
  belongs_to :album
99
94
  end
100
95
 
101
96
  class Payment < ActiveRecord::Base
102
- attr_accessible :amount, :artist
103
-
104
97
  belongs_to :artist
105
98
  belongs_to :fan
106
99
  end
107
100
 
108
101
  class Fan < ActiveRecord::Base
109
- attr_accessible :name
110
102
  has_many :payments
111
103
  has_many :artists, :through => :albums
112
104
  end
113
105
 
114
106
  class Stalker < ActiveRecord::Base
115
- attr_accessible :name
116
107
  has_and_belongs_to_many :artists
117
108
  end
118
109
  end
@@ -79,6 +79,27 @@ describe RestPack::Serializer do
79
79
  end
80
80
  end
81
81
 
82
+ context "serializer instance variables" do
83
+ class MemoizingSerializer
84
+ include RestPack::Serializer
85
+
86
+ attributes :id, :memoized_id
87
+
88
+ def memoized_id
89
+ @memoized_id ||= id
90
+ end
91
+ end
92
+
93
+ it "does not reuse instance variable values" do
94
+ people = [Person.new(id: 123), Person.new(id: 456)]
95
+ serialized = MemoizingSerializer.as_json(people)
96
+ expect(serialized).to eq([
97
+ { id: "123", memoized_id: "123" },
98
+ { id: "456", memoized_id: "456" }
99
+ ])
100
+ end
101
+ end
102
+
82
103
  class PersonSerializer
83
104
  include RestPack::Serializer
84
105
  attributes :id, :name, :description, :href, :admin_info, :string_keys
@@ -292,6 +313,20 @@ describe RestPack::Serializer do
292
313
  end
293
314
  end
294
315
 
316
+ describe "to_json" do
317
+ context "class method" do
318
+ it "delegates to as_json" do
319
+ expect(PersonSerializer.as_json(person).to_json).to eq(PersonSerializer.to_json(person))
320
+ end
321
+ end
322
+
323
+ context "instance method" do
324
+ it "delegates to as_json" do
325
+ expect(serializer.as_json(person).to_json).to eq(serializer.to_json(person))
326
+ end
327
+ end
328
+ end
329
+
295
330
  describe "#model_class" do
296
331
  it "extracts the Model name from the Serializer name" do
297
332
  expect(PersonSerializer.model_class).to eq(Person)
@@ -5,6 +5,8 @@ require './spec/fixtures/serializers'
5
5
  require './spec/support/factory'
6
6
  require 'database_cleaner'
7
7
  require 'coveralls'
8
+
9
+ Coveralls::Output.silent = true unless ENV["CI"]
8
10
  Coveralls.wear!
9
11
  FactoryGirl.find_definitions
10
12
 
@@ -20,10 +22,6 @@ RSpec.configure do |config|
20
22
  DatabaseCleaner.strategy = :transaction
21
23
  end
22
24
 
23
- config.before(:each, :js => true) do
24
- DatabaseCleaner.strategy = :truncation
25
- end
26
-
27
25
  config.before(:each) do
28
26
  DatabaseCleaner.start
29
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restpack_serializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.8
4
+ version: 0.6.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gavin Joyce
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-24 00:00:00.000000000 Z
11
+ date: 2021-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 4.0.3
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '6.0'
22
+ version: '7.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: 4.0.3
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '6.0'
32
+ version: '7.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: activerecord
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: 4.0.3
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
- version: '6.0'
42
+ version: '7.0'
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,35 +49,27 @@ dependencies:
49
49
  version: 4.0.3
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
- version: '6.0'
52
+ version: '7.0'
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: kaminari
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - "~>"
57
+ - - ">="
58
58
  - !ruby/object:Gem::Version
59
59
  version: 0.17.0
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '2.0'
60
63
  type: :runtime
61
64
  prerelease: false
62
65
  version_requirements: !ruby/object:Gem::Requirement
63
66
  requirements:
64
- - - "~>"
67
+ - - ">="
65
68
  - !ruby/object:Gem::Version
66
69
  version: 0.17.0
67
- - !ruby/object:Gem::Dependency
68
- name: kaminari-mongoid
69
- requirement: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - "~>"
72
- - !ruby/object:Gem::Version
73
- version: '0.1'
74
- type: :runtime
75
- prerelease: false
76
- version_requirements: !ruby/object:Gem::Requirement
77
- requirements:
78
- - - "~>"
70
+ - - "<"
79
71
  - !ruby/object:Gem::Version
80
- version: '0.1'
72
+ version: '2.0'
81
73
  - !ruby/object:Gem::Dependency
82
74
  name: restpack_gem
83
75
  requirement: !ruby/object:Gem::Requirement
@@ -190,20 +182,6 @@ dependencies:
190
182
  - - ">="
191
183
  - !ruby/object:Gem::Version
192
184
  version: '0'
193
- - !ruby/object:Gem::Dependency
194
- name: protected_attributes_continued
195
- requirement: !ruby/object:Gem::Requirement
196
- requirements:
197
- - - "~>"
198
- - !ruby/object:Gem::Version
199
- version: '1.2'
200
- type: :development
201
- prerelease: false
202
- version_requirements: !ruby/object:Gem::Requirement
203
- requirements:
204
- - - "~>"
205
- - !ruby/object:Gem::Version
206
- version: '1.2'
207
185
  description: Model serialization, paging, side-loading and filtering
208
186
  email:
209
187
  - gavinjoyce@gmail.com
@@ -211,10 +189,10 @@ executables: []
211
189
  extensions: []
212
190
  extra_rdoc_files: []
213
191
  files:
192
+ - ".github/workflows/ci.yml"
214
193
  - ".gitignore"
215
194
  - ".rspec"
216
195
  - ".ruby-version"
217
- - ".travis.yml"
218
196
  - Gemfile
219
197
  - Guardfile
220
198
  - LICENSE
@@ -235,6 +213,7 @@ files:
235
213
  - lib/restpack_serializer/serializable/single.rb
236
214
  - lib/restpack_serializer/serializable/sortable.rb
237
215
  - lib/restpack_serializer/version.rb
216
+ - performance/mem.rb
238
217
  - performance/perf.rb
239
218
  - restpack_serializer.gemspec
240
219
  - spec/factory/factory_spec.rb
@@ -259,7 +238,7 @@ files:
259
238
  homepage: https://github.com/RestPack
260
239
  licenses: []
261
240
  metadata: {}
262
- post_install_message:
241
+ post_install_message:
263
242
  rdoc_options: []
264
243
  require_paths:
265
244
  - lib
@@ -274,9 +253,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
274
253
  - !ruby/object:Gem::Version
275
254
  version: '0'
276
255
  requirements: []
277
- rubyforge_project:
278
- rubygems_version: 2.5.1
279
- signing_key:
256
+ rubygems_version: 3.1.4
257
+ signing_key:
280
258
  specification_version: 4
281
259
  summary: Model serialization, paging, side-loading and filtering
282
260
  test_files:
@@ -1,4 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.3.1
4
- script: bundle exec rake test