graphiti_gql 0.2.18 → 0.2.21

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: 90e832970f0f3329260d83e026c58493b76711ed1fbb7eee3914978014cd4684
4
- data.tar.gz: 993170a348f371cebc8bb101c21b48ca26f6df2ef82c9422061081a6da878880
3
+ metadata.gz: 933f1a2f88f12ad842f261023b05c8f5cc764ffbe61e7c6686ad88e2d013f8c8
4
+ data.tar.gz: 89f3c1c9fd1dcaa5160e1b0f9df9e81c0ff869a55d2842db365a1dfd14c942fe
5
5
  SHA512:
6
- metadata.gz: a84908687fd25d4324b6e9d1bc9bc9ef83a3388ca49ad33c829c71828e98992b3fd04476df6d1927ea3d6f17c87b5de89bbb6aa24f60d351f101c7f69b12ec53
7
- data.tar.gz: ad12bf08064111c18ee81b2b4006195c38311846f81310bb158126b0b89c257dabce3b60c32fe7114bace33dca19475e2af0b9d9d5976749cd1eafdcf2bf3e37
6
+ metadata.gz: 2de7c71483561731e957887da213322caf2c10b9d6836660b15ecd6572c743dffc1f34de139d15ff05dae13392b28186e35b01a2ee409cbe5c22f86c4a75066e
7
+ data.tar.gz: 973e35034e8c7a2b01eb5301f8db86df99a1631adfadf35e6e608f95fa31aec08d89da68df8833edc460af5525a8c3e240ff70d3576fc5180ef98614e87f58d3
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- graphiti_gql (0.2.15)
4
+ graphiti_gql (0.2.18)
5
5
  graphiti (~> 1.3.9)
6
6
  graphql (~> 2.0)
7
7
  graphql-batch (~> 0.5)
@@ -74,6 +74,7 @@ module GraphitiGql
74
74
 
75
75
  def node(id = nil)
76
76
  if @resource.singular
77
+ data # fire query
77
78
  Node.new(underscore(data[data.keys.first]), @resource)
78
79
  else
79
80
  nodes.find { |n| n.id == id.to_s }
@@ -269,7 +269,7 @@ module GraphitiGql
269
269
  module ActiveRecordAdapterExtras
270
270
  extend ActiveSupport::Concern
271
271
 
272
- included do
272
+ prepended do
273
273
  alias_method :filter_precise_datetime_lt, :filter_lt
274
274
  alias_method :filter_precise_datetime_lte, :filter_lte
275
275
  alias_method :filter_precise_datetime_gt, :filter_gt
@@ -277,16 +277,59 @@ module GraphitiGql
277
277
  alias_method :filter_precise_datetime_eq, :filter_eq
278
278
  alias_method :filter_precise_datetime_not_eq, :filter_not_eq
279
279
  end
280
+
281
+ # TODO: integration specs mysql vs postgres for case sensitivity
282
+ def mysql?(scope)
283
+ mysql = ActiveRecord::ConnectionAdapters::Mysql2Adapter
284
+ scope.model.connection.is_a?(mysql)
285
+ end
286
+
287
+ def filter_string_eq(scope, attribute, value, is_not: false)
288
+ if mysql?(scope)
289
+ clause = { attribute => value }
290
+ is_not ? scope.where.not(clause) : scope.where(clause)
291
+ else
292
+ # og behavior
293
+ column = column_for(scope, attribute)
294
+ clause = column.lower.eq_any(value.map(&:downcase))
295
+ end
296
+ end
297
+
298
+ def filter_string_eql(scope, attribute, value, is_not: false)
299
+ if mysql?(scope)
300
+ value = "BINARY #{value}"
301
+ end
302
+ # og behavior
303
+ clause = {attribute => value}
304
+ is_not ? scope.where.not(clause) : scope.where(clause)
305
+ end
306
+
307
+ def sanitized_like_for(scope, attribute, value, &block)
308
+ escape_char = "\\"
309
+ column = column_for(scope, attribute)
310
+ map = value.map { |v|
311
+ v = v.downcase unless mysql?(scope)
312
+ v = Sanitizer.sanitize_like(v, escape_char)
313
+ block.call v
314
+ }
315
+ arel = column
316
+ arel = arel.lower unless mysql?(scope)
317
+ arel.matches_any(map, escape_char, true)
318
+ end
280
319
  end
281
320
  if defined?(Graphiti::Adapters::ActiveRecord)
282
- Graphiti::Adapters::ActiveRecord.send(:include, ActiveRecordAdapterExtras)
321
+ Graphiti::Adapters::ActiveRecord.send(:prepend, ActiveRecordAdapterExtras)
283
322
  end
284
323
 
285
324
  Graphiti::Adapters::Abstract.class_eval do
286
325
  class << self
287
326
  alias :old_default_operators :default_operators
288
327
  def default_operators
289
- old_default_operators.merge(precise_datetime: numerical_operators)
328
+ old_default_operators.merge({
329
+ precise_datetime: numerical_operators,
330
+ string_enum: [:eq, :not_eq],
331
+ integer_enum: [:eq, :not_eq],
332
+ })
290
333
  end
