graphiti 2.0.2 → 2.1.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/docs.yml +5 -0
  3. data/.github/workflows/release.yml +5 -0
  4. data/CHANGELOG.md +20 -0
  5. data/bin/cut-docs-version +24 -0
  6. data/lib/generators/graphiti/generator_mixin.rb +1 -1
  7. data/lib/generators/graphiti/templates/application_resource.rb.erb +5 -5
  8. data/lib/graphiti/adapters/abstract.rb +8 -0
  9. data/lib/graphiti/adapters/active_record.rb +8 -0
  10. data/lib/graphiti/adapters/persistence/associations.rb +6 -1
  11. data/lib/graphiti/audit/report.rb +3 -1
  12. data/lib/graphiti/audit.rb +14 -1
  13. data/lib/graphiti/errors.rb +36 -0
  14. data/lib/graphiti/query.rb +7 -0
  15. data/lib/graphiti/request_validators/validator.rb +10 -1
  16. data/lib/graphiti/resource/configuration.rb +124 -4
  17. data/lib/graphiti/resource/dsl.rb +54 -0
  18. data/lib/graphiti/resource/interface.rb +39 -0
  19. data/lib/graphiti/resource/persistence.rb +29 -0
  20. data/lib/graphiti/resource/sideloading.rb +2 -0
  21. data/lib/graphiti/resource.rb +4 -0
  22. data/lib/graphiti/resource_proxy.rb +6 -3
  23. data/lib/graphiti/runner.rb +3 -1
  24. data/lib/graphiti/schema.rb +4 -0
  25. data/lib/graphiti/schema_diff.rb +5 -0
  26. data/lib/graphiti/scope.rb +8 -0
  27. data/lib/graphiti/scoping/default_filter.rb +2 -0
  28. data/lib/graphiti/scoping/filter.rb +79 -20
  29. data/lib/graphiti/scoping/sort.rb +1 -1
  30. data/lib/graphiti/sideload/belongs_to.rb +52 -8
  31. data/lib/graphiti/sideload/has_many.rb +33 -2
  32. data/lib/graphiti/sideload/many_to_many.rb +3 -3
  33. data/lib/graphiti/sideload.rb +25 -1
  34. data/lib/graphiti/stats/payload.rb +20 -3
  35. data/lib/graphiti/util/internal_param.rb +16 -0
  36. data/lib/graphiti/util/link.rb +10 -3
  37. data/lib/graphiti/util/persistence.rb +1 -1
  38. data/lib/graphiti/util/public_id_block.rb +15 -0
  39. data/lib/graphiti/util/public_id_map.rb +34 -0
  40. data/lib/graphiti/util/public_id_sources.rb +27 -0
  41. data/lib/graphiti/util/serializer_relationships.rb +5 -3
  42. data/lib/graphiti/version.rb +1 -1
  43. data/lib/graphiti.rb +16 -0
  44. metadata +6 -1
@@ -0,0 +1,34 @@
1
+ module Graphiti
2
+ module Util
3
+ class PublicIdMap
4
+ def initialize(resource_class, filter_name)
5
+ @resource_class = resource_class
6
+ @filter_name = filter_name
7
+ @pending = Concurrent::Map.new
8
+ @resolved = {}
9
+ end
10
+
11
+ def add(primary_keys)
12
+ primary_keys.each { |key| @pending[key] = true unless @resolved.key?(key) }
13
+ end
14
+
15
+ def [](primary_key)
16
+ return if primary_key.nil?
17
+
18
+ resolve(@pending.keys) unless @pending.empty?
19
+ resolve([primary_key]) unless @resolved.key?(primary_key)
20
+ @resolved[primary_key]
21
+ end
22
+
23
+ private
24
+
25
+ def resolve(primary_keys)
26
+ found = @resource_class.public_ids_by(@filter_name, primary_keys)
27
+ primary_keys.each do |key|
28
+ @pending.delete(key)
29
+ @resolved[key] = found[key]
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ module Graphiti
2
+ module Util
3
+ class PublicIdSources
4
+ def initialize
5
+ @sources = {}
6
+ end
7
+
8
+ def register(child_resource_class, filter_name, parent_resource_class)
9
+ key = [child_resource_class.name, filter_name.to_sym]
10
+ registered = @sources[key]
11
+ if registered && registered.name != parent_resource_class.name
12
+ raise Errors::ConflictingPublicIdSource.new(child_resource_class, filter_name, registered, parent_resource_class)
13
+ end
14
+ @sources[key] = parent_resource_class
15
+ end
16
+
17
+ def [](child_resource_class, filter_name)
18
+ klass = child_resource_class
19
+ while klass
20
+ source = @sources[[klass.name, filter_name.to_sym]]
21
+ return source if source
22
+ klass = klass.superclass
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -83,10 +83,12 @@ module Graphiti
83
83
  .new(resource_class_ref, sideload_ref, @object)
