graphiti 1.2.15 → 1.2.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +43 -14
  3. data/Appraisals +37 -5
  4. data/CHANGELOG.md +1 -1
  5. data/Gemfile +2 -0
  6. data/Guardfile +5 -5
  7. data/deprecated_generators/graphiti/resource_generator.rb +1 -1
  8. data/gemfiles/rails_5_0.gemfile +18 -0
  9. data/gemfiles/rails_5_0_graphiti_rails.gemfile +20 -0
  10. data/gemfiles/rails_5_1.gemfile +18 -0
  11. data/gemfiles/rails_5_1_graphiti_rails.gemfile +20 -0
  12. data/gemfiles/{rails_5.gemfile → rails_5_2.gemfile} +0 -0
  13. data/gemfiles/{rails_5_graphiti_rails.gemfile → rails_5_2_graphiti_rails.gemfile} +0 -0
  14. data/gemfiles/rails_6.gemfile +1 -1
  15. data/gemfiles/rails_6_graphiti_rails.gemfile +1 -1
  16. data/graphiti.gemspec +11 -12
  17. data/lib/graphiti.rb +3 -3
  18. data/lib/graphiti/adapters/abstract.rb +3 -3
  19. data/lib/graphiti/adapters/active_record.rb +65 -36
  20. data/lib/graphiti/adapters/active_record/many_to_many_sideload.rb +2 -1
  21. data/lib/graphiti/configuration.rb +1 -1
  22. data/lib/graphiti/debugger.rb +4 -4
  23. data/lib/graphiti/delegates/pagination.rb +8 -4
  24. data/lib/graphiti/deserializer.rb +3 -3
  25. data/lib/graphiti/errors.rb +24 -4
  26. data/lib/graphiti/extensions/extra_attribute.rb +1 -1
  27. data/lib/graphiti/query.rb +32 -16
  28. data/lib/graphiti/railtie.rb +1 -1
  29. data/lib/graphiti/request_validator.rb +4 -4
  30. data/lib/graphiti/request_validators/update_validator.rb +1 -2
  31. data/lib/graphiti/request_validators/validator.rb +2 -2
  32. data/lib/graphiti/resource.rb +10 -0
  33. data/lib/graphiti/resource/configuration.rb +10 -3
  34. data/lib/graphiti/resource/dsl.rb +10 -4
  35. data/lib/graphiti/resource/interface.rb +2 -2
  36. data/lib/graphiti/resource/links.rb +3 -3
  37. data/lib/graphiti/resource/persistence.rb +2 -1
  38. data/lib/graphiti/resource/polymorphism.rb +3 -2
  39. data/lib/graphiti/resource/remote.rb +1 -1
  40. data/lib/graphiti/runner.rb +4 -3
  41. data/lib/graphiti/schema.rb +6 -6
  42. data/lib/graphiti/scope.rb +5 -5
  43. data/lib/graphiti/scoping/base.rb +3 -3
  44. data/lib/graphiti/scoping/filter.rb +17 -7
  45. data/lib/graphiti/scoping/sort.rb +1 -1
  46. data/lib/graphiti/serializer.rb +7 -0
  47. data/lib/graphiti/sideload.rb +30 -22
  48. data/lib/graphiti/sideload/belongs_to.rb +1 -1
  49. data/lib/graphiti/sideload/has_many.rb +19 -1
  50. data/lib/graphiti/sideload/many_to_many.rb +6 -2
  51. data/lib/graphiti/stats/payload.rb +4 -4
  52. data/lib/graphiti/types.rb +15 -15
  53. data/lib/graphiti/util/link.rb +6 -2
  54. data/lib/graphiti/util/persistence.rb +16 -10
  55. data/lib/graphiti/util/relationship_payload.rb +4 -4
  56. data/lib/graphiti/util/simple_errors.rb +1 -1
  57. data/lib/graphiti/util/transaction_hooks_recorder.rb +1 -1
  58. data/lib/graphiti/version.rb +1 -1
  59. metadata +18 -22
@@ -15,10 +15,10 @@ module Graphiti
15
15
  # }
