graphql_rails 1.2.4 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +18 -0
  3. data/.hound.yml +1 -1
  4. data/.rubocop.yml +4 -0
  5. data/.ruby-version +1 -1
  6. data/CHANGELOG.md +21 -0
  7. data/Gemfile +3 -3
  8. data/Gemfile.lock +129 -128
  9. data/docs/README.md +1 -1
  10. data/docs/components/model.md +107 -13
  11. data/docs/components/routes.md +4 -3
  12. data/docs/other_tools/schema_dump.md +8 -8
  13. data/lib/graphql_rails/attributes/attributable.rb +6 -14
  14. data/lib/graphql_rails/attributes/attribute.rb +10 -34
  15. data/lib/graphql_rails/attributes/attribute_configurable.rb +45 -0
  16. data/lib/graphql_rails/attributes/attribute_name_parser.rb +7 -7
  17. data/lib/graphql_rails/attributes/input_attribute.rb +20 -14
  18. data/lib/graphql_rails/attributes/input_type_parser.rb +5 -7
  19. data/lib/graphql_rails/attributes/type_parseable.rb +49 -19
  20. data/lib/graphql_rails/attributes/type_parser.rb +4 -9
  21. data/lib/graphql_rails/concerns/chainable_options.rb +49 -0
  22. data/lib/graphql_rails/controller/build_controller_action_resolver/controller_action_resolver.rb +3 -0
  23. data/lib/graphql_rails/controller/log_controller_action.rb +7 -2
  24. data/lib/graphql_rails/decorator/relation_decorator.rb +2 -2
  25. data/lib/graphql_rails/input_configurable.rb +11 -9
  26. data/lib/graphql_rails/model/build_graphql_input_type.rb +4 -2
  27. data/lib/graphql_rails/model/configurable.rb +30 -8
  28. data/lib/graphql_rails/model/configuration.rb +8 -12
  29. data/lib/graphql_rails/model/find_or_build_graphql_type.rb +16 -19
  30. data/lib/graphql_rails/model/find_or_build_graphql_type_class.rb +2 -1
  31. data/lib/graphql_rails/model/input.rb +10 -26
  32. data/lib/graphql_rails/query_runner.rb +9 -3
  33. data/lib/graphql_rails/router/mutation_route.rb +4 -0
  34. data/lib/graphql_rails/router/query_route.rb +4 -0
  35. data/lib/graphql_rails/router/resource_routes_builder.rb +8 -0
  36. data/lib/graphql_rails/router/route.rb +2 -2
  37. data/lib/graphql_rails/router/schema_builder.rb +12 -3
  38. data/lib/graphql_rails/router/subscription_route.rb +22 -0
  39. data/lib/graphql_rails/router.rb +8 -2
  40. data/lib/graphql_rails/tasks/dump_graphql_schema.rb +18 -27
  41. data/lib/graphql_rails/tasks/dump_graphql_schemas.rb +57 -0
  42. data/lib/graphql_rails/tasks/schema.rake +8 -5
  43. data/lib/graphql_rails/types/argument_type.rb +12 -0
  44. data/lib/graphql_rails/types/field_type.rb +14 -0
  45. data/lib/graphql_rails/types/hidable_by_group.rb +32 -0
  46. data/lib/graphql_rails/types/object_type.rb +12 -0
  47. data/lib/graphql_rails/version.rb +1 -1
  48. metadata +16 -8
  49. data/.travis.yml +0 -5
@@ -6,24 +6,24 @@ GraphqlRails includes rake task to allow creating schema snapshots easier:
6
6
  rake graphql_rails:schema:dump
7
7
  ```
8
8
 
9
- ## Dumping non default schema
9
+ ## Dumping only selected schema groups
10
10
 
11
- You can have multiple graphql schemas. Read more about this in [routes section](components/routes). In order to generate schema for one of groups, provide optional `name` argument:
11
+ You can specify which schema groups you want to dump. In order to do so, provide groups list as rake task argument and separate group names by comma:
12
12
 
13
13
  ```bash
14
- rake graphql_rails:schema:dump['your_group_name']
14
+ rake graphql_rails:schema:dump['your_group_name, your_group_name2']
15
15
  ```
16
16
 
17
- or using env variable `SCHEMA_GROUP_NAME`:
17
+ You can do this also by using ENV variable `SCHEMA_GROUP_NAME`:
18
18
 
19
19
  ```bash
