jsonapi.rb 1.4.5 → 1.5.0

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
  SHA1:
3
- metadata.gz: 850595e9b5bf8986638858acb52e4a64f4882dab
4
- data.tar.gz: ff03ece83d7e7a167a8ff58014e010d59eeeb224
3
+ metadata.gz: b3492c86c9c8e6353590ddd3adad00d0e554e440
4
+ data.tar.gz: e4f87cea9894b17a0da2214c809fafa0fcebf1aa
5
5
  SHA512:
6
- metadata.gz: d5ab4e7832394a0ba81c95d3995afb1795915629273cfc00a65f573405a98935f943f3b6a0637e7200e0f34f983681b87facf71c48eac28f207a0fe5e3dc2d81
7
- data.tar.gz: b70da22e0a92a35333ea9d82ee63ae639c529c8eb751597ab43c0ecfe25ab0956070df89a0930ecce8b62a64a23a889f5db3bb52a6e410ac83e3137682529033
6
+ metadata.gz: fdf8daac2d2c4a163dd345f4040fc580dae562a32e5e9300a38712fd08e3e58dc0b88ffbbb044e3a2a6eeb5ac10263fa53fd73aeee7763c7abe940d3e9673f9a
7
+ data.tar.gz: 25d316c614bf7801fd7a5a7b701e285368acd05f8cb0e048c621a720f00752bcf3dfa113ff9d1dfe8c8921b269a556a52a88b7bedc1db81e42300bd901fb3d91
@@ -2,9 +2,9 @@ workflow "Tests" {
2
2
  on = "push"
3
3
  resolves = [
4
4
  "rspec-ruby2.3_rails4",
5
- "rspec-ruby2.3_rails5",
6
5
  "rspec-ruby2.6_rails4",
7
- "rspec-ruby2.6_rails5"
6
+ "rspec-ruby2.6_rails5",
7
+ "rspec-ruby2.6_rails6"
8
8
  ]
9
9
  }
10
10
 