16
16
  class Payload
17
17
  def initialize(resource, query, scope, data)
18
- @resource = resource
19
- @query = query
20
- @scope = scope
21
- @data = data
18
+ @resource = resource
19
+ @query = query
20
+ @scope = scope
21
+ @data = data
22
22
  end
23
23
 
24
24
  # Generate the payload for +{ meta: { stats: { ... } } }+
@@ -93,14 +93,14 @@ module Graphiti
93
93
  read: Dry::Types["coercible.string"],
94
94
  write: Dry::Types["coercible.integer"],
95
95
  kind: "scalar",
96
- description: "Base Type. Query/persist as integer, render as string.",
96
+ description: "Base Type. Query/persist as integer, render as string."
97
97
  },
98
98
  uuid: {
99
99
  params: Dry::Types["coercible.string"],
100
100
  read: Dry::Types["coercible.string"],
101
101
  write: Dry::Types["coercible.string"],
102
102
  kind: "scalar",
103
- description: "Base Type. Like a normal string, but by default only eq/!eq and case-sensitive.",
103
+ description: "Base Type. Like a normal string, but by default only eq/!eq and case-sensitive."
104
104
  },
105
105
  string_enum: {
106
106
  canonical_name: :enum,
@@ -108,7 +108,7 @@ module Graphiti
108
108
  read: Dry::Types["coercible.string"],
109
109
  write: Dry::Types["coercible.string"],
110
110
  kind: "scalar",
111
- description: "String enum type. Like a normal string, but only eq/!eq and case-sensitive. Limited to only the allowed values.",
111
+ description: "String enum type. Like a normal string, but only eq/!eq and case-sensitive. Limited to only the allowed values."
112
112
  },
113
113
  integer_enum: {
114
114
  canonical_name: :enum,
@@ -116,71 +116,71 @@ module Graphiti
116
116
  read: Dry::Types["coercible.integer"],
117
117
  write: Dry::Types["coercible.integer"],
118
118
  kind: "scalar",
119
- description: "Integer enum type. Like a normal integer, but only eq/!eq filters. Limited to only the allowed values.",
119
+ description: "Integer enum type. Like a normal integer, but only eq/!eq filters. Limited to only the allowed values."
120
120
  },
121
121
  string: {
122
122
  params: Dry::Types["coercible.string"],
123
123
  read: Dry::Types["coercible.string"],
124
124
  write: Dry::Types["coercible.string"],
125
125
  kind: "scalar",
126
- description: "Base Type.",
126
+ description: "Base Type."
127
127
  },
128
128
  integer: {
129
129
  params: PresentInteger,
130
130
  read: Integer,
131
131
  write: Integer,
132
132
  kind: "scalar",
133
- description: "Base Type.",
133
+ description: "Base Type."
134
134
  },
135
135
  big_decimal: {
136
136
  params: ParamDecimal,
137
137
  read: Dry::Types["json.decimal"],
138
138
  write: Dry::Types["json.decimal"],
139
139
  kind: "scalar",
140
- description: "Base Type.",
140
+ description: "Base Type."
141
141
  },
142
142
  float: {
143
143
  params: Dry::Types["coercible.float"],
144
144
  read: Float,
145
145
  write: Float,
146
146
  kind: "scalar",
147
- description: "Base Type.",
147
+ description: "Base Type."
148
148
  },
149
149
  boolean: {
150
150
  params: PresentBool,
151
151
  read: Bool,
152
152
  write: Bool,
153
153
  kind: "scalar",
154
- description: "Base Type.",
154
+ description: "Base Type."
155
155
  },
156
156
  date: {
157
157
  params: PresentDate,
158
158
  read: Date,
159
159
  write: Date,
160
160
  kind: "scalar",
161
- description: "Base Type.",
161
+ description: "Base Type."
162
162
  },
163
163
  datetime: {
164
164
  params: PresentParamsDateTime,
165
165
  read: ReadDateTime,
166
166
  write: WriteDateTime,
167
167
  kind: "scalar",
168
- description: "Base Type.",
168
+ description: "Base Type."
169
169
  },
