stardust_rails 0.1.5 → 0.2.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: 41d197de80311465083b2a077928c9596d3cd09d9e40eda5d3a99e192221fb6b
4
- data.tar.gz: 1ad4039b7680fc84551378f3396e39874973ea2a61c58c7ea96d52edd044d0c6
3
+ metadata.gz: aa6e10e22d8d799f598f60255bb03c98b15cc4902b6ae4ccfbc34eb5965eda70
4
+ data.tar.gz: b69399a62c129c1641bb2b2ee50e4b014f93d7b6c9625df5ae3b62d82d1d0a83
5
5
  SHA512:
6
- metadata.gz: 353aee78618953ab9639f19d3c0f70974be15194f713f737ba090e47ac4776e4996f0a2f0113c0bd0b53d1fc3a26fa9604bc7e845ecbe3a6237d9c3e88a3018f
7
- data.tar.gz: 95042a4410280ec215547f44701d2d9ad6aebebb8fe77a212252e179c3f577dffbab94474ed56d589a691c76b524b037db03e3bc77dbea8b318795f0c1afa0b1
6
+ metadata.gz: bb54381d239ae21badd2bf78765e21a7b34c7b7ccee9c66454c3685f367529a6fc5e39e11b8791a74f27341a01a91709882fe72832d199ef7acedf7a509f0f81
7
+ data.tar.gz: e8bdf067a1fba4fb033915b4e8df979952d9183d7299c139dd90dbb7d8ad3268ac7f315212fd10169999ea458d5478338055534d92fa89f08141e1c426c46b3a
@@ -8,11 +8,11 @@ module Stardust
8
8
  result = GraphQL::Schema.execute(
9
9
  query,
10
10
  variables: variables,
11
- context: context,
11
+ context: context.merge({tracing_enabled: tracing_enabled}),
12
12
  operation_name: operation_name
13
13
  )
14
14
  end
15
- render json: result
15
+ render json: ApolloFederation::Tracing.attach_trace_to_result(result)
16
16
 
17
17
 
18
18
  rescue Stardust::Errors::FailedAuthorization => e
@@ -39,6 +39,10 @@ module Stardust
39
39
  ensure_hash(params[:variables])
40
40
  end
41
41
 
42
+ def tracing_enabled
43
+ ApolloFederation::Tracing.should_add_traces(headers)
44
+ end
45
+
42
46
  def context
43
47
  setup_context = Stardust.configuration.graphql.setup_context
44
48
  setup_context ? setup_context.(request) : {}
@@ -16,14 +16,17 @@ module Stardust
16
16
  end
17
17
  end
18
18
 
19
+ require "stardust/graphql/warden_patch"
19
20
  require "stardust/graphql/collector"
20
21
  require "stardust/graphql/configuration"
21
22
  require "stardust/graphql/field"
22
23
  require "stardust/graphql/input_object"
23
24
  require "stardust/graphql/mutation"
25
+ require "stardust/graphql/interface"
24
26
  require "stardust/graphql/object"
25
27
  require "stardust/graphql/query"
26
28
  require "stardust/graphql/scalar"
27
29
  require "stardust/graphql/union"
28
30
  require "stardust/graphql/extensions/authorize"
29
31
  require "stardust/graphql/input_object"
32
+ require "stardust/graphql/federated"
@@ -1,9 +1,14 @@
1
+ require 'apollo-federation/entities_field'
2
+ require 'apollo-federation/service_field'
3
+ require 'apollo-federation/any'
4
+
1
5
  module Stardust
2
6
  module GraphQL
3
7
  module Collector
4
8
  module_function
5
9
 