84
84
  end
85
85
 
86
- unless foreign_key.nil?
86
+ related_id = sideload_ref.rendered_id_for(foreign_key, @proxy.query)
87
+
88
+ unless related_id.nil?
87
89
  {
88
90
  type: sideload_ref.resource.type,
89
- id: foreign_key.to_s
91
+ id: related_id.to_s
90
92
  }
91
93
  end
92
94
  end
@@ -98,7 +100,7 @@ module Graphiti
98
100
  self_ref.send(:validate_link!) unless self_ref.send(:eagerly_validate_links?)
99
101
 
100
102
  link(:related) do
101
- ::Graphiti::Util::Link.new(sideload_ref, @object).generate
103
+ ::Graphiti::Util::Link.new(sideload_ref, @object, @proxy.query).generate
102
104
  end
103
105
  end
104
106
  end
@@ -1,3 +1,3 @@
1
1
  module Graphiti
2
- VERSION = "2.0.2"
2
+ VERSION = "2.1.1"
3
3
  end
data/lib/graphiti.rb CHANGED
@@ -92,6 +92,18 @@ module Graphiti
92
92
  @resources ||= []
93
93
  end
94
94
 
95
+ def self.public_id_sources
96
+ @public_id_sources ||= Util::PublicIdSources.new
97
+ end
98
+
99
+ def self.public_ids_declared?
100
+ !!@public_ids_declared
101
+ end
102
+
103
+ def self.public_ids_declared=(value)
104
+ @public_ids_declared = value
105
+ end
106
+
95
107
  # Every guarded relationship, e.g. ["EmployeeResource.positions"]
96
108
  def self.guarded_relationships
97
109
  ::Rails.application.eager_load! if defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
@@ -226,6 +238,10 @@ require "graphiti/util/sideload"
226
238
  require "graphiti/util/simple_errors"
227
239
  require "graphiti/util/transaction_hooks_recorder"
228
240
  require "graphiti/util/attribute_check"
241
+ require "graphiti/util/internal_param"
242
+ require "graphiti/util/public_id_block"
243
+ require "graphiti/util/public_id_map"
244
+ require "graphiti/util/public_id_sources"
229
245
  require "graphiti/util/serializer_attributes"
230
246
  require "graphiti/util/serializer_relationships"
231
247
  require "graphiti/util/class"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphiti
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lee Richmond
@@ -275,6 +275,7 @@ files:
275
275
  - UPGRADING.md
276
276
  - bin/appraisal
277
277
  - bin/console
278
+ - bin/cut-docs-version
278
279
  - bin/rspec
279
280
  - bin/setup
280
281
  - exe/graphiti
@@ -397,8 +398,12 @@ files:
397
398
  - lib/graphiti/util/field_params.rb
398
399
  - lib/graphiti/util/hash.rb
399
400
  - lib/graphiti/util/include_params.rb
401
+ - lib/graphiti/util/internal_param.rb
400
402
  - lib/graphiti/util/link.rb
401
403
  - lib/graphiti/util/persistence.rb
404
+ - lib/graphiti/util/public_id_block.rb
405
+ - lib/graphiti/util/public_id_map.rb
406
+ - lib/graphiti/util/public_id_sources.rb
402
407
  - lib/graphiti/util/relationship_payload.rb
403
408
  - lib/graphiti/util/remote_params.rb
404
409
  - lib/graphiti/util/remote_serializer.rb