@@ -12,6 +12,7 @@ action "rspec-ruby2.3_rails4" {
12
12
  uses = "docker://ruby:2.3-alpine"
13
13
  env = {
14
14
  RAILS_VERSION = "~> 4"
15
+ SQLITE3_VERSION = "~> 1.3.6"
15
16
  }
16
17
  args = [
17
18
  "sh", "-c",
@@ -19,11 +20,12 @@ action "rspec-ruby2.3_rails4" {
19
20
  ]
20
21
  }
21
22
 
22
- action "rspec-ruby2.3_rails5" {
23
- uses = "docker://ruby:2.3-alpine"
23
+ action "rspec-ruby2.6_rails4" {
24
+ uses = "docker://ruby:2.6-alpine"
24
25
  needs = ["rspec-ruby2.3_rails4"]
25
26
  env = {
26
- RAILS_VERSION = "~> 5"
27
+ RAILS_VERSION = "~> 4"
28
+ SQLITE3_VERSION = "~> 1.3.6"
27
29
  }
28
30
  args = [
29
31
  "sh", "-c",
@@ -31,11 +33,11 @@ action "rspec-ruby2.3_rails5" {
31
33
  ]
32
34
  }
33
35
 
34
- action "rspec-ruby2.6_rails4" {
36
+ action "rspec-ruby2.6_rails5" {
35
37
  uses = "docker://ruby:2.6-alpine"
36
- needs = ["rspec-ruby2.3_rails5"]
38
+ needs = ["rspec-ruby2.6_rails4"]
37
39
  env = {
38
- RAILS_VERSION = "~> 4"
40
+ RAILS_VERSION = "~> 5"
39
41
  }
40
42
  args = [
41
43
  "sh", "-c",
@@ -43,11 +45,11 @@ action "rspec-ruby2.6_rails4" {
43
45
  ]
44
46
  }
45
47
 
46
- action "rspec-ruby2.6_rails5" {
48
+ action "rspec-ruby2.6_rails6" {
47
49
  uses = "docker://ruby:2.6-alpine"
48
- needs = ["rspec-ruby2.6_rails4"]
50
+ needs = ["rspec-ruby2.6_rails5"]
49
51
  env = {
50
- RAILS_VERSION = "~> 5"
52
+ RAILS_VERSION = "~> 6.0.0.rc1"
51
53
  }
52
54
  args = [
53
55
  "sh", "-c",
data/Gemfile CHANGED
@@ -3,5 +3,4 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in jsonapi.gemspec
4
4
  gemspec
5
5
 
6
- gem 'jsonapi-rspec', github: 'stas/jsonapi-rspec'
7
- gem 'rails', ENV['RAILS_VERSION']
6
+ gem 'jsonapi-rspec', git: 'https://github.com/stas/jsonapi-rspec.git'
@@ -1,5 +1,5 @@
1
1
  GIT
2
- remote: git://github.com/stas/jsonapi-rspec.git
2
+ remote: https://github.com/stas/jsonapi-rspec.git
3
3
  revision: f223a3d5531cf2c0ce2f90aa8dac2bae46b2d499
4
4
  specs:
5
5
  jsonapi-rspec (0.0.2)
@@ -8,7 +8,7 @@ GIT
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- jsonapi.rb (1.4.5)
11
+ jsonapi.rb (1.5.0)
12
12
  fast_jsonapi (~> 1.5)
13
13
  rack
14
14
  ransack
@@ -90,9 +90,8 @@ GEM
90
90
  nokogiri (1.10.3)
91
91
  mini_portile2 (~> 2.4.0)
92
92
  parallel (1.17.0)
93
- parser (2.6.2.1)
93
+ parser (2.6.3.0)
94
94
  ast (~> 2.4.0)
95
- psych (3.1.0)
96
95
  rack (2.0.7)
97
96
  rack-test (1.1.0)
98
97
  rack (>= 1.0, < 3)
@@ -148,16 +147,15 @@ GEM
148
147
  rspec-mocks (~> 3.8.0)
149
148
  rspec-support (~> 3.8.0)
150
149
  rspec-support (3.8.0)
151
- rubocop (0.67.2)
150
+ rubocop (0.68.1)
152
151
  jaro_winkler (~> 1.5.1)
153
152
  parallel (~> 1.10)
154
153
  parser (>= 2.5, != 2.5.1.1)
155
- psych (>= 3.1.0)
156
154
  rainbow (>= 2.2.2, < 4.0)
157
155
  ruby-progressbar (~> 1.7)
158
156
  unicode-display_width (>= 1.4.0, < 1.6)
159
- rubocop-performance (1.1.0)
160
- rubocop (>= 0.67.0)
157
+ rubocop-performance (1.2.0)
158
+ rubocop (>= 0.68.0)
161
159
  rubocop-rails_config (0.5.1)
162
160
  railties (>= 3.0)
163
161
  rubocop (~> 0.60)
@@ -174,7 +172,7 @@ GEM
174
172
  actionpack (>= 4.0)
175
173
  activesupport (>= 4.0)
176
174
  sprockets (>= 3.0.0)
177
- sqlite3 (1.3.13)
175
+ sqlite3 (1.4.1)
178
176
  thor (0.20.3)
179
177
  thread_safe (0.3.6)
180
178
  tzinfo (1.2.5)
@@ -201,7 +199,7 @@ DEPENDENCIES
201
199
  rubocop-performance
202
200
  rubocop-rails_config
203
201
  simplecov
204
- sqlite3 (~> 1.3.6)
202
+ sqlite3
205
203
  yardstick
206
204
 
207
205
  BUNDLED WITH
data/README.md CHANGED
@@ -74,6 +74,7 @@ Or install it yourself as:
74
74
  * [Filtering and sorting](#filtering-and-sorting)
75
75
  * [Sorting using expressions](#sorting-using-expressions)
76
76
  * [Pagination](#pagination)
77
+ * [Deserialization](#deserialization)
77
78
 
78
79
  ---
79
80
 
@@ -303,8 +304,38 @@ use the `jsonapi_pagination_meta` method:
303
304
 
304
305
  { pagination: pagination } if pagination.present?
305
306
  end
307
+
308
+ ```
309
+ ### Deserialization
310
+
311
+ `JSONAPI::Deserialization` provides a helper to transform a `JSONAPI` document
312
+ into a flat dictionary that can be used to update an `ActiveRecord::Base` model.
313
+
314
+ Here's an example using the `jsonapi_deserialize` helper:
315
+
316
+ ```ruby
317
+ class MyController < ActionController::Base
318
+ include JSONAPI::Deserialization
319
+
320
+ def update
321
+ model = MyModel.find(params[:id])
322
+
323
+ if model.update(jsonapi_deserialize(only: [:attr1, :rel_one]))
324
+ render jsonapi: model
325
+ else
326
+ render jsonapi_errors: model.errors, status: :unprocessable_entity
327
+ end
328
+ end
329
+ end
306
330
  ```
307
331
 
332
+ The `jsonapi_deserialize` helper accepts the following options:
333
+
334
+ * `only`: returns exclusively attributes/relationship data in the provided list
335
+ * `except`: returns exclusively attributes/relationship which are not in the list
336
+ * `polymorphic`: will add and detect the `_type` attribute and class to the
337
+ defined list of polymorphic relationships
338
+
308
339
  ## Development
309
340
 
310
341
  After checking out the repo, run `bundle` to install dependencies.
data/Rakefile CHANGED
@@ -4,6 +4,14 @@ require 'rubocop/rake_task'
4
4
  require 'yaml'
5
5
  require 'yardstick'
6
6
 
7
+ # TODO: Remove once merged...
8
+ # https://github.com/toshimaru/rubocop-rails_config/pull/43
9
+ require 'rubocop'
10
+ module RuboCop
11
+ Config::OBSOLETE_COPS = Config::OBSOLETE_COPS.dup
12
+ Config::OBSOLETE_COPS.delete('Layout/FirstParameterIndentation')
13
+ end
14
+
7
15
  desc('Documentation stats and measurements')
8
16
  task('qa:docs') do
9
17
  yaml = YAML.load_file(File.expand_path('../.yardstick.yml', __FILE__))
@@ -26,8 +26,8 @@ Gem::Specification.new do |spec|
26
26
  spec.add_dependency 'rack'
27
27
 
28
28
  spec.add_development_dependency 'bundler'
29
- spec.add_development_dependency 'rails'
30
- spec.add_development_dependency 'sqlite3', '~> 1.3.6'
29
+ spec.add_development_dependency 'rails', ENV['RAILS_VERSION']
30
+ spec.add_development_dependency 'sqlite3', ENV['SQLITE3_VERSION']
31
31
  spec.add_development_dependency 'ffaker'
32
32
  spec.add_development_dependency 'rspec', '~> 3.0'
33
33
  spec.add_development_dependency 'rspec-rails'
@@ -2,6 +2,7 @@ require 'jsonapi/errors'
2
2
  require 'jsonapi/fetching'
3
3
  require 'jsonapi/filtering'
4
4
  require 'jsonapi/pagination'
5
+ require 'jsonapi/deserialization'
5
6
  require 'jsonapi/rails'
6
7
  require 'jsonapi/version'
7
8
 
@@ -0,0 +1,66 @@
1
+ require 'active_support/inflector'
2
+
3
+ module JSONAPI
4
+ # Helpers to transform a JSON API document, containing a single data object,
5
+ # into a hash that can be used to create an [ActiveRecord::Base] instance.
6
+ #
7
+ # Initial version from the `active_model_serializers` support for JSONAPI.
8
+ module Deserialization
9
+ private
10
+
11
+ # Returns a transformed dictionary following [ActiveRecord::Base] specs
12
+ #
13
+ # @param [Hash|ActionController::Parameters] document
14
+ # @param [Hash] options
15
+ # only: Array of symbols of whitelisted fields.
16
+ # except: Array of symbols of blacklisted fields.
17
+ # polymorphic: Array of symbols of polymorphic fields.
18
+ # @return [Hash]
19
+ def jsonapi_deserialize(document, options = {})
20
+ if document.is_a?(ActionController::Parameters)
21
+ primary_data = document.dup.require(:data).permit!.as_json
22
+ elsif document.is_a?(Hash)
23
+ primary_data = (document.as_json['data'] || {}).deep_dup
24
+ else
25
+ return {}
26
+ end
27
+
28
+ # Transform keys and any option values.
29
+ options = options.as_json
30
+ ['only', 'except', 'polymorphic'].each do |opt_name|
31
+ opt_value = options[opt_name]
32
+ options[opt_name] = Array(opt_value).map(&:to_s) if opt_value
33
+ end
34
+
35
+ relationships = primary_data['relationships'] || {}
36
+ parsed = primary_data['attributes'] || {}
37
+ parsed['id'] = primary_data['id'] if primary_data['id']
38
+
39
+ # Remove unwanted items from a dictionary.
40
+ if options['only']
41
+ [parsed, relationships].map { |hsh| hsh.slice!(*options['only']) }
42
+ elsif options['except']
43
+ [parsed, relationships].map { |hsh| hsh.except!(*options['except']) }
44
+ end
45
+
46
+ relationships.map do |assoc_name, assoc_data|
47
+ assoc_data = (assoc_data || {})['data'] || {}
48
+ rel_name = ActiveSupport::Inflector.singularize(assoc_name)
49
+
50
+ if assoc_data.is_a?(Array)
51
+ parsed["#{rel_name}_ids"] = assoc_data.map { |ri| ri['id'] }.compact
52
+ next
53
+ end
54
+
55
+ parsed["#{rel_name}_id"] = assoc_data['id']
56
+
57
+ if (options['polymorphic'] || []).include?(assoc_name)
58
+ rel_type = ActiveSupport::Inflector.classify(assoc_data['type'].to_s)
59
+ parsed["#{rel_name}_type"] = rel_type
60
+ end
61
+ end
62
+
63
+ parsed
64
+ end
65
+ end
66
+ end
@@ -1,3 +1,3 @@
1
1
  module JSONAPI
2
- VERSION = '1.4.5'
2
+ VERSION = '1.5.0'
3
3
  end
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.4.5
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stas Suscov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-25 00:00:00.000000000 Z
11
+ date: 2019-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fast_jsonapi
@@ -84,16 +84,16 @@ dependencies:
84
84
  name: sqlite3
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 1.3.6
89
+ version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 1.3.6
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: ffaker
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -226,6 +226,7 @@ files:
226
226
  - jsonapi.rb.gemspec
227
227
  - lib/jsonapi.rb
228
228
  - lib/jsonapi/active_model_error_serializer.rb
229
+ - lib/jsonapi/deserialization.rb
229
230
  - lib/jsonapi/error_serializer.rb
230
231
  - lib/jsonapi/errors.rb
231
232
  - lib/jsonapi/fetching.rb