graphql_rails 1.2.4 → 2.2.0

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