stardust_rails 0.1.5 → 0.2.1

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
  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