cm-graphql 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
+ SHA256:
3
+ metadata.gz: 88cbec80aeb7ce0649e72b28495436a8bfd2372d564f5b593056106fb10bca8c
4
+ data.tar.gz: 90e971f56d3b41f432418bfce7652ba76c7b99bf797ae1cfef2d3a4b0aa0e7cf
5
+ SHA512:
6
+ metadata.gz: 237af1356eb71878cb5d0cbc21502a3ea95828286da8b8178aaf6be061ccd12e818d4b9545d3e5e92f8a0bc620bd2849afea13bd6f9da89919a5c37058508bad
7
+ data.tar.gz: 827e8261f871b22adc627375f39b06bedc8ff7e434330dbf9d8b1919179d26ad8f8c989f8d0106f82793af0595f40864c71393c086efc74d180f1340892e04f7
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+ source 'https://rails-assets.org'
3
+
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,113 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ cm-graphql (0.0.1)
5
+ graphiql-rails (~> 1.8.0)
6
+ graphql (~> 1.13.1)
7
+ graphql-errors (~> 0.4.0)
8
+ graphql-rails_logger (~> 1.2.3)
9
+ kaminari (~> 1.2.2)
10
+
11
+ GEM
12
+ remote: https://rubygems.org/
13
+ remote: https://rails-assets.org/
14
+ specs:
15
+ actionpack (7.0.3.1)
16
+ actionview (= 7.0.3.1)
17
+ activesupport (= 7.0.3.1)
18
+ rack (~> 2.0, >= 2.2.0)
19
+ rack-test (>= 0.6.3)
20
+ rails-dom-testing (~> 2.0)
21
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
22
+ actionview (7.0.3.1)
23
+ activesupport (= 7.0.3.1)
24
+ builder (~> 3.1)
25
+ erubi (~> 1.4)
26
+ rails-dom-testing (~> 2.0)
27
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
28
+ activemodel (7.0.3.1)
29
+ activesupport (= 7.0.3.1)
30
+ activerecord (7.0.3.1)
31
+ activemodel (= 7.0.3.1)
32
+ activesupport (= 7.0.3.1)
33
+ activesupport (7.0.3.1)
34
+ concurrent-ruby (~> 1.0, >= 1.0.2)
35
+ i18n (>= 1.6, < 2)
36
+ minitest (>= 5.1)
37
+ tzinfo (~> 2.0)
38
+ builder (3.2.4)
39
+ concurrent-ruby (1.1.10)
40
+ crass (1.0.6)
41
+ erubi (1.11.0)
42
+ graphiql-rails (1.8.0)
43
+ railties
44
+ sprockets-rails
45
+ graphql (1.13.15)
46
+ graphql-errors (0.4.0)
47
+ graphql (>= 1.6.0, < 2)
48
+ graphql-rails_logger (1.2.3)
49
+ actionpack (> 5.0)
50
+ activesupport (> 5.0)
51
+ railties (> 5.0)
52
+ rouge (~> 3.0)
53
+ i18n (1.12.0)
54
+ concurrent-ruby (~> 1.0)
55
+ kaminari (1.2.2)
56
+ activesupport (>= 4.1.0)
57
+ kaminari-actionview (= 1.2.2)
58
+ kaminari-activerecord (= 1.2.2)
59
+ kaminari-core (= 1.2.2)
60
+ kaminari-actionview (1.2.2)
61
+ actionview
62
+ kaminari-core (= 1.2.2)
63
+ kaminari-activerecord (1.2.2)
64
+ activerecord
65
+ kaminari-core (= 1.2.2)
66
+ kaminari-core (1.2.2)
67
+ loofah (2.18.0)
68
+ crass (~> 1.0.2)
69
+ nokogiri (>= 1.5.9)
70
+ method_source (1.0.0)
71
+ mini_portile2 (2.8.0)
72
+ minitest (5.16.2)
73
+ nokogiri (1.13.8)
74
+ mini_portile2 (~> 2.8.0)
75
+ racc (~> 1.4)
76
+ racc (1.6.0)
77
+ rack (2.2.4)
78
+ rack-test (2.0.2)
79
+ rack (>= 1.3)
80
+ rails-dom-testing (2.0.3)
81
+ activesupport (>= 4.2.0)
82
+ nokogiri (>= 1.6)
83
+ rails-html-sanitizer (1.4.3)
84
+ loofah (~> 2.3)
85
+ railties (7.0.3.1)
86
+ actionpack (= 7.0.3.1)
87
+ activesupport (= 7.0.3.1)
88
+ method_source
89
+ rake (>= 12.2)
90
+ thor (~> 1.0)
91
+ zeitwerk (~> 2.5)
92
+ rake (13.0.6)
93
+ rouge (3.30.0)
94
+ sprockets (4.1.1)
95
+ concurrent-ruby (~> 1.0)
96
+ rack (> 1, < 3)
97
+ sprockets-rails (3.4.2)
98
+ actionpack (>= 5.2)
99
+ activesupport (>= 5.2)
100
+ sprockets (>= 3.0.0)
101
+ thor (1.2.1)
102
+ tzinfo (2.0.5)
103
+ concurrent-ruby (~> 1.0)
104
+ zeitwerk (2.6.0)
105
+
106
+ PLATFORMS
107
+ arm64-darwin-20
108
+
109
+ DEPENDENCIES
110
+ cm-graphql!
111
+
112
+ BUNDLED WITH
113
+ 2.2.33
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # CmGraphql
2
+
3
+ This should help you to install graphql and setup the basics on any new rails application.
4
+
5
+ ## Install
6
+
7
+ Add the gem to the Gemfile
8
+
9
+ ```
10
+ gem 'cm-admin', git: 'https://github.com/commutatus/template-paging-api.git', branch: 'main'
11
+ ```
12
+
13
+ ## Setup
14
+
15
+ If this is the first time graphql is getting added to the project, run the following generator
16
+
17
+ ```
18
+ rails g cm_graphql:add_graphql
19
+ ```
20
+
21
+ This will run the graphql generator `graphql:install` and copy the graphql schema template.
22
+
23
+ ## Generator
24
+
25
+ Another generator to help you get started with a basic list endpoint is
26
+
27
+ ```
28
+ rails g cm_graphql:list_api model_name
29
+ rails g cm_graphql:list_api course
30
+ ```
31
+
32
+ This will add the necessary files to the application.
33
+ - course_list_type
34
+ - course_type
35
+ - course_query
36
+
37
+ Mount the engine at
38
+ ```
39
+ mount CmGraphql::Engine => "/cm-graphql"
40
+ ```
41
+
42
+ And you are done, you can test out the pagination.
43
+
44
+ ## Explaination on how this works.
45
+
46
+ 1. Kaminari Gem has `page` and `per` methods. These methods are used to set the page no and records per page of a model.
47
+ 2. The paging Input type in `app/graphql/types/inputs/base/paging.rb` exposes a interface to the frontend where the frontend can enter page no and records per page.
48
+ 3. The query uses a `list` method on the model. This method is inherited by the model from the paginator concern.
49
+ 4. We apply the kaminari method in the list method to apply pagination to the model.
50
+ 5. The paginator then calls the filtered_list model to arrange the model data and paging data in a representable way. This helps us make sure all the pagination follow the same pattern for data representation.
51
+ 6. The paging_type in `app/graphql/types/objects/base/paging_type.rb` is used to represent the paging data to the frontend.
52
+ 7. The pagination and model data is represented with object type in `app/graphql/types/objects/example_list_type.rb`.
53
+ 8. And we have successfully applied pagination to our graphql project.
@@ -0,0 +1,8 @@
1
+ module Mutations
2
+ class BaseMutation < GraphQL::Schema::RelayClassicMutation
3
+ argument_class Types::BaseArgument
4
+ field_class Types::BaseField
5
+ input_object_class Types::BaseInputObject
6
+ object_class Types::BaseObject
7
+ end
8
+ end
@@ -0,0 +1,4 @@
1
+ module Queries
2
+ class BaseQuery < GraphQL::Schema::Resolver
3
+ end
4
+ end
@@ -0,0 +1,7 @@
1
+ module Types
2
+ class Enums::Base::SortColumn < Types::BaseEnum
3
+ description "Possible values for sort column"
4
+
5
+ value :created_at, "Sort by created_at"
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ module Types
2
+ class Enums::Base::SortDirection < Types::BaseEnum
3
+ description "Possible values for sort direction"
4
+
5
+ value :asc, "Sort by ascending"
6
+ value :desc, "Sort by descending"
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ module Types
2
+ module Inputs
3
+ module Base
4
+ class Attachment < Types::BaseInputObject
5
+ graphql_name "AttachmentInput"
6
+
7
+ description "Attributes needed to attach a file"
8
+
9
+ argument :filename, String, nil, required: true
10
+ argument :content, String, nil, required: true
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,15 @@
1
+ module Types
2
+ module Inputs
3
+ module Base
4
+ class Filter < Types::BaseInputObject
5
+ graphql_name "BaseFilterInput"
6
+
7
+ description "Attributes needed for filtering items"
8
+
9
+ argument :ids, [Integer], nil, required: false
10
+ argument :q, String, nil, required: false
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,14 @@
1
+ module Types
2
+ module Inputs
3
+ module Base
4
+ class Paging < Types::BaseInputObject
5
+ graphql_name "PagingInput"
6
+
7
+ description "Attributes needed for paginating list of items"
8
+
9
+ argument :page_no, Integer, nil, required: true
10
+ argument :per_page, Integer, nil, required: false
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ module Types
2
+ module Inputs
3
+ module Base
4
+ class Sort < Types::BaseInputObject
5
+ graphql_name "SortInput"
6
+
7
+ description "Attributes needed for sorting the list of items"
8
+
9
+ argument :column, Types::Enums::Base::SortColumn, nil, required: true
10
+ argument :direction, Types::Enums::Base::SortDirection, nil, required: true
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,31 @@
1
+ module Types::Objects::Base
2
+ class AttachmentType < Types::BaseObject
3
+ field :id, Int, nil, null: false
4
+ field :filename, String, nil, null: false
5
+ field :url, String, nil, null: false
6
+
7
+ def id
8
+ if object.class.eql?(ActiveStorage::Variant)
9
+ object.blob.id
10
+ else
11
+ object.id
12
+ end
13
+ end
14
+
15
+ def filename
16
+ if object.class.eql?(ActiveStorage::Variant)
17
+ object.blob.filename.to_s + "-" + object.variation.transformations[:resize]
18
+ else
19
+ object.filename.to_s
20
+ end
21
+ end
22
+
23
+ def url
24
+ if object.class.eql?(ActiveStorage::Variant)
25
+ Rails.application.routes.url_helpers.rails_representation_url(object)
26
+ else
27
+ object.service_url
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,8 @@
1
+ module Types::Objects::Base
2
+ class PagingType < Types::BaseObject
3
+ graphql_name "PagingType"
4
+ field :current_page, Integer, null: true
5
+ field :total_count, Integer, null: true
6
+ field :total_pages, Integer, null: true
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ module Paginator
2
+ extend ActiveSupport::Concern
3
+ module ClassMethods
4
+ def list(per_page = DEFAULT_PER_PAGE, page = nil)
5
+ paginated_list = {}
6
+ per_page = DEFAULT_PER_PAGE if per_page == 0
7
+ paginated_list[:list] = self.page(page || 1).per(per_page)
8
+ FilteredList.new(paginated_list)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ class FilteredList
2
+ attr_reader :data, :facets, :paging
3
+
4
+ def initialize(paginated_list)
5
+ self.data = paginated_list[:list]
6
+ self.paging = paginated_list
7
+ end
8
+
9
+ def data=(data)
10
+ @data = []
11
+ @data = data if data.present?
12
+ end
13
+
14
+ def paging=(paginated_list)
15
+ @paging = {
16
+ total_count: paginated_list[:list].total_count,
17
+ current_page: paginated_list[:list].current_page,
18
+ total_pages: paginated_list[:list].total_pages
19
+ }
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = 'cm-graphql'
3
+ spec.version = '0.0.1'
4
+ spec.date = '2022-09-14'
5
+ spec.summary = "A gem to setup grapqhl basics like pagination, file upload"
6
+ spec.description = "A gem to setup grapqhl basics like pagination, file upload"
7
+ spec.authors = ["Anbazhagan Palani"]
8
+ spec.email = 'anbu@commutatus.com'
9
+ spec.homepage =
10
+ 'https://github.com/commutatus/template-paging-api'
11
+ spec.license = 'MIT'
12
+
13
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
14
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
15
+ end
16
+ spec.bindir = "exe"
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_runtime_dependency 'graphql', '~> 1.13.1'
21
+ spec.add_runtime_dependency 'graphql-errors', '~> 0.4.0'
22
+ spec.add_runtime_dependency 'graphql-rails_logger', '~> 1.2.3'
23
+ spec.add_runtime_dependency 'graphiql-rails', '~> 1.8.0'
24
+ spec.add_runtime_dependency 'kaminari', '~> 1.2.2'
25
+ end
@@ -0,0 +1,7 @@
1
+ ActiveSupport.on_load(:active_record) do
2
+ module ActiveRecord
3
+ class Base
4
+ include Paginator
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ DEFAULT_PER_PAGE = 20
2
+ DEFAULT_SORT_COLUMN = 'created_at'
3
+ DEFAULT_SORT_DIRECTION = 'desc'
@@ -0,0 +1,6 @@
1
+ require 'rails'
2
+ module CmGraphql
3
+ class Engine < Rails::Engine
4
+ isolate_namespace CmGraphql
5
+ end
6
+ end
data/lib/cm-graphql.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'graphql'
2
+ require 'kaminari'
3
+ require 'cm-graphql/engine'
4
+ module CmGraphql
5
+ end
@@ -0,0 +1,14 @@
1
+ require 'rails/generators'
2
+
3
+ module CmGraphql
4
+ module Generators
5
+ class AddGraphqlGenerator < Rails::Generators::Base
6
+ source_root File.expand_path('templates', __dir__)
7
+
8
+ def add_graphql
9
+ generate 'graphql:install'
10
+ template 'graphql_schema.rb', "app/graphql/#{Rails.application.class.module_parent_name.underscore}_schema.rb"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ require 'rails/generators'
2
+
3
+ module CmGraphql
4
+ module Generators
5
+ class ListApiGenerator < Rails::Generators::Base
6
+ source_root File.expand_path('templates', __dir__)
7
+
8
+ def add_graphql
9
+ @model_name = args.first
10
+ template "list_type.rb", "app/graphql/types/objects/#{@model_name}_list_type.rb"
11
+ template "record_type.rb", "app/graphql/types/objects/#{@model_name}_type.rb"
12
+ template "query_type.rb", "app/graphql/queries/#{@model_name}.rb"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,55 @@
1
+ class <%= Rails.application.class.module_parent_name %>Schema < GraphQL::Schema
2
+ mutation(Types::MutationType)
3
+ query(Types::QueryType)
4
+
5
+ # Union and Interface Resolution
6
+ def self.resolve_type(abstract_type, obj, ctx)
7
+ # TODO: Implement this function
8
+ # to return the correct object type for `obj`
9
+ raise(GraphQL::RequiredImplementationMissingError)
10
+ end
11
+
12
+ # Relay-style Object Identification:
13
+
14
+ # Return a string UUID for `object`
15
+ def self.id_from_object(object, type_definition, query_ctx)
16
+ # Here's a simple implementation which:
17
+ # - joins the type name & object.id
18
+ # - encodes it with base64:
19
+ # GraphQL::Schema::UniqueWithinType.encode(type_definition.name, object.id)
20
+ end
21
+
22
+ # Given a string UUID, find the object
23
+ def self.object_from_id(id, query_ctx)
24
+ # For example, to decode the UUIDs generated above:
25
+ # type_name, item_id = GraphQL::Schema::UniqueWithinType.decode(id)
26
+ #
27
+ # Then, based on `type_name` and `id`
28
+ # find an object in your application
29
+ # ...
30
+ end
31
+
32
+ rescue_from ActiveRecord::RecordNotFound do |err, obj, args, ctx, field|
33
+ GraphQL::ExecutionError.new("#{field.type.unwrap.graphql_name} not found", extensions: {code: :unprocessable_entity, sub_code: :record_invalid, message: err.message})
34
+ end
35
+
36
+ rescue_from ActiveRecord::RecordInvalid do |err, obj, args, ctx, field|
37
+ GraphQL::ExecutionError.new(err.message, extensions: {code: :unprocessable_entity, sub_code: :record_invalid, message: err.message})
38
+ end
39
+
40
+ rescue_from BaseException do |err, obj, args, ctx, field|
41
+ GraphQL::ExecutionError.new(err.message, extensions: {code: err.code, sub_code: err.sub_code, message: err.message})
42
+ end
43
+
44
+ unless Rails.env.development?
45
+ rescue_from StandardError do |err, obj, args, ctx, field|
46
+ rollbar_error = Rollbar.error(err)
47
+ GraphQL::ExecutionError.new("Internal Server Error", extensions: {code: :internal_server_error, uuid: rollbar_error[:uuid]})
48
+ end
49
+ end
50
+
51
+ def self.unauthorized_object(error)
52
+ raise Unauthorized, I18n.t("graphql.unauthorized", error_type: error.type.graphql_name)
53
+ end
54
+
55
+ end
@@ -0,0 +1,8 @@
1
+ module Types::Objects
2
+ class <%= @model_name.titleize %>ListType < Types::BaseObject
3
+ graphql_name "<%= @model_name.titleize %>ListType"
4
+
5
+ field :paging, Types::Objects::Base::PagingType, null: true
6
+ field :data, [Types::Objects::<%= @model_name.titleize %>Type], null: false
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ module Queries
2
+ class <%= @model_name.titleize %> < Queries::BaseQuery
3
+ description "Fetch all or specific <%= @model_name.titleize %> detail"
4
+
5
+ type Types::Objects::<%= @model_name.titleize %>ListType, null: true
6
+
7
+ argument :paging, Types::Inputs::Base::Paging, required: false
8
+ argument :sort, Types::Inputs::Base::Sort, required: false
9
+
10
+ def resolve(paging: nil, filters: nil, sort: nil)
11
+ raise Unauthorized, I18n.t("graphql.unauthorized") if (filters && filters.my) && Current.user.nil?
12
+ ::<%= @model_name.titleize %>.all.list(paging&.per_page, paging&.page_no)
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ module Types::Objects
2
+ class <%= @model_name.titleize %>Type < Types::BaseObject
3
+
4
+ graphql_name "<%= @model_name.titleize %>"
5
+
6
+ field :id, Integer, null: false
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cm-graphql
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Anbazhagan Palani
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-09-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: graphql
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.13.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.13.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: graphql-errors
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.4.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.4.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: graphql-rails_logger
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.2.3
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.2.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: graphiql-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.8.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.8.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: kaminari
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.2.2
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.2.2
83
+ description: A gem to setup grapqhl basics like pagination, file upload
84
+ email: anbu@commutatus.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - Gemfile
90
+ - Gemfile.lock
91
+ - README.md
92
+ - app/graphql/mutations/base_mutation.rb
93
+ - app/graphql/queries/base_query.rb
94
+ - app/graphql/types/enums/base/sort_column.rb
95
+ - app/graphql/types/enums/base/sort_direction.rb
96
+ - app/graphql/types/inputs/base/attachment.rb
97
+ - app/graphql/types/inputs/base/filter.rb
98
+ - app/graphql/types/inputs/base/paging.rb
99
+ - app/graphql/types/inputs/base/sort.rb
100
+ - app/graphql/types/objects/base/attachment_type.rb
101
+ - app/graphql/types/objects/base/paging_type.rb
102
+ - app/models/concerns/paginator.rb
103
+ - app/models/filtered_list.rb
104
+ - cm-graphql.gemspec
105
+ - config/initializers/active_record_extension.rb
106
+ - config/initializers/constants.rb
107
+ - lib/cm-graphql.rb
108
+ - lib/cm-graphql/engine.rb
109
+ - lib/generators/cm_graphql/add_graphql_generator.rb
110
+ - lib/generators/cm_graphql/list_api_generator.rb
111
+ - lib/generators/cm_graphql/templates/graphql_schema.rb
112
+ - lib/generators/cm_graphql/templates/list_type.rb
113
+ - lib/generators/cm_graphql/templates/query_type.rb
114
+ - lib/generators/cm_graphql/templates/record_type.rb
115
+ homepage: https://github.com/commutatus/template-paging-api
116
+ licenses:
117
+ - MIT
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubygems_version: 3.2.3
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: A gem to setup grapqhl basics like pagination, file upload
138
+ test_files: []