jsonapi.rb 1.7.0 → 2.0.1

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
2
  SHA256:
3
- metadata.gz: 07512bb6e4135e51e0f94a3399ec068e7aa53a13d6eb65b44f5c87be8e4310e4
4
- data.tar.gz: 128306af20f37d9fb7563a9cbc30f88f68dc3f761783a02eb9db539886c67bc5
3
+ metadata.gz: d531366279855044f83d35f4526a72156c711895290ab4dbce73f1c7615f1079
4
+ data.tar.gz: 63bd2be61a78d79a64bc739cbb492ee75a9e2f90a95389d55f133a2565627abb
5
5
  SHA512:
6
- metadata.gz: 6658f11bc2501360cb8be91a05d14d427102905476cd1e0d2a020b1d9db36ce77857127090dc37f27dfb9292c187f3ad8028ea47ab8b26f06ffe7648276009fe
7
- data.tar.gz: 2cfb89517aba924c3282d3f8f65a1281606407c0e11b97159ebab7b58c75dbf02fbf65962793a031b07e87e9e2cd90a31b87f6e5d0d54a91c769c0eed82e7088
6
+ metadata.gz: e602d6c993cd0259ac0b81c57eca16aee525f53ed0e5b4ac8014a0cb500528d579541375ce7735f0f191f3f732af9178ebbfdf7d4615eb967cfb244d1796cd36
7
+ data.tar.gz: 46a957ded4247be1607f6a4d84246da42a44fe41c58c55e2a34a914e958a28731531bc5e8a3f0d0141f571e17dce19c9c1f6f58845fc3e7db874d763dfcaffbb
data/README.md CHANGED
@@ -39,7 +39,7 @@ The available features include:
39
39
  [sparse fields](https://jsonapi.org/format/#fetching-sparse-fieldsets))
40
40
  * [filtering](https://jsonapi.org/format/#fetching-filtering) and
41
41
  [sorting](https://jsonapi.org/format/#fetching-sorting) of the data
42
- (powered by Ransack)
42
+ (powered by Ransack, soft-dependency)
43
43
  * [pagination](https://jsonapi.org/format/#fetching-pagination) support
44
44
 
45
45
  ## But how?
@@ -49,6 +49,16 @@ and [Ransack](https://github.com/activerecord-hackery/ransack).
49
49
 
50
50
  Thanks to everyone who worked on these amazing projects!
51
51
 
52
+ ## Sponsors
53
+
54
+ I'm grateful for the following companies for supporting this project!
55
+
56
+ <p align="center">
57
+ <a href="https://www.luneteyewear.com"><img src="https://user-images.githubusercontent.com/112147/136836142-2bfba96e-447f-4eb6-b137-2445aee81b37.png"/></a>
58
+ <a href="https://www.startuplandia.io"><img src="https://user-images.githubusercontent.com/112147/136836147-93f8ab17-2465-4477-a7ab-e38255483c66.png"/></a>
59
+ </p>
60
+
61
+
52
62
  ## Installation
53
63
 
54
64
  Add this line to your application's Gemfile:
@@ -231,6 +241,8 @@ to filter and sort over a collection of records.
231
241
  The support is pretty extended and covers also relationships and composite
232
242
  matchers.
233
243
 
244
+ Please add `ransack` to your `Gemfile` in order to benefit from this functionality!
245
+
234
246
  Here's an example:
235
247
 
236
248
  ```ruby
@@ -314,7 +326,7 @@ If you want to change the default number of items per page or define a custom lo
314
326
  ```ruby
315
327
  def jsonapi_page_size(pagination_params)
316
328
  per_page = pagination_params[:size].to_f.to_i
317
- per_page = 30 if per_page > 30
329
+ per_page = 30 if per_page > 30 || per_page < 1
318
330
  per_page
319
331
  end
320
332
  ```
@@ -1,5 +1,9 @@
1
- require 'ransack/predicate'
2
- require_relative 'patches'
1
+ begin
2
+ require 'active_record'
3
+ require 'ransack'
4
+ require_relative 'patches'
5
+ rescue LoadError
6
+ end
3
7
 
4
8
  # Filtering and sorting support
5
9
  module JSONAPI
data/lib/jsonapi/rails.rb CHANGED
@@ -37,7 +37,7 @@ module JSONAPI
37
37
  # @return [NilClass]
38
38
  def self.add_errors_renderer!
39
39
  ActionController::Renderers.add(:jsonapi_errors) do |resource, options|
40
- self.content_type ||= Mime[:jsonapi]
40
+ self.content_type = Mime[:jsonapi] if self.media_type.nil?
41
41
 
42
42
  many = JSONAPI::Rails.is_collection?(resource, options[:is_collection])
43
43
  resource = [resource] unless many
@@ -47,7 +47,7 @@ module JSONAPI
47
47
  ) unless resource.is_a?(ActiveModel::Errors)
48
48
 
49
49
  errors = []
50
- model = resource.instance_variable_get('@base')
50
+ model = resource.instance_variable_get(:@base)
51
51
 
52
52
  if respond_to?(:jsonapi_serializer_class, true)
53
53
  model_serializer = jsonapi_serializer_class(model, false)
@@ -56,8 +56,8 @@ module JSONAPI
56
56
  end
57
57
 
58
58
  details = {}
59
- if ::Rails::VERSION::MAJOR >= 6 && ::Rails::VERSION::MINOR >= 1
60
- resource.map do |error|
59
+ if ::Rails.gem_version >= Gem::Version.new('6.1')
60
+ resource.each do |error|
61
61
  attr = error.attribute
62
62
  details[attr] ||= []
63
63
  details[attr] << error.detail.merge(message: error.message)
@@ -90,7 +90,7 @@ module JSONAPI
90
90
  # @return [NilClass]
91
91
  def self.add_renderer!
92
92
  ActionController::Renderers.add(:jsonapi) do |resource, options|
93
- self.content_type ||= Mime[:jsonapi]
93
+ self.content_type = Mime[:jsonapi] if self.media_type.nil?
94
94
 
95
95
  JSONAPI_METHODS_MAPPING.to_a[0..1].each do |opt, method_name|
96
96
  next unless respond_to?(method_name, true)
@@ -100,7 +100,7 @@ module JSONAPI
100
100
  # If it's an empty collection, return it directly.
101
101
  many = JSONAPI::Rails.is_collection?(resource, options[:is_collection])
102
102
  if many && !resource.any?
103
- return options.slice(:meta, :links).merge(data: []).to_json
103
+ return options.slice(:meta, :links).compact.merge(data: []).to_json
104
104
  end
105
105
 
106
106
  JSONAPI_METHODS_MAPPING.to_a[2..-1].each do |opt, method_name|
@@ -121,15 +121,13 @@ module JSONAPI
121
121
 
122
122
  # Checks if an object is a collection
123
123
  #
124
- # Stolen from [JSONAPI::Serializer], instance method.
124
+ # Basically forwards it to a [JSONAPI::Serializer] as there's no public API
125
125
  #
126
126
  # @param resource [Object] to check
127
127
  # @param force_is_collection [NilClass] flag to overwrite
128
128
  # @return [TrueClass] upon success
129
129
  def self.is_collection?(resource, force_is_collection = nil)
130
- return force_is_collection unless force_is_collection.nil?
131
-
132
- resource.respond_to?(:size) && !resource.respond_to?(:each_pair)
130
+ JSONAPI::ErrorSerializer.is_collection?(resource, force_is_collection)
133
131
  end
134
132
 
135
133
  # Resolves resource serializer class
@@ -1,3 +1,3 @@
1
1
  module JSONAPI
2
- VERSION = '1.7.0'
2
+ VERSION = '2.0.1'
3
3
  end
data/spec/dummy.rb CHANGED
@@ -1,8 +1,7 @@
1
1
  require 'securerandom'
2
- require 'active_record'
3
- require 'action_controller/railtie'
4
- require 'jsonapi'
2
+ require 'rails/all'
5
3
  require 'ransack'
4
+ require 'jsonapi'
6
5
 
7
6
  Rails.logger = Logger.new(STDOUT)
8
7
  Rails.logger.level = ENV['LOG_LEVEL'] || Logger::WARN
data/spec/errors_spec.rb CHANGED
@@ -56,7 +56,7 @@ RSpec.describe NotesController, type: :request do
56
56
  .to eq(Rack::Utils::HTTP_STATUS_CODES[422])
57
57
  expect(response_json['errors'][0]['source'])
58
58
  .to eq('pointer' => '/data/relationships/user')
59
- if Rails::VERSION::MAJOR >= 6 && Rails::VERSION::MINOR >= 1
59
+ if Rails.gem_version >= Gem::Version.new('6.1')
60
60
  expect(response_json['errors'][0]['detail'])
61
61
  .to eq('User must exist')
62
62
  else
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonapi.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stas Suscov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-17 00:00:00.000000000 Z
11
+ date: 2022-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jsonapi-serializer
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: ransack
28
+ name: rack
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,13 +39,13 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rack
42
+ name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
- type: :runtime
48
+ type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
@@ -53,7 +53,21 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: bundler
56
+ name: ransack
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: railties
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
@@ -67,7 +81,7 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rails
84
+ name: activerecord
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
@@ -251,7 +265,7 @@ homepage: https://github.com/stas/jsonapi.rb
251
265
  licenses:
252
266
  - MIT
253
267
  metadata: {}
254
- post_install_message:
268
+ post_install_message: Install manually `ransack` gem before using `JSONAPI::Filtering`!
255
269
  rdoc_options: []
256
270
  require_paths:
257
271
  - lib
@@ -266,8 +280,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
266
280
  - !ruby/object:Gem::Version
267
281
  version: '0'
268
282
  requirements: []
269
- rubygems_version: 3.2.3
270
- signing_key:
283
+ rubygems_version: 3.3.3
284
+ signing_key:
271
285
  specification_version: 4
272
286
  summary: So you say you need JSON:API support in your API...
273
287
  test_files: []