graphql_rails 1.2.3 → 2.1.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 (42) 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 +19 -0
  7. data/Gemfile +3 -3
  8. data/Gemfile.lock +27 -25
  9. data/docs/README.md +1 -1
  10. data/docs/components/model.md +107 -13
  11. data/docs/other_tools/schema_dump.md +8 -8
  12. data/lib/graphql_rails/attributes/attributable.rb +6 -14
  13. data/lib/graphql_rails/attributes/attribute.rb +10 -34
  14. data/lib/graphql_rails/attributes/attribute_configurable.rb +45 -0
  15. data/lib/graphql_rails/attributes/attribute_name_parser.rb +7 -7
  16. data/lib/graphql_rails/attributes/input_attribute.rb +20 -14
  17. data/lib/graphql_rails/attributes/input_type_parser.rb +5 -7
  18. data/lib/graphql_rails/attributes/type_parseable.rb +55 -19
  19. data/lib/graphql_rails/attributes/type_parser.rb +4 -9
  20. data/lib/graphql_rails/concerns/chainable_options.rb +49 -0
  21. data/lib/graphql_rails/controller/build_controller_action_resolver/controller_action_resolver.rb +3 -0
  22. data/lib/graphql_rails/decorator/relation_decorator.rb +2 -2
  23. data/lib/graphql_rails/input_configurable.rb +10 -8
  24. data/lib/graphql_rails/model/build_graphql_input_type.rb +4 -2
  25. data/lib/graphql_rails/model/configurable.rb +30 -8
  26. data/lib/graphql_rails/model/configuration.rb +26 -12
  27. data/lib/graphql_rails/model/find_or_build_graphql_type.rb +23 -21
  28. data/lib/graphql_rails/model/find_or_build_graphql_type_class.rb +2 -1
  29. data/lib/graphql_rails/model/input.rb +10 -26
  30. data/lib/graphql_rails/model.rb +1 -1
  31. data/lib/graphql_rails/query_runner.rb +9 -3
  32. data/lib/graphql_rails/router/route.rb +2 -2
  33. data/lib/graphql_rails/tasks/dump_graphql_schema.rb +18 -27
  34. data/lib/graphql_rails/tasks/dump_graphql_schemas.rb +57 -0
  35. data/lib/graphql_rails/tasks/schema.rake +8 -5
  36. data/lib/graphql_rails/types/argument_type.rb +12 -0
  37. data/lib/graphql_rails/types/field_type.rb +14 -0
  38. data/lib/graphql_rails/types/hidable_by_group.rb +32 -0
  39. data/lib/graphql_rails/types/object_type.rb +12 -0
  40. data/lib/graphql_rails/version.rb +1 -1
  41. metadata +15 -8
  42. data/.travis.yml +0 -5
@@ -8,12 +8,13 @@ module GraphqlRails
8
8
 
9
9
  include ::GraphqlRails::Service
10
10
 
11
- def initialize(group: nil, params:, schema: nil, router: nil, **schema_options)
11
+ def initialize(params:, context: {}, schema: nil, router: nil, group: nil, **schema_options) # rubocop:disable Metrics/ParameterLists
12
12
  @group = group
13
13
  @graphql_schema = schema
14
14
  @params = params
15
- @schema_options = schema_options
16
15
  @router = router
16
+ @initial_context = context
17
+ @schema_options = schema_options
17
18
  end
18
19
 
19
20
  def call
@@ -21,13 +22,18 @@ module GraphqlRails
21
22
  params[:query],
22
23
  variables: variables,
23
24
  operation_name: params[:operationName],
25
+ context: context,
24
26
  **schema_options
25
27
  )
26
28
  end
27
29
 
28
30
  private
29
31
 
30
- attr_reader :schema_options, :params, :group
32
+ attr_reader :schema_options, :params, :group, :initial_context
33
+
34
+ def context
35
+ initial_context.merge(graphql_group: group)
36
+ end
31
37
 
32
38
  def variables
33
39
  ensure_hash(params[:variables])
@@ -6,7 +6,7 @@ module GraphqlRails
6
6
  class Router
7
7
  # Generic class for any type graphql action. Should not be used directly
8
8
  class Route
9
- attr_reader :name, :module_name, :on, :relative_path
9
+ attr_reader :name, :module_name, :on, :relative_path, :groups
10
10
 
11
11
  def initialize(name, to: '', on:, groups: nil, **options)
12
12
  @name = name.to_s.camelize(:lower)
@@ -43,7 +43,7 @@ module GraphqlRails
43
43
 
44
44
  private
45
45
 
46
- attr_reader :function, :groups
46
+ attr_reader :function
47
47
 
48
48
  def resolver
49
49
  @resolver ||= Controller::BuildControllerActionResolver.call(route: self)
@@ -7,51 +7,42 @@ module GraphqlRails
7
7
 
8
8
  class MissingGraphqlRouterError < GraphqlRails::Error; end
9
9
 
10
- attr_reader :name
11
-
12
- def self.call(*args)
13
- new(*args).call
10
+ def self.call(**args)
11
+ new(**args).call
14
12
  end