170
170
  hash: {
171
171
  params: PresentParamsHash,
172
172
  read: Dry::Types["strict.hash"],
173
173
  write: Dry::Types["strict.hash"],
174
174
  kind: "record",
175
- description: "Base Type.",
175
+ description: "Base Type."
176
176
  },
177
177
  array: {
178
178
  params: Dry::Types["strict.array"],
179
179
  read: Dry::Types["strict.array"],
180
180
  write: Dry::Types["strict.array"],
181
181
  kind: "array",
182
- description: "Base Type.",
183
- },
182
+ description: "Base Type."
183
+ }
184
184
  }
185
185
 
186
186
  hash.each_pair do |k, v|
@@ -198,7 +198,7 @@ module Graphiti
198
198
  test: Dry::Types["strict.array"].of(map[:test]),
199
199
  write: Dry::Types["strict.array"].of(map[:write]),
200
200
  kind: "array",
201
- description: "Base Type.",
201
+ description: "Base Type."
202
202
  }
203
203
  end
204
204
  hash.merge!(arrays)
@@ -60,10 +60,10 @@ module Graphiti
60
60
  def params
61
61
  @params ||= {}.tap do |params|
62
62
  if @sideload.type != :belongs_to || @sideload.remote?
63
- params[:filter] = @sideload.base_filter([@model])
63
+ params[:filter] = @sideload.link_filter([@model])
64
64
  end
65
65
 
66
- @sideload.params_proc&.call(params, [@model])
66
+ @sideload.params_proc&.call(params, [@model], context)
67
67
  end
68
68
  end
69
69
 
@@ -75,6 +75,10 @@ module Graphiti
75
75
  end
76
76
  path
77
77
  end
78
+
79
+ def context
80
+ Graphiti.context[:object]
81
+ end
78
82
  end
79
83
  end
80
84
  end
@@ -8,12 +8,12 @@ class Graphiti::Util::Persistence
8
8
  # @param [Model] caller_model The persisted parent object in the request graph
9
9
  # @param [Symbol] foreign_key Attribute assigned by parent object in graph
10
10
  def initialize(resource, meta, attributes, relationships, caller_model, foreign_key = nil)
11
- @resource = resource
12
- @meta = meta
13
- @attributes = attributes
11
+ @resource = resource
12
+ @meta = meta
13
+ @attributes = attributes
14
14
  @relationships = relationships
15
- @caller_model = caller_model
16
- @foreign_key = foreign_key
15
+ @caller_model = caller_model
16
+ @foreign_key = foreign_key
17
17
 
18
18
  # Find the correct child resource for a given jsonapi type
19
19
  if (meta_type = @meta[:type].try(:to_sym))
@@ -177,9 +177,15 @@ class Graphiti::Util::Persistence
177
177
  def process_belongs_to(relationships)
178
178
  [].tap do |processed|
179
179
  iterate(only: [:polymorphic_belongs_to, :belongs_to]) do |x|
180
- x[:object] = x[:resource]
181
- .persist_with_relationships(x[:meta], x[:attributes], x[:relationships])
182
- processed << x
180
+ begin
181
+ id = x.dig(:attributes, :id)
182
+ x[:object] = x[:resource]
183
+ .persist_with_relationships(x[:meta], x[:attributes], x[:relationships])
184
+ processed << x
185
+ rescue Graphiti::Errors::RecordNotFound
186
+ path = "relationships/#{x.dig(:meta, :jsonapi_type)}"
187
+ raise Graphiti::Errors::RecordNotFound.new(x[:sideload].name, id, path)
188
+ end
183
189
  end
184
190
  end
185
191
  end
@@ -202,7 +208,7 @@ class Graphiti::Util::Persistence
202
208
  def iterate(only: [], except: [])
203
209
  opts = {
204
210
  resource: @resource,
205
- relationships: @relationships,
211
+ relationships: @relationships
206
212
  }.merge(only: only, except: except)
207
213
 
208
214
  Graphiti::Util::RelationshipPayload.iterate(opts) do |x|
@@ -216,7 +222,7 @@ class Graphiti::Util::Persistence
216
222
  temp_id: @meta[:temp_id],
