graphqr 0.0.1
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.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +43 -0
- data/lib/graphqr/apply_scopes.rb +60 -0
- data/lib/graphqr/authorized.rb +13 -0
- data/lib/graphqr/base.rb +32 -0
- data/lib/graphqr/fields/base_field.rb +26 -0
- data/lib/graphqr/pagination/pagination_extension.rb +28 -0
- data/lib/graphqr/pagination/pagination_resolver.rb +39 -0
- data/lib/graphqr/pagination/types/pagination_page_info_type.rb +31 -0
- data/lib/graphqr/pagination.rb +22 -0
- data/lib/graphqr/permitted_fields_extension.rb +43 -0
- data/lib/graphqr/query_field.rb +61 -0
- data/lib/graphqr/scope_items.rb +21 -0
- data/lib/graphqr/version.rb +5 -0
- data/lib/graphqr.rb +36 -0
- data/spec/graphqr_spec.rb +7 -0
- data/spec/spec_helper.rb +16 -0
- metadata +205 -0
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
|
data/lib/graphqr/base.rb
ADDED
@@ -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
|
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'
|
data/spec/spec_helper.rb
ADDED
@@ -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
|