20
- SCHEMA_GROUP_NAME=your_group_name rake graphql_rails:schema:dump
20
+ SCHEMA_GROUP_NAME="your_group_name, your_group_name2" rake graphql_rails:schema:dump
21
21
  ```
22
22
 
23
- ## Dumping schema in to non default path
23
+ ## Dumping schema in to non default folder
24
24
 
25
- By default schema will be dumped to `spec/fixtures/graphql_schema.graphql` path. If you want different schema path, add `GRAPHQL_SCHEMA_DUMP_PATH` env variable, like this:
25
+ By default schema will be dumped to `spec/fixtures` directory. If you want different schema path, add `GRAPHQL_SCHEMA_DUMP_DIR` env variable, like this:
26
26
 
27
27
  ```bash
28
- GRAPHQL_SCHEMA_DUMP_PATH='path/to/my/schema.graphql' rake graphql_rails:schema:dump
28
+ GRAPHQL_SCHEMA_DUMP_DIR='path/to/graphql/dumps' rake graphql_rails:schema:dump
29
29
  ```
@@ -6,14 +6,14 @@ require 'graphql_rails/attributes/attribute_name_parser'
6
6
  module GraphqlRails
7
7
  module Attributes
8
8
  # contains methods which are shared between various attribute-like classes
9
- # expects `initial_name` and `initial_type` to be defined
9
+ # expects `initial_name` and `type` to be defined
10
10
  module Attributable
11
11
  def field_name
12
12
  attribute_name_parser.field_name
13
13
  end
14
14
 
15
15
  def type_name
16
- @type_name ||= initial_type.to_s
16
+ type.to_s
17
17
  end
18
18
 
19
19
  def name
@@ -23,17 +23,9 @@ module GraphqlRails
23
23
  def required?
24
24
  return @required unless @required.nil?
25
25
 
26
- attribute_name_parser.required? || !initial_type.to_s[/!$/].nil? || initial_type.is_a?(GraphQL::Schema::NonNull)
27
- end
28
-
29
- def required
30
- @required = true
31
- self
32
- end
33
-
34
- def optional
35
- @required = false
36
- self
26
+ (type.nil? && attribute_name_parser.required?) ||
27
+ type.to_s[/!$/].present? ||
28
+ type.is_a?(GraphQL::Schema::NonNull)
37
29
  end
38
30
 
39
31
  def graphql_model
@@ -52,7 +44,7 @@ module GraphqlRails
52
44
 
53
45
  def type_parser
54
46
  @type_parser ||= begin
55
- type_for_parser = initial_type || attribute_name_parser.graphql_type
47
+ type_for_parser = type || attribute_name_parser.graphql_type
56
48
  TypeParser.new(type_for_parser, paginated: paginated?)
57
49
  end
58
50
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'graphql'
4
4
  require 'graphql_rails/attributes/attributable'
5
+ require 'graphql_rails/attributes/attribute_configurable'
5
6
  require 'graphql_rails/input_configurable'
6
7
 
7
8
  module GraphqlRails
@@ -9,47 +10,21 @@ module GraphqlRails
9
10
  # contains info about single graphql attribute
10
11
  class Attribute
11
12
  include Attributable
13
+ include AttributeConfigurable
12
14
  include InputConfigurable
13
15
 
14
16
  attr_reader :attributes
15
17
 
16
- # rubocop:disable Metrics/ParameterLists
17
- def initialize(name, type = nil, description: nil, property: name, required: nil, options: {})
18
- @initial_type = type
18
+ def initialize(name)
19
19
  @initial_name = name
20
- @options = options
21
- @description = description
22
- @property = property.to_s
23
- @required = required
20
+ @property = name.to_s
24
21
  @attributes ||= {}
25
22
  end
26
- # rubocop:enable Metrics/ParameterLists
27
23
 
28
- def type(new_type = nil)
29
- return @initial_type if new_type.nil?
24
+ def property(new_value = NOT_SET)
25
+ return @property if new_value == NOT_SET
30
26
 
31
- @initial_type = new_type
32
- self
33
- end
34
-
35
- def description(new_description = nil)
36
- return @description if new_description.nil?
37
-
38
- @description = new_description
39
- self
40
- end
41
-
42
- def property(new_property = nil)
43
- return @property if new_property.nil?
44
-
45
- @property = new_property.to_s
46
- self
47
- end
48
-
49
- def options(new_options = {})
50
- return @options if new_options.blank?
51
-
52
- @options = new_options
27
+ @property = new_value.to_s
53
28
  self
54
29
  end
55
30
 
@@ -65,7 +40,8 @@ module GraphqlRails
65
40
  {
66
41
  method: property.to_sym,
67
42
  null: optional?,
68
- camelize: camelize?
43
+ camelize: camelize?,
44
+ groups: groups
69
45
  }
70
46
  end
71
47
 
@@ -82,7 +58,7 @@ module GraphqlRails
82
58
 
83
59
  protected
84
60
 
85
- attr_reader :initial_type, :initial_name
61
+ attr_reader :initial_name
86
62
 
87
63
  private
88
64
 
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql_rails/attributes/type_parser'
4
+ require 'graphql_rails/attributes/attribute_name_parser'
5
+ require 'graphql_rails/model/build_enum_type'
6
+ require 'graphql_rails/concerns/chainable_options'
7
+ require 'active_support/concern'
8
+
9
+ module GraphqlRails
10
+ module Attributes
11
+ # Allows to set or get various attribute parameters
12
+ module AttributeConfigurable
13
+ extend ActiveSupport::Concern
14
+
15
+ included do
16
+ include GraphqlRails::ChainableOptions
17
+
18
+ chainable_option :description
19
+ chainable_option :options, default: {}
20
+ chainable_option :type
21
+ end
22
+
23
+ def groups(new_groups = ChainableOptions::NOT_SET)
24
+ @groups ||= []
25
+ return @groups if new_groups == ChainableOptions::NOT_SET
26
+
27
+ @groups = Array(new_groups).map(&:to_s)
28
+ self
29
+ end
30
+
31
+ def group(*args)
32
+ groups(*args)
33
+ end
34
+
35
+ def required(new_value = true) # rubocop:disable Style/OptionalBooleanParameter
36
+ @required = new_value
37
+ self
38
+ end
39
+
40
+ def optional(new_value = true) # rubocop:disable Style/OptionalBooleanParameter
41
+ required(!new_value)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -5,12 +5,8 @@ module GraphqlRails
5
5
  # Parses attribute name and can generates graphql scalar type,
6
6
  # grapqhl name and etc. based on that
7
7
  class AttributeNameParser
8
- attr_reader :name
9
-
10
8
  def initialize(original_name, options: {})
11
- name = original_name.to_s
12
- @required = !name['!'].nil?
13
- @name = name.tr('!', '')
9
+ @original_name = original_name.to_s
14
10
  @options = options
15
11
  end
16
12
 
@@ -36,12 +32,16 @@ module GraphqlRails
36
32
  end
37
33
 
38
34
  def required?
39
- @required
35
+ original_name['!'].present? || original_name.end_with?('?')
36
+ end
37
+
38
+ def name
39
+ @name ||= original_name.tr('!', '')
40
40
  end
41
41
 
42
42
  private
43
43
 
44
- attr_reader :options
44
+ attr_reader :options, :original_name
45
45
 
46
46
  def original_format?
47
47
  options[:input_format] == :original || options[:attribute_name_format] == :original
@@ -4,22 +4,19 @@ module GraphqlRails
4
4
  module Attributes
5
5
  # contains info about single graphql input attribute
6
6
  class InputAttribute
7
+ require 'graphql_rails/model/build_enum_type'
7
8
  require_relative './input_type_parser'
8
9
  require_relative './attribute_name_parser'
9
10
  include Attributable
11
+ include AttributeConfigurable
10
12
 
11
- attr_reader :description
13
+ chainable_option :subtype
14
+ chainable_option :enum
12
15
 
13
- # rubocop:disable Metrics/ParameterLists
14
- def initialize(name, type: nil, description: nil, subtype: nil, required: nil, options: {})
16
+ def initialize(name, config:)
17
+ @config = config
15
18
  @initial_name = name
16
- @initial_type = type
17
- @description = description
18
- @options = options
19
- @subtype = subtype
20
- @required = required
21
19
  end
22
- # rubocop:enable Metrics/ParameterLists
23
20
 
24
21
  def input_argument_args
25
22
  type = raw_input_type || input_type_parser.input_type_arg
@@ -28,7 +25,7 @@ module GraphqlRails
28
25
  end
29
26
 
30
27
  def input_argument_options
31
- { required: required?, description: description, camelize: false }
28
+ { required: required?, description: description, camelize: false, groups: groups }
32
29
  end
33
30
 
34
31
  def paginated?
@@ -37,7 +34,7 @@ module GraphqlRails
37
34
 
38
35
  private
39
36
 
40
- attr_reader :initial_name, :initial_type, :options, :subtype
37
+ attr_reader :initial_name, :config
41
38
 
42
39
  def attribute_name_parser
43
40
  @attribute_name_parser ||= AttributeNameParser.new(
@@ -51,14 +48,23 @@ module GraphqlRails
51
48
 
52
49
  def input_type_parser
53
50
  @input_type_parser ||= begin
54
- initial_parseable_type = initial_type || attribute_name_parser.graphql_type
51
+ initial_parseable_type = type || enum_type || attribute_name_parser.graphql_type
55
52
  InputTypeParser.new(initial_parseable_type, subtype: subtype)
56
53
  end
57
54
  end
58
55
 
56
+ def enum_type
57
+ return if enum.blank?
58
+
59
+ ::GraphqlRails::Model::BuildEnumType.call(
60
+ "#{config.name}_#{initial_name}_enum",
61
+ allowed_values: enum
62
+ )
63
+ end
64
+
59
65
  def raw_input_type
60
- return initial_type if initial_type.is_a?(GraphQL::InputObjectType)
61
- return initial_type.graphql_input_type if initial_type.is_a?(Model::Input)
66
+ return type if type.is_a?(GraphQL::InputObjectType)
67
+ return type.graphql_input_type if type.is_a?(Model::Input)
62
68
  end
63
69
  end
64
70
  end
@@ -15,12 +15,6 @@ module GraphqlRails
15
15
  @subtype = subtype
16
16
  end
17
17
 
18
- def graphql_type
19
- return nil if unparsed_type.nil?
20
-
21
- partly_parsed_type || parsed_type
22
- end
23
-
24
18
  def input_type_arg
25
19
  if list?
26
20
  list_type_arg
@@ -34,7 +28,11 @@ module GraphqlRails
34
28
  attr_reader :unparsed_type, :subtype
35
29
 
36
30
  def unwrapped_type
37
- raw_unwrapped_type || unwrapped_scalar_type || unwrapped_model_input_type || raise_not_supported_type_error
31
+ raw_unwrapped_type ||
32
+ unwrapped_scalar_type ||
33
+ unwrapped_model_input_type ||
34
+ graphql_type_object ||
35
+ raise_not_supported_type_error
38
36
  end
39
37
 
40
38
  def raw_unwrapped_type
@@ -16,18 +16,27 @@ module GraphqlRails
16
16
  'int' => GraphQL::Types::Int,
17
17
  'integer' => GraphQL::Types::Int,
18
18
 
19
+ 'big_int' => GraphQL::Types::BigInt,
20
+ 'bigint' => GraphQL::Types::BigInt,
21
+
22
+ 'float' => GraphQL::Types::Float,
23
+ 'double' => GraphQL::Types::Float,
24
+ 'decimal' => GraphQL::Types::Float,
25
+
26
+ 'bool' => GraphQL::Types::Boolean,
27
+ 'boolean' => GraphQL::Types::Boolean,
28
+
19
29
  'string' => GraphQL::Types::String,
20
30
  'str' => GraphQL::Types::String,
21
31
  'text' => GraphQL::Types::String,
22
- 'time' => GraphQL::Types::String,
23
- 'date' => GraphQL::Types::String,
24
32
 
25
- 'bool' => GraphQL::Types::Boolean,
26
- 'boolean' => GraphQL::Types::Boolean,
33
+ 'date' => GraphQL::Types::ISO8601Date,
27
34
 
28
- 'float' => GraphQL::Types::Float,
29
- 'double' => GraphQL::Types::Float,
30
- 'decimal' => GraphQL::Types::Float
35
+ 'time' => GraphQL::Types::ISO8601DateTime,
36
+ 'datetime' => GraphQL::Types::ISO8601DateTime,
37
+ 'date_time' => GraphQL::Types::ISO8601DateTime,
38
+
39
+ 'json' => GraphQL::Types::JSON
31
40
  }.freeze
32
41
 
33
42
  WRAPPER_TYPES = [
@@ -46,7 +55,7 @@ module GraphqlRails
46
55
  RAW_GRAPHQL_TYPES = (WRAPPER_TYPES + GRAPHQL_BASE_TYPES).freeze
47
56
 
48
57
  def unwrapped_scalar_type
49
- TYPE_MAPPING[nullable_inner_name.downcase.downcase]
58
+ TYPE_MAPPING[nullable_inner_name.downcase]
50
59
  end
51
60
 
52
61
  def raw_graphql_type?
@@ -58,25 +67,46 @@ module GraphqlRails
58
67
  end
59
68
 
60
69
  def core_scalar_type?
61
- unwrapped_scalar_type.in?(TYPE_MAPPING.values)
70
+ unwrapped_scalar_type.present?
62
71
  end
63
72
 
64
73
  def graphql_model
65
- type_class = \
66
- if unparsed_type.is_a?(Class) && unparsed_type < GraphqlRails::Model
67
- unparsed_type
68
- else
69
- nullable_inner_name.safe_constantize
70
- end
71
-
72
- return if type_class.nil?
73
- return unless type_class < GraphqlRails::Model
74
+ extract_type_class_if { |type| graphql_model?(type) }
75
+ end
74
76
 
75
- type_class
77
+ def graphql_type_object
78
+ type_object = extract_type_class_if { |type| graphql_type_object?(type) }
79
+ type_object || graphql_model&.graphql&.graphql_type
76
80
  end
77
81
 
78
82
  protected
79
83
 
84
+ def extract_type_class_if
85
+ return unparsed_type if yield(unparsed_type)
86
+
87
+ type_class = nullable_inner_name.safe_constantize
88
+ return type_class if yield(type_class)
89
+
90
+ nil
91
+ end
92
+
93
+ def graphql_model?(type_class)
94
+ type_class.is_a?(Class) && type_class < GraphqlRails::Model
95
+ end
96
+
97
+ def graphql_type_object?(type_class)
98
+ return false unless type_class.is_a?(Class)
99
+
100
+ type_class < GraphQL::Schema::Member
101
+ end
102
+
103
+ def applicable_graphql_type?(type)
104
+ return false unless type.is_a?(Class)
105
+ return true if type < GraphqlRails::Model
106
+
107
+ false
108
+ end
109
+
80
110
  def unwrap_type(type)
81
111
  unwrappable = type
82
112
  unwrappable = unwrappable.of_type while wrapped_type?(unwrappable)
@@ -51,7 +51,9 @@ module GraphqlRails
51
51
  def paginated_type_arg
52
52
  return graphql_model.graphql.connection_type if graphql_model
53
53
 
54
- raise NotSupportedFeature, 'pagination is only supported for models which include GraphqlRails::Model'
54
+ error_message = "Unable to paginate #{unparsed_type.inspect}. " \
55
+ 'Pagination is only supported for models which include GraphqlRails::Model'
56
+ raise NotSupportedFeature, error_message
55
57
  end
56
58
 
57
59
  def list_type_arg
@@ -107,14 +109,7 @@ module GraphqlRails
107
109
  end
108
110
 
109
111
  def type_by_name
110
- unwrapped_scalar_type || unwrapped_model_type || raise_not_supported_type_error
111
- end
112
-
113
- def unwrapped_model_type
114
- type_class = graphql_model
115
- return unless type_class
116
-
117
- type_class.graphql.graphql_type
112
+ unwrapped_scalar_type || graphql_type_object || raise_not_supported_type_error
118
113
  end
119
114
  end
120
115
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphqlRails
4
+ # Allows defining methods chained way
5
+ module ChainableOptions
6
+ NOT_SET = Object.new
7
+
8
+ # nodoc
9
+ module ClassMethods
10
+ def chainable_option(option_name, default: nil)
11
+ define_method(option_name) do |value = NOT_SET|
12
+ get_or_set_chainable_option(option_name, value, default: default)
13
+ end
14
+ end
15
+ end
16
+
17
+ def self.included(base)
18
+ base.extend(ClassMethods)
19
+ end
20
+
21
+ def initialize_copy(other)
22
+ super
23
+ @chainable_option = other.instance_variable_get(:@chainable_option).dup
24
+ end
25
+
26
+ def with(**options)
27
+ options.each do |method_name, args|
28
+ send_args = [method_name]
29
+ send_args << args if method(method_name).parameters.present?
30
+ public_send(*send_args)
31
+ end
32
+ self
33
+ end
34
+
35
+ private
36
+
37
+ def fetch_chainable_option(option_name, *default, &block)
38
+ @chainable_option.fetch(option_name.to_sym, *default, &block)
39
+ end
40
+
41
+ def get_or_set_chainable_option(option_name, value = NOT_SET, default: nil)
42
+ @chainable_option ||= {}
43
+ return fetch_chainable_option(option_name, default) if value == NOT_SET
44
+
45
+ @chainable_option[option_name.to_sym] = value
46
+ self
47
+ end
48
+ end
49
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'graphql_rails/controller/request'
4
+ require 'graphql_rails/types/argument_type'
4
5
 
5
6
  module GraphqlRails
6
7
  class Controller
@@ -8,6 +9,8 @@ module GraphqlRails
8
9
  # Resolver which includes controller specific methods.
9
10
  # Used to simplify resolver build for each controller action
10
11
  class ControllerActionResolver < GraphQL::Schema::Resolver
12
+ argument_class(GraphqlRails::Types::ArgumentType)
13
+
11
14
  def self.controller(controller_class = nil)
12
15
  @controller = controller_class if controller_class
13
16
  @controller
@@ -62,9 +62,14 @@ module GraphqlRails
62
62
  end
63
63
 
64
64
  def parameter_filter_class
65
- return ActiveSupport::ParameterFilter if Object.const_defined?('ActiveSupport::ParameterFilter')
65
+ if ActiveSupport.gem_version.segments.first < 6
66
+ return ActiveSupport::ParameterFilter if Object.const_defined?('ActiveSupport::ParameterFilter')
66
67
 
67
- ActionDispatch::Http::ParameterFilter
68
+ ActionDispatch::Http::ParameterFilter
69
+ else
70
+ require 'active_support/parameter_filter'
71
+ ActiveSupport::ParameterFilter
72
+ end
68
73
  end
69
74
  end
70
75
  end
@@ -5,7 +5,7 @@ module GraphqlRails
5
5
  # wrapps active record relation and returns decorated object instead
6
6
  class RelationDecorator
7
7
  delegate :map, :each, to: :to_a
8
- delegate :limit_value, :offset_value, :count, :size, to: :relation
8
+ delegate :limit_value, :offset_value, :count, :size, :empty?, to: :relation
9
9
 
10
10
  def self.decorates?(object)
11
11
  (defined?(ActiveRecord) && object.is_a?(ActiveRecord::Relation)) ||
@@ -24,7 +24,7 @@ module GraphqlRails
24
24
  end
25
25
  end
26
26
 
27
- %i[first second last].each do |method_name|
27
+ %i[first second last find find_by].each do |method_name|
28
28
  define_method method_name do |*args, &block|
29
29
  decoratable_object_method(method_name, *args, &block)
30
30
  end
@@ -3,9 +3,14 @@
3
3
  module GraphqlRails
4
4
  # contains configuration options related with inputs
5
5
  module InputConfigurable
6
- def permit(*no_type_attributes, **typed_attributes)
7
- no_type_attributes.each { |attribute| permit_input(attribute) }
8
- typed_attributes.each { |attribute, type| permit_input(attribute, type: type) }
6
+ def permit(*args)
7
+ args.each do |arg|
8
+ if arg.is_a? Hash
9
+ arg.each { |attribute, type| permit_input(attribute, type: type) }
10
+ else
11
+ permit_input(arg)
12
+ end
13
+ end
9
14
  self
10
15
  end
11
16
 
@@ -21,7 +26,7 @@ module GraphqlRails
21
26
  pagination_options = nil if pagination_options == false
22
27
 
23
28
  @pagination_options = pagination_options
24
- permit(:before, :after, first: :int, last: :int)
29
+ self
25
30
  end
26
31
 
27
32
  def paginated?
@@ -37,11 +42,8 @@ module GraphqlRails
37
42
  end
38
43
 
39
44
  def build_input_attribute(name, options: {}, **other_options)
40
- Attributes::InputAttribute.new(
41
- name.to_s,
42
- options: input_attribute_options.merge(options),
43
- **other_options
44
- )
45
+ input_options = input_attribute_options.merge(options)
46
+ Attributes::InputAttribute.new(name.to_s, config: self).with(options: input_options, **other_options)
45
47
  end
46
48
  end
47
49
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'graphql_rails/types/argument_type'
4
+ require 'graphql_rails/concerns/service'
5
+
3
6
  module GraphqlRails
4
7
  module Model
5
8
  # stores information about model specific config, like attributes and types
6
9
  class BuildGraphqlInputType
7
- require 'graphql_rails/concerns/service'
8
-
9
10
  include ::GraphqlRails::Service
10
11
 
11
12
  def initialize(name:, description: nil, attributes:)
@@ -20,6 +21,7 @@ module GraphqlRails
20
21
  type_attributes = attributes
21
22
 
22
23
  Class.new(GraphQL::Schema::InputObject) do
24
+ argument_class(GraphqlRails::Types::ArgumentType)
23
25
  graphql_name(type_name)
24
26
  description(type_description)
25
27