jsonapi.rb 1.4.5 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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