graphqr 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c0fb5f222bd481b018d41ea5033bfa5402c5bbec
4
+ data.tar.gz: 4ba76746f0322bba9067fef162459c54dfa5340e
5
+ SHA512:
6
+ metadata.gz: 518e94ce07c32774355fb55d1ca6a3b42c685685e942e6ca657eea13dec850c5c763f19c213cf75b4a976f97667fbdc0099c1406bd08ff880f3acc1616d77a30
7
+ data.tar.gz: 3693a00b845f41176bc1606461f72dbc09236fec9361759b6f5092b08a2ac2eec0af5cb818192b52f6c37b66969b34f6d78189d11e1c1b6522c36c8d22219b49
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 Manuel Puyol
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,43 @@
1
+ # GraphQR
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/graphqr`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'graphqr'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install graphqr
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/QultureRocks/graphqr. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
40
+
41
+ ## Code of Conduct
42
+
43
+ Everyone interacting in the GraphQR project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/QultureRocks/graphqr/blob/master/CODE_OF_CONDUCT.md).
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ ##
5
+ # The ApplyScopes module defines a way of applying model scopes in the GraphQL universe
6
+ # it is based on the [has_scope](https://github.com/plataformatec/has_scope/) gem, but simplified for more basic usage
7
+ module ApplyScopes
8
+ ##
9
+ # This method is a parallel to the one offerend by the `has_scope` gem.
10
+ # A big difference in this case is the necessity of the second parameter (normally it only takes one).
11
+ #
12
+ # ### Params:
13
+ #
14
+ # +target+: the ActiveRecordRelation that will be filtered using scopes
15
+ #
16
+ # +scopes+: a hash of scopes and their values, those only accept Array, String, Integer or Boolean types.
17
+ # **Hash scopes are not yet supported**
18
+ #
19
+ # ### Example:
20
+ #
21
+ # ```
22
+ # apply_scopes(User, { with_id: [1,2,3], order_by_name: true} )
23
+ # ```
24
+ def apply_scopes(target, scopes)
25
+ parsed_scopes = parse_scopes(scopes.to_h)
26
+
27
+ parsed_scopes.each do |scope, value|
28
+ target = call_scope(target, scope, value)
29
+ end
30
+
31
+ target
32
+ end
33
+
34
+ private
35
+
36
+ ##
37
+ # Parses the scope hash, removing scopes with a `nil` or `false` value
38
+ def parse_scopes(scopes)
39
+ scopes.inject({}) do |acc, option|
40
+ option.last.present? ? acc.merge(option.first => option.last) : acc
41
+ end
42
+ end
43
+
44
+ ##
45
+ # Calls the scope with the correct parametes (none if its a boolean type)
46
+ def call_scope(target, scope, value)
47
+ if boolean?(value)
48
+ target.send(scope)
49
+ else
50
+ target.send(scope, value)
51
+ end
52
+ end
53
+
54
+ ##
55
+ # Checks whether the value is a Boolean checking its class
56
+ def boolean?(value)
57
+ value.class == TrueClass || value.class == FalseClass
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ ##
5
+ # TODO: add documentation
6
+ module Authorized
7
+ def authorized?(object, context)
8
+ policy_provider = context[:policy_provider]
9
+
10
+ super && policy_provider.allowed?(action: :show?, record: object)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ ##
5
+ # The Base module defines some helper methods that can be used once it is included
6
+ # it also includes the basic ApplyScopes library
7
+ module Base
8
+ include GraphQR::ApplyScopes
9
+
10
+ DEFAULT_AUTHORIZATION_ERROR = 'You are not authorized to perform this action'
11
+
12
+ ##
13
+ # This method is a wrapper around the Pundit authorize, receiving the same arguments.
14
+ # The only difference is that it turns the Pundit::NotAuthorizedError into a GraphQL::ExecutionError
15
+ #
16
+ # ### Example:
17
+ #
18
+ # ```
19
+ # authorize_graphql User, :index?
20
+ # ```
21
+ def authorize_graphql(record, action, policy_class: nil)
22
+ args = { record: record, action: action, policy_class: policy_class }
23
+ raise GraphQL::ExecutionError, DEFAULT_AUTHORIZATION_ERROR unless policy_provider.allowed?(args)
24
+ end
25
+
26
+ ##
27
+ # This is a helper method to get the policy provider from the context
28
+ def policy_provider
29
+ context[:policy_provider]
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ ##
5
+ # This module represents all the extensions we made to the basic GraphQL::Schema::Field class
6
+ # it contains helpers and integrations we need to keep our workflow as simple as possible.
7
+ module Fields
8
+ ##
9
+ # The BaseField class rewrites the field initialization, adding some options that could be helpful:
10
+ #
11
+ # ## paginate
12
+ # This option defines if the field should use the PaginationExtension
13
+ #
14
+ # ### Example:
15
+ # ```
16
+ # field :users, [UserType], paginate: true
17
+ # ```
18
+ class BaseField < GraphQL::Schema::Field
19
+ def initialize(*args, paginate: false, **kwargs, &block)
20
+ super(*args, **kwargs, &block)
21
+ extension(Pagination::PaginationExtension) if paginate
22
+ extension(PermittedFieldsExtension, null: kwargs[:null])
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ module Pagination
5
+ ##
6
+ # TODO: add documentation
7
+ class PaginationExtension < GraphQL::Schema::FieldExtension
8
+ def apply
9
+ field.argument :per, 'Int', required: false, default_value: 25,
10
+ description: 'The requested number of nodes for the page'
11
+ field.argument :page, 'Int', required: false, default_value: 1,
12
+ description: 'The requested page number'
13
+ end
14
+
15
+ # Remove pagination args before passing it to a user method
16
+ def resolve(object:, arguments:, **_kwargs)
17
+ next_args = arguments.dup
18
+ next_args.delete(:per)
19
+ next_args.delete(:page)
20
+ yield(object, next_args)
21
+ end
22
+
23
+ def after_resolve(value:, arguments:, **_kwargs)
24
+ PaginationResolver.new(value, items: arguments[:per], page: arguments[:page])
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ module Pagination
5
+ ##
6
+ # TODO: add documentation
7
+ class PaginationResolver
8
+ include Pagy::Backend
9
+
10
+ def initialize(records, arguments)
11
+ @records = records
12
+ @arguments = arguments
13
+
14
+ @pagy, paginated_records = pagy(records, arguments)
15
+ @paginated_records = paginated_records.to_a
16
+ end
17
+
18
+ def cursor_from_node(item)
19
+ item.to_global_id.to_s
20
+ end
21
+
22
+ def edge_nodes
23
+ @paginated_records
24
+ end
25
+
26
+ def nodes
27
+ @paginated_records
28
+ end
29
+
30
+ def edges
31
+ @paginated_records
32
+ end
33
+
34
+ def page_info
35
+ @pagy
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ module Pagination
5
+ module Types
6
+ ##
7
+ # TODO: add documentation
8
+ class PaginationPageInfoType < GraphQL::Schema::Object
9
+ description 'Information about pagination in a connection.'
10
+
11
+ field :total_count, Int, null: false,
12
+ method: :count,
13
+ description: 'The collection count'
14
+ field :page, Int, null: false,
15
+ description: 'The current page number'
16
+ field :nodes_count, Int, null: false,
17
+ method: :items,
18
+ description: 'The actual number of nodes in the current non-empty page'
19
+ field :pages_count, Int, null: false,
20
+ method: :pages,
21
+ description: 'The number of total pages in the collection'
22
+ field :previous_page, Int, null: true,
23
+ method: :prev,
24
+ description: 'The previous page number or nil if there is no previous page'
25
+ field :next_page, Int, null: true,
26
+ method: :next,
27
+ description: 'The previous page number or nil if there is no previous page'
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ ##
5
+ # TODO: add documentation
6
+ module Pagination
7
+ def pagination_type
8
+ @pagination_type ||= begin
9
+ conn_name = "#{graphql_name}Pagination"
10
+ edge_type_class = edge_type
11
+
12
+ Class.new(connection_type_class) do
13
+ graphql_name(conn_name)
14
+ edge_type(edge_type_class)
15
+
16
+ field :page_info, Pagination::Types::PaginationPageInfoType, null: false,
17
+ description: 'Information to aid in pagination.'
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ ##
5
+ # TODO: add documentation
6
+ class PermittedFieldsExtension < GraphQL::Schema::FieldExtension
7
+ def resolve(object:, arguments:, context:)
8
+ if authorized?(object, context)
9
+ yield(object, arguments, nil)
10
+ else
11
+ on_unauthorized
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def on_unauthorized
18
+ raise GraphQL::ExecutionError, 'You are not authorized to perform this action' if field_required?
19
+ end
20
+
21
+ def field_required?
22
+ !options[:null]
23
+ end
24
+
25
+ def authorized?(object, context)
26
+ if root_type?(object, context)
27
+ true
28
+ else
29
+ context[:policy_provider].permitted_field?(record: object.object, field_name: field_name)
30
+ end
31
+ end
32
+
33
+ def field_name
34
+ field.original_name
35
+ end
36
+
37
+ def root_type?(object, context)
38
+ root_types = [context.schema.query.graphql_name, context.schema.mutation.graphql_name]
39
+
40
+ root_types.include? object.class.graphql_name
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Metrics/ParameterLists
4
+
5
+ module GraphQR
6
+ ##
7
+ # TODO: add documentation
8
+ module QueryField
9
+ def query_field(field_name, active_record_class, type_class:, scope_class: nil, **kwargs, &block)
10
+ is_collection = active_record_class.is_a? Array
11
+ if is_collection
12
+ active_record_class = active_record_class.first
13
+ resolver = collection(active_record_class, type_class, scope_class)
14
+ else
15
+ resolver = resource(active_record_class, type_class)
16
+ end
17
+
18
+ field(field_name, paginate: is_collection, resolver: resolver, **kwargs, &block)
19
+ end
20
+
21
+ private
22
+
23
+ def collection(active_record_class, type_class, scope_class)
24
+ Class.new(::BaseResolver) do
25
+ class_attribute :active_record_class
26
+ self.active_record_class = active_record_class
27
+
28
+ type type_class.pagination_type, null: false
29
+
30
+ argument :filter, scope_class, required: false
31
+
32
+ def resolve(filter: {})
33
+ authorize_graphql active_record_class, :index?
34
+
35
+ collection = apply_scopes(active_record_class, filter)
36
+ context[:policy_provider].authorized_records(records: collection)
37
+ end
38
+ end
39
+ end
40
+
41
+ def resource(active_record_class, type_class)
42
+ Class.new(::BaseResolver) do
43
+ class_attribute :active_record_class
44
+ self.active_record_class = active_record_class
45
+
46
+ type type_class, null: false
47
+
48
+ argument :id, 'ID', required: true
49
+
50
+ def resolve(id:)
51
+ record = self.class.active_record_class.find(id)
52
+
53
+ context[:policy_provider].allowed?(action: :show?, record: record)
54
+
55
+ record
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ # rubocop:enable Metrics/ParameterLists
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ ##
5
+ # TODO: add documentation
6
+ module ScopeItems
7
+ def scope_items(items, context)
8
+ if scopable_items?(items)
9
+ context[:policy_provider].authorized_records(records: items)
10
+ else
11
+ items
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def scopable_items?(items)
18
+ items.is_a? ActiveRecord::Relation
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ VERSION = '0.0.1'
5
+ end
data/lib/graphqr.rb ADDED
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql'
4
+ require 'pagy'
5
+
6
+ ##
7
+ # This module represents all the extensions we made to the graphql-ruby library
8
+ # it contains helpers and integrations we need to keep our workflow as simple as possible.
9
+ module GraphQR
10
+ class << self
11
+ # Switches GraphQR on or off
12
+ def enabled=(value)
13
+ GraphQR.config.enabled = value
14
+ end
15
+
16
+ # Returns if GraphQR is turned on
17
+ def enabled?
18
+ GraphQR.config.enabled.present?
19
+ end
20
+ end
21
+ end
22
+
23
+ require 'graphqr/fields/base_field'
24
+
25
+ require 'graphqr/pagination/types/pagination_page_info_type'
26
+ require 'graphqr/pagination/pagination_extension'
27
+ require 'graphqr/pagination/pagination_resolver'
28
+
29
+ require 'graphqr/apply_scopes'
30
+ require 'graphqr/authorized'
31
+ require 'graphqr/base'
32
+ require 'graphqr/pagination'
33
+ require 'graphqr/permitted_fields_extension'
34
+ require 'graphqr/query_field'
35
+ require 'graphqr/scope_items'
36
+ require 'graphqr/version'
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe GraphQR do
4
+ it 'has a version number' do
5
+ expect(GraphQR::VERSION).not_to be nil
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+ require 'graphqr'
5
+
6
+ RSpec.configure do |config|
7
+ # Enable flags like --only-failures and --next-failure
8
+ config.example_status_persistence_file_path = '.rspec_status'
9
+
10
+ # Disable RSpec exposing methods globally on `Module` and `main`
11
+ config.disable_monkey_patching!
12
+
13
+ config.expect_with :rspec do |c|
14
+ c.syntax = :expect
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,205 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: graphqr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Manuel Puyol
8
+ - Eric La Rosa
9
+ - João Batista Marinho
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2019-05-28 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: graphql
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 1.9.0
22
+ - - "<"
23
+ - !ruby/object:Gem::Version
24
+ version: '2'
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 1.9.0
32
+ - - "<"
33
+ - !ruby/object:Gem::Version
34
+ version: '2'
35
+ - !ruby/object:Gem::Dependency
36
+ name: pagy
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '3'
42
+ - - "<"
43
+ - !ruby/object:Gem::Version
44
+ version: '4'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '3'
52
+ - - "<"
53
+ - !ruby/object:Gem::Version
54
+ version: '4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.16'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.16'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rdoc
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-performance
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop-thread_safety
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Extensions and helpers for graphql-ruby
154
+ email:
155
+ - manuelpuyol@gmail.com
156
+ - eric@rosa.la
157
+ - joao@qulture.rocks
158
+ executables: []
159
+ extensions: []
160
+ extra_rdoc_files: []
161
+ files:
162
+ - LICENSE.txt
163
+ - README.md
164
+ - lib/graphqr.rb
165
+ - lib/graphqr/apply_scopes.rb
166
+ - lib/graphqr/authorized.rb
167
+ - lib/graphqr/base.rb
168
+ - lib/graphqr/fields/base_field.rb
169
+ - lib/graphqr/pagination.rb
170
+ - lib/graphqr/pagination/pagination_extension.rb
171
+ - lib/graphqr/pagination/pagination_resolver.rb
172
+ - lib/graphqr/pagination/types/pagination_page_info_type.rb
173
+ - lib/graphqr/permitted_fields_extension.rb
174
+ - lib/graphqr/query_field.rb
175
+ - lib/graphqr/scope_items.rb
176
+ - lib/graphqr/version.rb
177
+ - spec/graphqr_spec.rb
178
+ - spec/spec_helper.rb
179
+ homepage: https://github.com/QultureRocks/graphqr
180
+ licenses:
181
+ - MIT
182
+ metadata: {}
183
+ post_install_message:
184
+ rdoc_options: []
185
+ require_paths:
186
+ - lib
187
+ required_ruby_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ required_rubygems_version: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ requirements: []
198
+ rubyforge_project:
199
+ rubygems_version: 2.6.14
200
+ signing_key:
201
+ specification_version: 4
202
+ summary: Extensions and helpers for graphql-ruby
203
+ test_files:
204
+ - spec/spec_helper.rb
205
+ - spec/graphqr_spec.rb