291
334
  end
292
335
  end
@@ -3,7 +3,8 @@ module GraphitiGql
3
3
  module Fields
4
4
  class Attribute
5
5
  # If sideload is present, we're applying m2m metadata to an edge
6
- def initialize(name, config, sideload = nil)
6
+ def initialize(resource, name, config, sideload = nil)
7
+ @resource = resource
7
8
  @config = config
8
9
  @name = name
9
10
  @alias = config[:alias]
@@ -57,14 +58,34 @@ module GraphitiGql
57
58
  private
58
59
 
59
60
  def field_type
60
- field_type = Graphiti::Types[@config[:type]][:graphql_type]
61
- if !field_type
62
- canonical_graphiti_type = Graphiti::Types.name_for(@config[:type])
63
- field_type = GQL_TYPE_MAP[canonical_graphiti_type.to_sym]
64
- field_type = String if @name == :id
61
+ if [:integer_enum, :string_enum].any? { |t| @config[:type] == t }
62
+ return find_or_create_enum_type
63
+ else
64
+ field_type = Graphiti::Types[@config[:type]][:graphql_type]
65
+ if !field_type
66
+ canonical_graphiti_type = Graphiti::Types.name_for(@config[:type])
67
+ field_type = GQL_TYPE_MAP[canonical_graphiti_type.to_sym]
68
+ field_type = String if @name == :id
69
+ end
70
+ field_type = [field_type] if @config[:type].to_s.starts_with?("array_of")
71
+ field_type
72
+ end
73
+ end
74
+
75
+ def find_or_create_enum_type
76
+ resource_type_name = Schema.registry.key_for(@resource, interface: false)
77
+ enum_type_name = "#{resource_type_name}_#{@name}"
78
+ if (registered = Schema.registry[enum_type_name])
79
+ registered[:type]
80
+ else
81
+ klass = Class.new(GraphQL::Schema::Enum)
82
+ klass.graphql_name(enum_type_name)
83
+ @config[:allow].each do |allowed|
84
+ klass.value(allowed)
85
+ end
86
+ Schema.registry[enum_type_name] = { type: klass }
87
+ klass
65
88
  end
66
- field_type = [field_type] if @config[:type].to_s.starts_with?("array_of")
67
- field_type
68
89
  end
69
90
  end
70
91
  end
@@ -64,7 +64,7 @@ module GraphitiGql
64
64
  edge_resource = @sideload.class.edge_resource
65
65
  edge_resource.attributes.each_pair do |name, config|
66
66
  next if name == :id
67
- Schema::Fields::Attribute.new(name, config, @sideload).apply(edge_type_class)
67
+ Schema::Fields::Attribute.new(edge_resource, name, config, @sideload).apply(edge_type_class)
68
68
  end
69
69
  registered_parent = Schema.registry.get(@sideload.parent_resource.class)
70
70
  parent_name = registered_parent[:type].graphql_name
@@ -90,7 +90,7 @@ module GraphitiGql
90
90
  def add_fields(type, resource)
91
91
  resource.attributes.each_pair do |name, config|
92
92
  if config[:readable]
93
- Fields::Attribute.new(name, config).apply(type)
93
+ Fields::Attribute.new(@resource, name, config).apply(type)
94
94
  end
95
95
  end
96
96
  end
@@ -1,3 +1,3 @@
1
1
  module GraphitiGql
2
- VERSION = "0.2.18"
2
+ VERSION = "0.2.21"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphiti_gql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.18
4
+ version: 0.2.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lee Richmond
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-01 00:00:00.000000000 Z
11
+ date: 2022-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -124,7 +124,6 @@ files:
124
124
  - LICENSE.txt
125
125
  - README.md
126
126
  - Rakefile
127
- - app/controllers/graphiti_gql/execution_controller.rb
128
127
  - bin/bundle
129
128
  - bin/byebug
130
129
  - bin/coderay
@@ -136,7 +135,6 @@ files:
136
135
  - bin/rake
137
136
  - bin/rspec
138
137
  - bin/setup
139
- - config/routes.rb
140
138
  - graphiti_gql.gemspec
141
139
  - lib/graphiti_gql.rb
142
140
  - lib/graphiti_gql/active_resource.rb
@@ -1,18 +0,0 @@
1
- module GraphitiGql
2
- class ExecutionController < GraphitiGql.config.application_controller
3
- def execute
4
- params = request.params # avoid strong_parameters
5
- variables = params[:variables] || {}
6
- result = GraphitiGql.run params[:query],
7
- params[:variables],
8
- graphql_context
9
- render json: result
10
- end
11
-
12
- private
13
-
14
- def default_context
15
- defined?(:current_user)
16
- end
17
- end
18
- end
data/config/routes.rb DELETED
@@ -1,6 +0,0 @@
1
- GraphitiGql::Engine.routes.draw do
2
- # Default json so our error handler takes effect
3
- scope defaults: {format: :json} do
4
- post "/" => "execution#execute"
5
- end
6
- end