6
10
  FIXED_TYPES = {
11
+ any: ApolloFederation::Any,
7
12
  id: ::GraphQL::Types::ID,
8
13
  int: Integer,
9
14
  integer: Integer,
@@ -19,6 +24,7 @@ module Stardust
19
24
  @@__defined_types__ = []
20
25
  @@__queries__ = {}
21
26
  @@__mutations__ = {}
27
+ @@__lookedup_types__ = []
22
28
 
23
29
  def add_type(type, block, object_klass)
24
30
  if type.in?(@@__types__.keys)
@@ -27,7 +33,18 @@ module Stardust
27
33
 
28
34
  @@__defined_types__ << type.to_s.camelize
29
35
 
30
- klass = Class.new(object_klass, &block)
36
+ klass = nil
37
+ if object_klass.is_a?(Class)
38
+ klass = Class.new(object_klass, &block)
39
+ else
40
+ # interfaces are modules
41
+ klass = Module.new
42
+ klass.include(object_klass)
43
+ klass.module_eval(&block)
44
+ unless klass.graphql_name
45
+ klass.graphql_name type.to_s.camelize
46
+ end
47
+ end
31
48
 
32
49
  begin
33
50
  klass.graphql_name
@@ -46,6 +63,7 @@ module Stardust
46
63
  end
47
64
 
48
65
  @@__defined_types__ = []
66
+ @@__lookedup_types__ = []
49
67
  @@__types__ = {}.merge(FIXED_TYPES)
50
68
  @@__queries__ = {}
51
69
  @@__mutations__ = {}
@@ -73,16 +91,27 @@ module Stardust
73
91
  @@__queries__
74
92
  end
75
93
 
94
+ def self.mutations
95
+ @@__mutations__
96
+ end
97
+
76
98
  def self.lookup_type(type)
99
+ # puts "looking up #{type.class}: #{type}"
100
+
77
101
  if type.is_a?(Array)
102
+ rest = type[1..-1]
78
103
  type = type.first
79
104
  is_a_array = true
80
105
  end
81
106
 
82
107
  raise MissingType, type.to_s unless @@__types__[type]
83
108
 
109
+ @@__lookedup_types__ << type
110
+ @@__lookedup_types__ = @@__lookedup_types__.uniq
111
+
112
+
84
113
  if is_a_array
85
- [@@__types__[type]]
114
+ [@@__types__[type]] + rest
86
115
  else
87
116
  @@__types__[type]
88
117
  end
@@ -106,13 +135,48 @@ module Stardust
106
135
  if Stardust::GraphQL.const_defined?("Schema")
107
136
  Stardust::GraphQL.send(:remove_const, "Schema")
108
137
  end
138
+
109
139
  klass = Class.new(::GraphQL::Schema) do
140
+ include ::Stardust::GraphQL::Federated
141
+ use ApolloFederation::Tracing
110
142
  use ::GraphQL::Batch
143
+
111
144
  end
112
145
  Stardust::GraphQL.const_set("Schema", klass)
113
146
 
114
- query_class = Class.new(::Stardust::GraphQL::Object)
115
- query_class.graphql_name("QueryRoot")
147
+
148
+ # a lot of this is extracted from apollo federation gem
149
+ # to be used in stardust
150
+ query_class = Class.new(::Stardust::GraphQL::Object) do
151
+ graphql_name 'Query'
152
+
153
+ include ApolloFederation::EntitiesField
154
+ include ApolloFederation::ServiceField
155
+ end
156
+
157
+ possible_entities =
158
+ @@__types__
159
+ .values
160
+ .select{|i| i < Stardust::GraphQL::Object}
161
+ .map(&:to_graphql).select do |type|
162
+ !type.introspection? && !type.default_scalar? &&
163
+ type.metadata[:federation_directives]&.any? { |directive|
164
+ directive[:name] == 'key'
165
+ }
166
+ end
167
+
168
+ if !possible_entities.empty?
169
+ entity_type = Class.new(ApolloFederation::Entity) do
170
+ possible_types(*possible_entities)
171
+ end
172
+
173
+ @@__types__[:_frederated_entities] = entity_type
174
+
175
+ query_class.field(:_entities, [:_frederated_entities, null: true], null: false) do
176
+ argument :representations, [:any], required: true
177
+ end
178
+ end
179
+
116
180
  @@__queries__.each do |name, query|
117
181
 
118
182
  block = ->(field) {
@@ -149,7 +213,7 @@ module Stardust
149
213
 
150
214
 
151
215
  mutation_class = Class.new(::GraphQL::Schema::Object)
152
- mutation_class.graphql_name("MutationRoot")
216
+ mutation_class.graphql_name("Mutation")
153
217
  @@__mutations__.each do |name, mutation|
154
218
  begin
155
219
  mutation.replace_types!
@@ -164,6 +228,18 @@ module Stardust
164
228
  end
165
229
  end
166
230
  Stardust::GraphQL::Schema.mutation(mutation_class)
231
+
232
+ #
233
+ # orphaned_types =
234
+ # @@__types__
235
+ # .select{|k,v|
236
+ # !k.in?(@@__lookedup_types__) &&
237
+ # v < Stardust::GraphQL::Object
238
+ # }
239
+ # .values
240
+ # .map(&:to_graphql)
241
+ #
242
+ # Stardust::GraphQL::Schema.orphan_types orphaned_types
167
243
  end
168
244
  end
169
245
  end
@@ -0,0 +1,22 @@
1
+ require 'apollo-federation/federated_document_from_schema_definition.rb'
2
+
3
+ module Stardust
4
+ module GraphQL
5
+ module Federated
6
+ def self.included(klass)
7
+ klass.extend(ClassMethods)
8
+ end
9
+
10
+ module ClassMethods
11
+
12
+ def federation_sdl
13
+ # remove this hack once this https://github.com/apollographql/apollo-server/issues/3100 gets fixed
14
+ @federation_sdl ||= begin
15
+ document_from_schema = ApolloFederation::FederatedDocumentFromSchemaDefinition.new(self)
16
+ ::GraphQL::Language::Printer.new.print(document_from_schema.document).gsub("schema {\n query: Query\n mutation: MutationRoot\n}\n\n", "")
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,9 +1,13 @@
1
+ require 'apollo-federation'
2
+
1
3
  module Stardust
2
4
  module GraphQL
3
5
  class Field < ::GraphQL::Schema::Field
4
6
 
7
+ include ApolloFederation::Field
8
+
5
9
  def initialize(*args, **kwargs, &block)
6
- super(*args, **kwargs, &block)
10
+ super(*args, connection: false, **kwargs, &block)
7
11
  end
8
12
 
9
13
  def authorize(proc, &block)
@@ -0,0 +1,40 @@
1
+ module Stardust
2
+ module GraphQL
3
+ module Interface
4
+
5
+ def self.included(base)
6
+ base.module_eval do
7
+ include ::GraphQL::Schema::Interface
8
+
9
+ def self.graphql_name(name = nil)
10
+ if name
11
+ @__graphql_name__ = name
12
+ else
13
+ @__graphql_name__
14
+ end
15
+ end
16
+
17
+ def self.field(name, type, description = nil, **kwargs, &block)
18
+
19
+ @__types_to_lookup__ ||= []
20
+ @__types_to_lookup__ << ->(klass) {
21
+ actual_type = Collector.lookup_type(type)
22
+
23
+ klass
24
+ .method(:field)
25
+ .super_method
26
+ .call(name, actual_type, description, **kwargs, &block)
27
+ }
28
+ end
29
+
30
+ def self.replace_types!
31
+ return unless @__types_to_lookup__
32
+ @__types_to_lookup__.each {|lookup| lookup.(self)}
33
+ end
34
+ end
35
+ base
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -6,6 +6,10 @@ module Stardust
6
6
  context[:current_user]
7
7
  end
8
8
 
9
+ def self.get_null
10
+ @null
11
+ end
12
+
9
13
  def self.argument(name, type, description = nil, loads: nil, **kwargs)
10
14
  @__types_to_lookup__ ||= []
11
15
  the_file = caller[0][/[^:]+/].gsub(Rails.root.to_s, "")
@@ -1,11 +1,23 @@
1
1
  module Stardust
2
2
  module GraphQL
3
3
  class Object < ::GraphQL::Schema::Object
4
+ include ApolloFederation::Object
4
5
 
5
6
  field_class Field
6
7
 
7
- def self.field(name, type, description = nil, **kwargs, &block)
8
+ def self.implements(type)
9
+ @__types_to_lookup__ ||= []
10
+ @__types_to_lookup__ << ->(klass) {
11
+ actual_type = Collector.lookup_type(type)
12
+
13
+ klass
14
+ .method(:implements)
15
+ .super_method
16
+ .call(actual_type)
17
+ }
18
+ end
8
19
 
20
+ def self.field(name, type, description = nil, **kwargs, &block)
9
21
  @__types_to_lookup__ ||= []
10
22
  @__types_to_lookup__ << ->(klass) {
11
23
  actual_type = Collector.lookup_type(type)
@@ -8,6 +8,10 @@ module Stardust
8
8
  Collector.add_type( type, block, Object)
9
9
  end
10
10
 
11
+ def interface(type, &block)
12
+ Collector.add_type( type, block, Interface)
13
+ end
14
+
11
15
  def input_object(type, &block)
12
16
  Collector.add_type( type, block, InputObject )
13
17
  end
@@ -0,0 +1,16 @@
1
+ module Stardust
2
+ module GraphQL
3
+ module WardenPatch
4
+
5
+ private
6
+
7
+ # Basically since we want to see
8
+ # federated fields we want to included orphan_types
9
+ def referenced?(type_defn)
10
+ super || @schema.orphan_types.include?(type_defn)
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ ::GraphQL::Schema::Warden.prepend Stardust::GraphQL::WardenPatch
@@ -1,3 +1,3 @@
1
1
  module Stardust
2
- VERSION = '0.1.5'
2
+ VERSION = '0.2.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stardust_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bradley Wittenbrook
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-06 00:00:00.000000000 Z
11
+ date: 2019-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: 0.4.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: apollo-federation
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.4.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.4.0
97
111
  description: Modernize API development in Rails
98
112
  email:
99
113
  - bradley.wittenbrook@gmail.com
@@ -128,8 +142,10 @@ files:
128
142
  - lib/stardust/graphql/configuration.rb
129
143
  - lib/stardust/graphql/dsl.rb
130
144
  - lib/stardust/graphql/extensions/authorize.rb
145
+ - lib/stardust/graphql/federated.rb
131
146
  - lib/stardust/graphql/field.rb
132
147
  - lib/stardust/graphql/input_object.rb
148
+ - lib/stardust/graphql/interface.rb
133
149
  - lib/stardust/graphql/mutation.rb
134
150
  - lib/stardust/graphql/object.rb
135
151
  - lib/stardust/graphql/query.rb
@@ -137,10 +153,11 @@ files:
137
153
  - lib/stardust/graphql/types.rb
138
154
  - lib/stardust/graphql/types/dsl.rb
139
155
  - lib/stardust/graphql/union.rb
156
+ - lib/stardust/graphql/warden_patch.rb
140
157
  - lib/stardust/instance.rb
141
158
  - lib/stardust/version.rb
142
159
  - lib/tasks/stardust_tasks.rake
143
- homepage: https://github.com/hatch-software/stardust_rails
160
+ homepage: https://github.com/parablesoft/stardust_rails
144
161
  licenses:
145
162
  - MIT
146
163
  metadata:
@@ -161,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
178
  version: '0'
162
179
  requirements: []
163
180
  rubyforge_project:
164
- rubygems_version: 2.7.7
181
+ rubygems_version: 2.7.10
165
182
  signing_key:
166
183
  specification_version: 4
167
184
  summary: GraphQL + Rails = Programmer Bliss