15
13
 
16
- def initialize(name:)
17
- @name = name
14
+ def initialize(group:, router:, dump_dir: nil)
15
+ @group = group
16
+ @router = router
17
+ @dump_dir = dump_dir
18
18
  end
19
19
 
20
20
  def call
21
- validate
22
- File.write(schema_path, schema.to_definition)
21
+ File.write(schema_path, schema_dump)
23
22
  end
24
23
 
25
24
  private
26
25
 
27
- def validate
28
- return if router
29
-
30
- error_message = \
31
- 'GraphqlRouter is missing. ' \
32
- 'Run `rails g graphql_rails:install` to build it'
33
- raise MissingGraphqlRouterError, error_message
34
- end
26
+ attr_reader :router, :group
35
27
 
36
- def router
37
- @router ||= '::GraphqlRouter'.safe_constantize
28
+ def schema_dump
29
+ context = { graphql_group: group }
30
+ schema.to_definition(context: context)
38
31
  end
39
32
 
40
33
  def schema
41
- @schema ||= ::GraphqlRouter.graphql_schema(name.presence)
34
+ @schema ||= router.graphql_schema(group.presence)
42
35
  end
43
36
 
44
37
  def schema_path
45
- ENV['GRAPHQL_SCHEMA_DUMP_PATH'] || default_schema_path
46
- end
47
-
48
- def default_schema_path
49
- schema_folder_path = Rails.root.join('spec', 'fixtures')
38
+ FileUtils.mkdir_p(dump_dir)
39
+ file_name = group.present? ? "graphql_#{group}_schema.graphql" : 'graphql_schema.graphql'
50
40
 
51
- FileUtils.mkdir_p(schema_folder_path)
52
- file_name = name.present? ? "graphql_#{name}_schema.graphql" : 'graphql_schema.graphql'
41
+ "#{dump_dir}/#{file_name}"
42
+ end
53
43
 
54
- schema_folder_path.join(file_name)
44
+ def dump_dir
45
+ @dump_dir ||= Rails.root.join('spec/fixtures').to_s
55
46
  end
56
47
  end
57
48
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql_rails/tasks/dump_graphql_schema'
4
+
5
+ module GraphqlRails
6
+ # Generates graphql schema dump files
7
+ class DumpGraphqlSchemas
8
+ require 'graphql_rails/errors/error'
9
+
10
+ class MissingGraphqlRouterError < GraphqlRails::Error; end
11
+
12
+ def self.call(**args)
13
+ new(**args).call
14
+ end
15
+
16
+ def initialize(dump_dir:, groups: nil)
17
+ @groups = groups.presence
18
+ @dump_dir = dump_dir
19
+ end
20
+
21
+ def call
22
+ validate
23
+ return dump_default_schema if groups.empty?
24
+
25
+ groups.each { |group| dump_graphql_schema(group) }
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :dump_dir
31
+
32
+ def dump_default_schema
33
+ dump_graphql_schema('')
34
+ end
35
+
36
+ def dump_graphql_schema(group)
37
+ DumpGraphqlSchema.call(group: group, router: router, dump_dir: dump_dir)
38
+ end
39
+
40
+ def validate
41
+ return if router
42
+
43
+ error_message = \
44
+ 'GraphqlRouter is missing. ' \
45
+ 'Run `rails g graphql_rails:install` to build it'
46
+ raise MissingGraphqlRouterError, error_message
47
+ end
48
+
49
+ def router
50
+ @router ||= '::GraphqlRouter'.safe_constantize
51
+ end
52
+
53
+ def groups
54
+ @groups ||= router.routes.flat_map(&:groups).uniq
55
+ end
56
+ end
57
+ end
@@ -1,14 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'graphql_rails/tasks/dump_graphql_schema'
3
+ require 'graphql_rails/tasks/dump_graphql_schemas'
4
4
 
5
5
  namespace :graphql_rails do
6
6
  namespace :schema do
7
7
  desc 'Dump GraphQL schema'
8
- task(:dump, %i[name] => :environment) do |_, args|
9
- default_name = ENV.fetch('SCHEMA_GROUP_NAME', '')
10
- args.with_defaults(name: default_name)
11
- GraphqlRails::DumpGraphqlSchema.call(name: args.name)
8
+ task(dump: :environment) do |_, args|
9
+ groups_from_args = args.extras
10
+ groups_from_env = ENV['SCHEMA_GROUP_NAME'].to_s.split(',').map(&:strip)
11
+ groups = groups_from_args + groups_from_env
12
+ dump_dir = ENV.fetch('GRAPHQL_SCHEMA_DUMP_DIR') { Rails.root.join('spec/fixtures').to_s }
13
+
14
+ GraphqlRails::DumpGraphqlSchemas.call(groups: groups, dump_dir: dump_dir)
12
15
  end
13
16
  end
