rails-graphql-generator 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/generators/graphql/USAGE +9 -0
- data/lib/generators/graphql/create_all_generator.rb +23 -0
- data/lib/generators/graphql/graphql_generator.rb +24 -0
- data/lib/generators/graphql/graphql_helpers.rb +256 -0
- data/lib/generators/graphql/init_generator.rb +39 -0
- data/lib/generators/graphql/templates/config/graphiql.rb +1 -0
- data/lib/generators/graphql/templates/controllers/graph_ql_controller.rb +15 -0
- data/lib/generators/graphql/templates/graph/node_identification.rb +15 -0
- data/lib/generators/graphql/templates/graph/relay_schema.rb +33 -0
- data/lib/generators/graphql/templates/graph/types/mutation_type.rb +3 -0
- data/lib/generators/graphql/templates/graph/types/query_type.rb +13 -0
- data/lib/generators/graphql/templates/graph/types/root_level_type.rb +8 -0
- data/lib/generators/graphql/templates/models/root_level.rb +7 -0
- metadata +71 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3044f10456b35da92ca114424e35da2ba575993f
|
4
|
+
data.tar.gz: 5701cb9b7a8883bb6021375ea1a3fc41483ac689
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 561be3a2e560815a94912380105d57c214d379a01e37637a93b9e93b1449fa6b0a728108c7de81dfe153048c975648ec4121a570587b69817aed1259a3a7a00c
|
7
|
+
data.tar.gz: b0c9d5a698de7bdb68be0387379c261598b17c577619e46f12bbeceb5a30ac652c255c87d82b4f7f9704a93dfee0917caa5c26c7ab870b4f81c19b43827c03b1
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'generators/graphql/graphql_helpers'
|
2
|
+
|
3
|
+
module Graphql
|
4
|
+
module Generators
|
5
|
+
class CreateAllGenerator < Rails::Generators::Base
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
7
|
+
|
8
|
+
include Graphql::Generators::GraphqlHelpers
|
9
|
+
|
10
|
+
def create
|
11
|
+
models.each { |model| create_type(model) }
|
12
|
+
models.each { |model| add_fields(model) }
|
13
|
+
models.each { |model| add_methods(model) }
|
14
|
+
models.each { |model| add_connections(model) }
|
15
|
+
models.each { |model| add_connection_query(model) }
|
16
|
+
models.each { |model| create_mutation(model) }
|
17
|
+
models.each { |model| add_fields_to_mutation(model) }
|
18
|
+
models.each { |model| add_mutation_query(model) }
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'generators/graphql/graphql_helpers'
|
2
|
+
|
3
|
+
module Graphql
|
4
|
+
module Generators
|
5
|
+
class GraphqlGenerator < Rails::Generators::NamedBase
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
7
|
+
namespace 'graphql'
|
8
|
+
|
9
|
+
include Graphql::Generators::GraphqlHelpers
|
10
|
+
|
11
|
+
def create
|
12
|
+
model = name.classify.constantize
|
13
|
+
create_type(model)
|
14
|
+
add_fields(model)
|
15
|
+
add_methods(model)
|
16
|
+
add_connections(model)
|
17
|
+
add_connection_query(model)
|
18
|
+
create_mutation(model)
|
19
|
+
add_fields_to_mutation(model)
|
20
|
+
add_mutation_query(model)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,256 @@
|
|
1
|
+
module Graphql
|
2
|
+
module Generators
|
3
|
+
module GraphqlHelpers
|
4
|
+
def models
|
5
|
+
@models ||= ActiveRecord::Base.connection.tables.map{ |x| x.classify.safe_constantize }.compact
|
6
|
+
end
|
7
|
+
|
8
|
+
def type_mapper
|
9
|
+
@type_mapper ||= {
|
10
|
+
integer: 'Int',
|
11
|
+
string: 'String',
|
12
|
+
datetime: 'String',
|
13
|
+
boolean: 'Boolean',
|
14
|
+
float: 'Float',
|
15
|
+
date: 'String',
|
16
|
+
json: 'String',
|
17
|
+
text: 'String',
|
18
|
+
decimal: 'Float',
|
19
|
+
'' => 'String',
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_type(model)
|
24
|
+
create_file "app/graphql/types/#{ActiveModel::Naming.singular_route_key(model)}_type.rb", <<-FILE
|
25
|
+
#{model.to_s}Type = GraphQL::ObjectType.define do
|
26
|
+
name '#{model.to_s}'
|
27
|
+
description '#{model.to_s} type'
|
28
|
+
|
29
|
+
interfaces [NodeIdentification.interface]
|
30
|
+
|
31
|
+
field :id, field: GraphQL::Relay::GlobalIdField.new('#{model.to_s}')
|
32
|
+
# End of fields
|
33
|
+
end
|
34
|
+
FILE
|
35
|
+
add_fields(model)
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_fields(model)
|
39
|
+
columns = model.columns_hash
|
40
|
+
columns.keys.each do |k|
|
41
|
+
next if columns[k].name == 'id'
|
42
|
+
|
43
|
+
if columns[k].type.present?
|
44
|
+
inject_into_file type_path(model), after: "field :id, field: GraphQL::Relay::GlobalIdField.new('#{model.to_s}')\n" do <<-FILE
|
45
|
+
field :#{columns[k].name}, types.#{type_mapper[columns[k].type]}
|
46
|
+
FILE
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_methods(model)
|
53
|
+
associations = model.reflect_on_all_associations(:belongs_to)
|
54
|
+
|
55
|
+
associations.map(&:name).each do |ast|
|
56
|
+
association_klass = model.reflect_on_association(ast).class_name
|
57
|
+
|
58
|
+
begin
|
59
|
+
if models.include? association_klass.classify.constantize
|
60
|
+
if circular_finder[model.to_s].include? association_klass || association_klass == model.to_s
|
61
|
+
inject_into_file type_path(model), before: "# End of fields\n" do <<-FILE
|
62
|
+
field :#{ast.to_s} do
|
63
|
+
type -> { #{model.reflect_on_association(ast).class_name}Type }
|
64
|
+
|
65
|
+
resolve -> (#{singular_route_key(model)}, args, ctx) {
|
66
|
+
#{singular_route_key(model)}.#{ast.to_s}
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
FILE
|
71
|
+
end
|
72
|
+
else
|
73
|
+
inject_into_file type_path(model), before: "# End of fields\n" do <<-FILE
|
74
|
+
field :#{ast.to_s} do
|
75
|
+
type -> #{model.reflect_on_association(ast).class_name}Type
|
76
|
+
|
77
|
+
resolve -> (#{singular_route_key(model)}, args, ctx) {
|
78
|
+
#{singular_route_key(model)}.#{ast.to_s}
|
79
|
+
}
|
80
|
+
end
|
81
|
+
FILE
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
rescue => ex
|
86
|
+
puts ex
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def add_connections(model)
|
92
|
+
associations = model.reflect_on_all_associations(:has_many)
|
93
|
+
associations += model.reflect_on_all_associations(:has_and_belongs_to_many)
|
94
|
+
|
95
|
+
associations.map(&:name).each do |ast|
|
96
|
+
association_klass = model.reflect_on_association(ast).class_name
|
97
|
+
begin
|
98
|
+
if models.include? association_klass.classify.constantize
|
99
|
+
if circular_finder[model.to_s].include? association_klass || association_klass == model.to_s
|
100
|
+
inject_into_file type_path(model), before: "# End of fields\n" do <<-FILE
|
101
|
+
connection :#{ast.to_s}, -> { #{model.reflect_on_association(ast).class_name}Type.connection_type } do
|
102
|
+
resolve ->(#{singular_route_key(model)}, args, ctx) {
|
103
|
+
#{singular_route_key(model)}.#{ast}
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
FILE
|
108
|
+
end
|
109
|
+
else
|
110
|
+
inject_into_file type_path(model), before: "# End of fields\n" do <<-FILE
|
111
|
+
connection :#{ast.to_s}, #{model.reflect_on_association(ast).class_name}Type.connection_type do
|
112
|
+
resolve -> (#{singular_route_key(model)}, args, ctx) {
|
113
|
+
#{singular_route_key(model)}.#{ast}
|
114
|
+
}
|
115
|
+
end
|
116
|
+
FILE
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
rescue => ex
|
121
|
+
puts ex
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def add_connection_query(model)
|
127
|
+
inject_into_file 'app/graphql/types/root_level_type.rb', after: "field :id, field: GraphQL::Relay::GlobalIdField.new('RootLevel')\n" do <<-FILE
|
128
|
+
connection :#{model.to_s.tableize}, #{model.to_s}Type.connection_type do
|
129
|
+
resolve ->(object, args, ctx){
|
130
|
+
#{model.to_s}.all
|
131
|
+
}
|
132
|
+
end
|
133
|
+
FILE
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def create_mutation(model)
|
138
|
+
create_file mutation_path(model), <<-FILE
|
139
|
+
module #{model.to_s}Mutations
|
140
|
+
|
141
|
+
Create = GraphQL::Relay::Mutation.define do
|
142
|
+
name 'Create#{model.to_s}'
|
143
|
+
|
144
|
+
return_field :#{instance_name(model)}, #{model.to_s}Type
|
145
|
+
|
146
|
+
resolve -> (inputs, ctx) {
|
147
|
+
root = RootLevel::STATIC
|
148
|
+
attr = inputs.keys.inject({}) do |memo, key|
|
149
|
+
memo[key] = inputs[key] unless key == "clientMutationId"
|
150
|
+
memo
|
151
|
+
end
|
152
|
+
|
153
|
+
#{instance_name(model)} = #{model.to_s}.create(attr)
|
154
|
+
|
155
|
+
{ #{instance_name(model)}: #{instance_name(model)} }
|
156
|
+
}
|
157
|
+
end
|
158
|
+
|
159
|
+
Update = GraphQL::Relay::Mutation.define do
|
160
|
+
name 'Update#{model.to_s}'
|
161
|
+
|
162
|
+
input_field :id, !types.ID
|
163
|
+
|
164
|
+
return_field :#{instance_name(model)}, #{model.to_s}Type
|
165
|
+
|
166
|
+
resolve -> (inputs, ctx) {
|
167
|
+
#{instance_name(model)} = NodeIdentification.object_from_id((inputs[:id]), ctx)
|
168
|
+
attr = inputs.keys.inject({}) do |memo, key|
|
169
|
+
memo[key] = inputs[key] unless key == "clientMutationId" || key == 'id'
|
170
|
+
memo
|
171
|
+
end
|
172
|
+
|
173
|
+
#{instance_name(model)}.update(attr)
|
174
|
+
{ #{instance_name(model)}: #{instance_name(model)} }
|
175
|
+
}
|
176
|
+
end
|
177
|
+
|
178
|
+
Destroy = GraphQL::Relay::Mutation.define do
|
179
|
+
name "Destroy#{model.to_s}"
|
180
|
+
|
181
|
+
input_field :id, !types.ID
|
182
|
+
|
183
|
+
resolve -> (inputs, ctx) {
|
184
|
+
#{instance_name(model)} = NodeIdentification.object_from_id((inputs[:id]), ctx)
|
185
|
+
#{instance_name(model)}.destroy
|
186
|
+
{ }
|
187
|
+
}
|
188
|
+
end
|
189
|
+
end
|
190
|
+
FILE
|
191
|
+
end
|
192
|
+
|
193
|
+
def add_fields_to_mutation(model)
|
194
|
+
columns = model.columns_hash
|
195
|
+
columns.keys.each do |k|
|
196
|
+
next if %w(id created_at updated_at).include? columns[k].name
|
197
|
+
if columns[k].type.present?
|
198
|
+
inject_into_file mutation_path(model), after: "name 'Update#{model.to_s}'\n" do <<-FILE
|
199
|
+
input_field :#{columns[k].name}, types.#{type_mapper[columns[k].type]}
|
200
|
+
FILE
|
201
|
+
end
|
202
|
+
|
203
|
+
inject_into_file mutation_path(model), after: "name 'Create#{model.to_s}'\n", :force => true do <<-FILE
|
204
|
+
input_field :#{columns[k].name}, !types.#{type_mapper[columns[k].type]}
|
205
|
+
FILE
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def add_mutation_query(model)
|
212
|
+
inject_into_file "app/graphql/types/mutation_type.rb", after: "name 'MutationType'\n" do <<-FILE
|
213
|
+
field :create#{model.to_s}, field: #{model.to_s}Mutations::Create.field
|
214
|
+
field :update#{model.to_s}, field: #{model.to_s}Mutations::Update.field
|
215
|
+
field :destroy#{model.to_s}, field: #{model.to_s}Mutations::Destroy.field
|
216
|
+
|
217
|
+
FILE
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def singular_route_key(model)
|
222
|
+
ActiveModel::Naming.singular_route_key(model)
|
223
|
+
end
|
224
|
+
|
225
|
+
def mutation_path(model)
|
226
|
+
"app/graphql/mutations/#{singular_route_key(model)}_mutations.rb"
|
227
|
+
end
|
228
|
+
|
229
|
+
def type_path(model)
|
230
|
+
"app/graphql/types/#{singular_route_key(model)}_type.rb"
|
231
|
+
end
|
232
|
+
|
233
|
+
def instance_name(model)
|
234
|
+
ActiveModel::Naming.singular_route_key(model)
|
235
|
+
end
|
236
|
+
|
237
|
+
def circular_finder
|
238
|
+
circular_finder = {}
|
239
|
+
|
240
|
+
models.each do |m|
|
241
|
+
associations = m.reflect_on_all_associations.map(&:name)
|
242
|
+
circular_finder[m.to_s] = [] unless circular_finder[m.to_s].present?
|
243
|
+
|
244
|
+
associations.each do |k|
|
245
|
+
association_klass = m.reflect_on_association(k).class_name
|
246
|
+
circular_finder[association_klass] = [] unless circular_finder[association_klass].present?
|
247
|
+
|
248
|
+
circular_finder[association_klass] << m.to_s
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
@circular_finder ||= circular_finder
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Graphql
|
2
|
+
module Generators
|
3
|
+
class InitGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
def add_gems
|
7
|
+
gem 'graphql'
|
8
|
+
gem 'graphql-relay'
|
9
|
+
gem 'graphiql-rails'
|
10
|
+
gem 'graphql-formatter'
|
11
|
+
end
|
12
|
+
|
13
|
+
def routes
|
14
|
+
route "post 'graphql' => 'graph_ql#execute'"
|
15
|
+
route "mount GraphiQL::Rails::Engine, at: '/graphiql', graphql_path: '/graphql'"
|
16
|
+
end
|
17
|
+
|
18
|
+
def autoload_paths
|
19
|
+
application do <<-'RUBY'
|
20
|
+
config.autoload_paths += Dir["#{config.root}/app/graphql/**/"]
|
21
|
+
RUBY
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def copy_templates
|
26
|
+
copy_file 'controllers/graph_ql_controller.rb', 'app/controllers/graph_ql_controller.rb'
|
27
|
+
copy_file 'models/root_level.rb', 'app/models/root_level.rb'
|
28
|
+
copy_file 'graph/relay_schema.rb', 'app/graphql/relay_schema.rb'
|
29
|
+
copy_file 'graph/node_identification.rb', 'app/graphql/node_identification.rb'
|
30
|
+
copy_file 'graph/types/root_level_type.rb', 'app/graphql/types/root_level_type.rb'
|
31
|
+
copy_file 'graph/types/query_type.rb', 'app/graphql/types/query_type.rb'
|
32
|
+
copy_file 'graph/types/mutation_type.rb', 'app/graphql/types/mutation_type.rb'
|
33
|
+
|
34
|
+
copy_file 'config/graphiql.rb', 'config/initializers/graphiql.rb'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
GraphiQL::Rails.config.query_params = true
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class GraphQlController < ApplicationController
|
2
|
+
skip_before_filter :verify_authenticity_token
|
3
|
+
|
4
|
+
def execute
|
5
|
+
puts '-' * 100, GraphQLFormatter.new(params[:query]).to_s, '-' * 100
|
6
|
+
if params[:variables].present?
|
7
|
+
variables = JSON.parse(params[:variables])
|
8
|
+
else
|
9
|
+
variables = params[:variables]
|
10
|
+
end
|
11
|
+
|
12
|
+
render json: GraphQL::Query.new(RelaySchema, params[:query], variables: variables, debug: true).result
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
NodeIdentification = GraphQL::Relay::GlobalNodeIdentification.define do
|
2
|
+
# Given a UUID & the query context,
|
3
|
+
# return the corresponding application object
|
4
|
+
object_from_id -> (id, ctx) do
|
5
|
+
type_name, id = NodeIdentification.from_global_id(id)
|
6
|
+
# "Post" -> Post.find(id)
|
7
|
+
Object.const_get(type_name).find(id)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Given an application object,
|
11
|
+
# return a GraphQL ObjectType to expose that object
|
12
|
+
type_from_object -> (object) do
|
13
|
+
(object.class.name + 'Type').constantize
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
RelaySchema = GraphQL::Schema.new(query: QueryType, mutation: MutationType)
|
2
|
+
|
3
|
+
module RelaySchemaHelpers
|
4
|
+
SCHEMA_DIR = Rails.root.join('app/assets/javascripts/relay/')
|
5
|
+
SCHEMA_PATH = File.join(SCHEMA_DIR, 'schema.json')
|
6
|
+
|
7
|
+
def explain
|
8
|
+
Rails.cache.fetch checksum do
|
9
|
+
RelaySchema.execute GraphQL::Introspection::INTROSPECTION_QUERY
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def checksum
|
14
|
+
files = Dir["app/graph/**/*.rb"].reject { |f| File.directory?(f) }
|
15
|
+
content = files.map { |f| File.read(f) }.join
|
16
|
+
Digest::SHA256.hexdigest(content).to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate
|
20
|
+
FileUtils.mkdir_p SCHEMA_DIR
|
21
|
+
result = JSON.pretty_generate(RelaySchema.explain)
|
22
|
+
unless File.exists?(SCHEMA_PATH) && File.read(SCHEMA_PATH) == result
|
23
|
+
File.write(SCHEMA_PATH, result)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def remove
|
28
|
+
FileUtils.rm SCHEMA_PATH if File.exist? SCHEMA_PATH
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
RelaySchema.extend RelaySchemaHelpers
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# ...and a query root
|
2
|
+
QueryType = GraphQL::ObjectType.define do
|
3
|
+
name "Query"
|
4
|
+
description "The query root of this schema"
|
5
|
+
|
6
|
+
field :node, field: NodeIdentification.field
|
7
|
+
|
8
|
+
field :root, RootLevelType do
|
9
|
+
resolve -> (obj, args, ctx) { RootLevel::STATIC }
|
10
|
+
end
|
11
|
+
|
12
|
+
# End Of Queries
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails-graphql-generator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Muhammet
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-05-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.2'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.2'
|
27
|
+
description: This generator will put the graphql files input your app folder
|
28
|
+
email:
|
29
|
+
- dilekmuhammet@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/generators/graphql/USAGE
|
35
|
+
- lib/generators/graphql/create_all_generator.rb
|
36
|
+
- lib/generators/graphql/graphql_generator.rb
|
37
|
+
- lib/generators/graphql/graphql_helpers.rb
|
38
|
+
- lib/generators/graphql/init_generator.rb
|
39
|
+
- lib/generators/graphql/templates/config/graphiql.rb
|
40
|
+
- lib/generators/graphql/templates/controllers/graph_ql_controller.rb
|
41
|
+
- lib/generators/graphql/templates/graph/node_identification.rb
|
42
|
+
- lib/generators/graphql/templates/graph/relay_schema.rb
|
43
|
+
- lib/generators/graphql/templates/graph/types/mutation_type.rb
|
44
|
+
- lib/generators/graphql/templates/graph/types/query_type.rb
|
45
|
+
- lib/generators/graphql/templates/graph/types/root_level_type.rb
|
46
|
+
- lib/generators/graphql/templates/models/root_level.rb
|
47
|
+
homepage: https://github.com/movielala/rails-graphql-generator
|
48
|
+
licenses:
|
49
|
+
- MIT
|
50
|
+
metadata: {}
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
requirements: []
|
66
|
+
rubyforge_project:
|
67
|
+
rubygems_version: 2.5.1
|
68
|
+
signing_key:
|
69
|
+
specification_version: 4
|
70
|
+
summary: A rails generator for GrapphQL.
|
71
|
+
test_files: []
|