217
223
  caller_model: @caller_model,
218
224
  attributes: @attributes,
219
- relationships: @relationships,
225
+ relationships: @relationships
220
226
  }
221
227
  end
222
228
 
@@ -14,9 +14,9 @@ module Graphiti
14
14
 
15
15
  def initialize(resource, payload, only: [], except: [])
16
16
  @resource = resource
17
- @payload = payload
18
- @only = only
19
- @except = except
17
+ @payload = payload
18
+ @only = only
19
+ @except = except
20
20
  end
21
21
 
22
22
  def iterate
@@ -67,7 +67,7 @@ module Graphiti
67
67
  foreign_key: sideload.foreign_key,
68
68
  attributes: relationship_payload[:attributes],
69
69
  meta: relationship_payload[:meta],
70
- relationships: relationship_payload[:relationships],
70
+ relationships: relationship_payload[:relationships]
71
71
  }
72
72
  end
73
73
  end
@@ -53,7 +53,7 @@ module Graphiti
53
53
  def add(attribute, code, message: nil)
54
54
  message ||= "is #{code.to_s.humanize.downcase}"
55
55
 
56
- details[attribute.to_sym] << {error: code}
56
+ details[attribute.to_sym] << {error: code}
57
57
  messages[attribute.to_sym] << message
58
58
  end
59
59
 
@@ -65,7 +65,7 @@ module Graphiti
65
65
  Thread.current[:_graphiti_hooks] = {
66
66
  after_graph_persist: [],
67
67
  before_commit: [],
68
- after_commit: [],
68
+ after_commit: []
69
69
  }
70
70
  end
71
71
 
@@ -1,3 +1,3 @@
1
1
  module Graphiti
2
- VERSION = "1.2.15"
2
+ VERSION = "1.2.20"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphiti
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.15
4
+ version: 1.2.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lee Richmond
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-31 00:00:00.000000000 Z
11
+ date: 2020-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jsonapi-serializable
@@ -28,16 +28,22 @@ dependencies:
28
28
  name: jsonapi-renderer
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.2'
34
+ - - ">="
32
35
  - !ruby/object:Gem::Version
33
- version: 0.2.0
36
+ version: 0.2.2
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - '='
41
+ - - "~>"
39
42
  - !ruby/object:Gem::Version
40
- version: 0.2.0
43
+ version: '0.2'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 0.2.2
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: dry-types
43
49
  requirement: !ruby/object:Gem::Requirement
@@ -184,20 +190,6 @@ dependencies:
184
190
  - - '='
185
191
  - !ruby/object:Gem::Version
186
192
  version: 1.0.beta.4
187
- - !ruby/object:Gem::Dependency
188
- name: standard
189
- requirement: !ruby/object:Gem::Requirement
190
- requirements:
191
- - - ">="
192
- - !ruby/object:Gem::Version
193
- version: '0'
194
- type: :development
195
- prerelease: false
196
- version_requirements: !ruby/object:Gem::Requirement
197
- requirements:
198
- - - ">="
199
- - !ruby/object:Gem::Version
200
- version: '0'
201
193
  description:
202
194
  email:
203
195
  - richmolj@gmail.com
@@ -241,8 +233,12 @@ files:
241
233
  - exe/graphiti
242
234
  - gemfiles/.bundle/config
243
235
  - gemfiles/rails_4.gemfile
244
- - gemfiles/rails_5.gemfile
245
- - gemfiles/rails_5_graphiti_rails.gemfile
236
+ - gemfiles/rails_5_0.gemfile
237
+ - gemfiles/rails_5_0_graphiti_rails.gemfile
238
+ - gemfiles/rails_5_1.gemfile
239
+ - gemfiles/rails_5_1_graphiti_rails.gemfile
240
+ - gemfiles/rails_5_2.gemfile
241
+ - gemfiles/rails_5_2_graphiti_rails.gemfile
246
242
  - gemfiles/rails_6.gemfile
247
243
  - gemfiles/rails_6_graphiti_rails.gemfile
248
244
  - graphiti.gemspec