14
17
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql_rails/types/hidable_by_group'
4
+
5
+ module GraphqlRails
6
+ module Types
7
+ # Base argument type for all GraphqlRails inputs
8
+ class ArgumentType < GraphQL::Schema::Argument
9
+ include GraphqlRails::Types::HidableByGroup
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql_rails/types/argument_type'
4
+ require 'graphql_rails/types/hidable_by_group'
5
+
6
+ module GraphqlRails
7
+ module Types
8
+ # Base field for all GraphqlRails model fields
9
+ class FieldType < GraphQL::Schema::Field
10
+ include GraphqlRails::Types::HidableByGroup
11
+ argument_class(GraphqlRails::Types::ArgumentType)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql_rails/types/argument_type'
4
+
5
+ module GraphqlRails
6
+ module Types
7
+ # Add visibility option based on groups
8
+ module HidableByGroup
9
+ def initialize(*args, groups: [], **kwargs, &block)
10
+ super(*args, **kwargs, &block)
11
+
12
+ @groups = groups.map(&:to_s)
13
+ end
14
+
15
+ def visible?(context)
16
+ super && visible_in_context_group?(context)
17
+ end
18
+
19
+ private
20
+
21
+ def groups
22
+ @groups
23
+ end
24
+
25
+ def visible_in_context_group?(context)
26
+ group = context[:graphql_group] || context['graphql_group']
27
+
28
+ group.nil? || groups.empty? || groups.include?(group.to_s)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql_rails/types/field_type'
4
+
5
+ module GraphqlRails
6
+ module Types
7
+ # Base graphql type class for all GraphqlRails models
8
+ class ObjectType < GraphQL::Schema::Object
9
+ field_class(GraphqlRails::Types::FieldType)
10
+ end
11
+ end
12
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GraphqlRails
4
- VERSION = '1.2.3'
4
+ VERSION = '2.1.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Povilas Jurčys
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-12 00:00:00.000000000 Z
11
+ date: 2022-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -128,19 +128,19 @@ dependencies:
128
128
  - - "~>"
129
129
  - !ruby/object:Gem::Version
130
130
  version: '6'
131
- description:
131
+ description:
132
132
  email:
133
133
  - po.jurcys@gmail.com
134
134
  executables: []
135
135
  extensions: []
136
136
  extra_rdoc_files: []
137
137
  files:
138
+ - ".github/workflows/ruby.yml"
138
139
  - ".gitignore"
139
140
  - ".hound.yml"
140
141
  - ".rspec"
141
142
  - ".rubocop.yml"
142
143
  - ".ruby-version"
143
- - ".travis.yml"
144
144
  - CHANGELOG.md
145
145
  - CODE_OF_CONDUCT.md
146
146
  - Gemfile
@@ -174,12 +174,14 @@ files:
174
174
  - lib/graphql_rails/attributes.rb
175
175
  - lib/graphql_rails/attributes/attributable.rb
176
176
  - lib/graphql_rails/attributes/attribute.rb
177
+ - lib/graphql_rails/attributes/attribute_configurable.rb
177
178
  - lib/graphql_rails/attributes/attribute_name_parser.rb
178
179
  - lib/graphql_rails/attributes/input_attribute.rb
179
180
  - lib/graphql_rails/attributes/input_type_parser.rb
180
181
  - lib/graphql_rails/attributes/type_name_info.rb
181
182
  - lib/graphql_rails/attributes/type_parseable.rb
182
183
  - lib/graphql_rails/attributes/type_parser.rb
184
+ - lib/graphql_rails/concerns/chainable_options.rb
183
185
  - lib/graphql_rails/concerns/service.rb
184
186
  - lib/graphql_rails/controller.rb
185
187
  - lib/graphql_rails/controller/action.rb
@@ -226,13 +228,18 @@ files:
226
228
  - lib/graphql_rails/router/schema_builder.rb
227
229
  - lib/graphql_rails/rspec_controller_helpers.rb
228
230
  - lib/graphql_rails/tasks/dump_graphql_schema.rb
231
+ - lib/graphql_rails/tasks/dump_graphql_schemas.rb
229
232
  - lib/graphql_rails/tasks/schema.rake
233
+ - lib/graphql_rails/types/argument_type.rb
234
+ - lib/graphql_rails/types/field_type.rb
235
+ - lib/graphql_rails/types/hidable_by_group.rb
236
+ - lib/graphql_rails/types/object_type.rb
230
237
  - lib/graphql_rails/version.rb
231
238
  homepage: https://github.com/samesystem/graphql_rails
232
239
  licenses:
233
240
  - MIT
234
241
  metadata: {}
235
- post_install_message:
242
+ post_install_message:
236
243
  rdoc_options: []
237
244
  require_paths:
238
245
  - lib
@@ -247,8 +254,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
254
  - !ruby/object:Gem::Version
248
255
  version: '0'
249
256
  requirements: []
250
- rubygems_version: 3.1.2
251
- signing_key:
257
+ rubygems_version: 3.2.15
258
+ signing_key:
252
259
  specification_version: 4
253
260
  summary: Rails style structure for GraphQL API.
254
261
  test_files: []
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.7.1
5
- before_install: gem install bundler -v 2.1.4