graphql-generator 0.0.1 → 0.0.4
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 +4 -4
- data/Gemfile +6 -0
- data/README.md +19 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/graphql-generator-0.0.1.gem +0 -0
- data/graphql-generator-0.0.2.gem +0 -0
- data/graphql-generator-0.0.3.gem +0 -0
- data/graphql_generator.gemspec +25 -0
- data/lib/graphql_generator/generator/USAGE +18 -0
- data/lib/graphql_generator/generator/graphql_generator.rb +270 -0
- data/lib/graphql_generator/generator/templates/graphql_types/input_type_template.erb +4 -0
- data/lib/graphql_generator/generator/templates/graphql_types/type_template.erb +10 -0
- data/lib/graphql_generator/generator/templates/migration_template.erb +10 -0
- data/lib/graphql_generator/generator/templates/model_template.erb +4 -0
- data/lib/graphql_generator/generator/templates/mutations/create_mutation_template.erb +26 -0
- data/lib/graphql_generator/generator/templates/mutations/delete_mutation_template.erb +25 -0
- data/lib/graphql_generator/generator/templates/mutations/update_mutation_template.erb +27 -0
- data/lib/graphql_generator/railtie.rb +13 -0
- data/lib/graphql_generator/version.rb +3 -0
- data/lib/graphql_generator.rb +5 -0
- metadata +23 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '03595903320c2a6e278dfa961eda58e524b33734e8a486837bb27ae60617d753'
|
4
|
+
data.tar.gz: e55b6a8dc3aa86affbb75c35ff598748695ed38813fa5e99362ba361ed4f66d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f51395dcac0b16de2c253ad7c9d12c47549b6f70b3f3c2d5a967c1141a68c77b8f6e6d623cb49927dc9d137ad4c9fbd24ff8c339c406c2938ba0b59cf930529a
|
7
|
+
data.tar.gz: ffad7a3beb4179d42389db51286198bf0d629095ea5f5ecbde4df240f3a5a3726bf29c8c9e8342f9c3d415ceec0e9ef556e3b50820fbdbe2848dc8a2bd3767d1
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# GraphQLGenerator
|
2
|
+
|
3
|
+
> This gem creates a Service Generator so you can use it as a part of rails generators.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'graphql-generator'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install graphql-generator
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "graphql_generator"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,25 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "graphql_generator/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "graphql-generator"
|
7
|
+
spec.version = GraphQLGenerator::VERSION
|
8
|
+
spec.authors = ["Oleg Savinov"]
|
9
|
+
|
10
|
+
spec.summary = %q{Creates GraphQL generator}
|
11
|
+
spec.description = %q{Creates GraphQL generator}
|
12
|
+
|
13
|
+
|
14
|
+
# Specify which files should be added to the gem when it is released.
|
15
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
16
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
17
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
end
|
19
|
+
spec.bindir = "exe"
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Description:
|
2
|
+
Explain the generator
|
3
|
+
|
4
|
+
Example:
|
5
|
+
bin/rails g graph_ql email:string! first_name:string! age:int --name user
|
6
|
+
|
7
|
+
This will create:
|
8
|
+
Migration:
|
9
|
+
db/migrate/20220422010101_create_user.rb
|
10
|
+
Model:
|
11
|
+
app/models/user.rb
|
12
|
+
GraphQL:
|
13
|
+
Type:
|
14
|
+
app/graphql/types/user_type.rb
|
15
|
+
Mutation:
|
16
|
+
app/graphql/mutations/create_user.rb
|
17
|
+
app/graphql/mutations/update_user.rb
|
18
|
+
app/graphql/mutations/delete_user.rb
|
@@ -0,0 +1,270 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
class GraphQLGenerator < Rails::Generators::NamedBase
|
5
|
+
source_root File.expand_path('templates', __dir__)
|
6
|
+
|
7
|
+
argument :fields, type: :array, default: [], banner: "field_name:field_type"
|
8
|
+
class_option :name, type: :string
|
9
|
+
class_option :input_type, type: :boolean
|
10
|
+
|
11
|
+
def create_service_file
|
12
|
+
@camelize_name = options[:name].camelize
|
13
|
+
@snake_case_name = options[:name].underscore
|
14
|
+
|
15
|
+
parse_variables
|
16
|
+
|
17
|
+
generate_migration
|
18
|
+
generate_type
|
19
|
+
generate_model
|
20
|
+
generate_create_mutation
|
21
|
+
generate_update_mutation
|
22
|
+
generate_delete_mutation
|
23
|
+
|
24
|
+
if options[:input_type].present? then generate_input_type end
|
25
|
+
|
26
|
+
print_note
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def generate_migration
|
32
|
+
migration_fields
|
33
|
+
prefix_name = Time.now.utc.to_s.delete_suffix(' UTC').delete('^0-9')
|
34
|
+
migration_name = @snake_case_name + ".rb"
|
35
|
+
migration_dir = "db/migrate/" + prefix_name + "_" + migration_name
|
36
|
+
|
37
|
+
template "migration_template.erb", migration_dir
|
38
|
+
end
|
39
|
+
|
40
|
+
def generate_model
|
41
|
+
generate_model_lines
|
42
|
+
filename = @snake_case_name + ".rb"
|
43
|
+
dir = "app/models/" + filename
|
44
|
+
|
45
|
+
template "model_template.erb", dir
|
46
|
+
end
|
47
|
+
|
48
|
+
def generate_type
|
49
|
+
generate_create_mutation_lines
|
50
|
+
filename = "create_" + @snake_case_name + ".rb"
|
51
|
+
dir = "app/graphql/mutations/" + filename
|
52
|
+
|
53
|
+
template "create_mutation_template.erb", dir
|
54
|
+
end
|
55
|
+
|
56
|
+
def generate_type
|
57
|
+
generate_type_fields
|
58
|
+
filename = @snake_case_name + "_type.rb"
|
59
|
+
dir = "app/graphql/types/" + filename
|
60
|
+
|
61
|
+
template "graphql_types/type_template.erb", dir
|
62
|
+
end
|
63
|
+
|
64
|
+
def generate_create_mutation
|
65
|
+
generate_create_mutation_lines
|
66
|
+
filename = @snake_case_name + ".rb"
|
67
|
+
dir = "app/graphql/mutations/create_" + filename
|
68
|
+
|
69
|
+
template "mutations/create_mutation_template.erb", dir
|
70
|
+
end
|
71
|
+
|
72
|
+
def generate_update_mutation
|
73
|
+
generate_update_mutation_lines
|
74
|
+
filename = @snake_case_name + ".rb"
|
75
|
+
dir = "app/graphql/mutations/update_" + filename
|
76
|
+
|
77
|
+
template "mutations/update_mutation_template.erb", dir
|
78
|
+
end
|
79
|
+
|
80
|
+
def generate_delete_mutation
|
81
|
+
filename = @snake_case_name + ".rb"
|
82
|
+
dir = "app/graphql/mutations/delete_" + filename
|
83
|
+
|
84
|
+
template "mutations/delete_mutation_template.erb", dir
|
85
|
+
end
|
86
|
+
|
87
|
+
def generate_input_type
|
88
|
+
filename = @snake_case_name + "_input_type.rb"
|
89
|
+
dir = "app/graphql/types/inputs/" + filename
|
90
|
+
|
91
|
+
template "graphql_types/input_type_template.erb", dir
|
92
|
+
end
|
93
|
+
|
94
|
+
def parse_variables
|
95
|
+
@parsed_fields =
|
96
|
+
fields.map{|field|
|
97
|
+
option = field.split(':')
|
98
|
+
name = option[0]
|
99
|
+
required = option[1].ends_with?('!')
|
100
|
+
type = handle_type(option[1])
|
101
|
+
array = array?(option[1])
|
102
|
+
reference = handle_reference(option, type)
|
103
|
+
if array then type = type.delete_suffix(']').delete_prefix('[') end
|
104
|
+
|
105
|
+
{name: name, type: type, required: required, array: array, reference: reference}
|
106
|
+
}
|
107
|
+
|
108
|
+
# print_array(@parsed_fields, "Parsed vars")
|
109
|
+
end
|
110
|
+
|
111
|
+
def generate_update_mutation_lines
|
112
|
+
@update_mutation_lines =
|
113
|
+
@parsed_fields.map{|field|
|
114
|
+
str = 'argument :'
|
115
|
+
if field[:reference].present? || field[:type] == 'references'
|
116
|
+
str = '# ' + str + field[:name].underscore + "s"
|
117
|
+
else
|
118
|
+
str += field[:name].underscore
|
119
|
+
end
|
120
|
+
|
121
|
+
str += ", "
|
122
|
+
|
123
|
+
type = cast_to_graphql(field)
|
124
|
+
|
125
|
+
if field[:reference].present? then type = field[:name].camelize + "InputType" end
|
126
|
+
if field[:array].present? then type = "[" + type + "]" end
|
127
|
+
str += type + ', required: false'
|
128
|
+
str
|
129
|
+
}
|
130
|
+
|
131
|
+
# print_array(@update_mutation_lines, "Update mutation lines")
|
132
|
+
end
|
133
|
+
|
134
|
+
def generate_create_mutation_lines
|
135
|
+
@create_mutation_lines =
|
136
|
+
@parsed_fields.map{|field|
|
137
|
+
str = 'argument :'
|
138
|
+
if field[:reference].present? || field[:type] == 'references'
|
139
|
+
str = '# ' + str + field[:name].underscore + "s"
|
140
|
+
else
|
141
|
+
str += field[:name].underscore
|
142
|
+
end
|
143
|
+
|
144
|
+
str += ", "
|
145
|
+
|
146
|
+
type = cast_to_graphql(field)
|
147
|
+
|
148
|
+
if field[:reference].present? then type = field[:name].camelize + "InputType" end
|
149
|
+
if field[:array].present? then type = "[" + type + "]" end
|
150
|
+
|
151
|
+
str += type
|
152
|
+
if field[:required].present?
|
153
|
+
str += ', required: true'
|
154
|
+
else
|
155
|
+
str += ', required: false'
|
156
|
+
end
|
157
|
+
str
|
158
|
+
}
|
159
|
+
|
160
|
+
# print_array(@create_mutation_lines, "CREATE mutation lines")
|
161
|
+
end
|
162
|
+
|
163
|
+
def generate_type_fields
|
164
|
+
@type_fields =
|
165
|
+
@parsed_fields.map{|field|
|
166
|
+
str = 'field :'
|
167
|
+
if field[:reference].present?
|
168
|
+
str += field[:name].underscore + "s"
|
169
|
+
else
|
170
|
+
str += field[:name].underscore
|
171
|
+
end
|
172
|
+
|
173
|
+
str += ", "
|
174
|
+
|
175
|
+
type = cast_to_graphql(field)
|
176
|
+
if field[:reference].present? || field[:type] == 'references' then type = field[:name].camelize + "Type" end
|
177
|
+
if field[:array].present? then type = "[" + type + "]" end
|
178
|
+
str += type
|
179
|
+
if field[:required].present? then str += ', null: false' end
|
180
|
+
str
|
181
|
+
}
|
182
|
+
|
183
|
+
# print_array(@type_fields, "Type fields")
|
184
|
+
end
|
185
|
+
|
186
|
+
def generate_model_lines
|
187
|
+
@model_lines =
|
188
|
+
@parsed_fields
|
189
|
+
.filter{|field| field[:type] == 'references'}
|
190
|
+
.map{|field|
|
191
|
+
str = 'has_many :'
|
192
|
+
if field[:reference].present?
|
193
|
+
str += field[:reference].underscore
|
194
|
+
end
|
195
|
+
|
196
|
+
str += ', dependent: :destroy'
|
197
|
+
str
|
198
|
+
}
|
199
|
+
|
200
|
+
# print_array(@model_lines, "Model lines")
|
201
|
+
end
|
202
|
+
|
203
|
+
def migration_fields
|
204
|
+
@migration_fields =
|
205
|
+
@parsed_fields.map{|field|
|
206
|
+
str = 't.' + field[:type] + ' :' + field[:name]
|
207
|
+
|
208
|
+
if field[:reference].present? then str += ", foreign_key: { to_table: :#{field[:reference] || field[:type]} }, type: :uuid" end
|
209
|
+
if field[:array].present? then str += ', array: true, default: []' end
|
210
|
+
if field[:required].present? then str += ', null: false' end
|
211
|
+
str
|
212
|
+
}
|
213
|
+
|
214
|
+
# print_array(@migration_fields, "Migration lines")
|
215
|
+
end
|
216
|
+
|
217
|
+
#
|
218
|
+
# Helpers
|
219
|
+
#
|
220
|
+
|
221
|
+
def array?(option)
|
222
|
+
option.delete_suffix('!').ends_with?(']')
|
223
|
+
end
|
224
|
+
|
225
|
+
def handle_type(option)
|
226
|
+
option = option.delete_suffix('!').delete_suffix(']')
|
227
|
+
if option.include?('int') then option = 'integer'
|
228
|
+
elsif option.include?('str') then option = 'string'
|
229
|
+
elsif option.include?('ref') then option = 'references'
|
230
|
+
elsif option.include?('bool') then option = 'boolean'
|
231
|
+
else
|
232
|
+
:nothing
|
233
|
+
end
|
234
|
+
option
|
235
|
+
end
|
236
|
+
|
237
|
+
def cast_to_graphql(field)
|
238
|
+
type = field[:type].camelize
|
239
|
+
|
240
|
+
if type == 'Datetime' then type = 'String'
|
241
|
+
elsif type == 'Json' then type = 'GraphQL::Types::JSON'
|
242
|
+
elsif type == 'Boolean' then type = 'GraphQL::Types::Boolean'
|
243
|
+
end
|
244
|
+
type
|
245
|
+
end
|
246
|
+
|
247
|
+
def handle_reference(options, type)
|
248
|
+
if not type == 'references'
|
249
|
+
return false
|
250
|
+
elsif options[2].present?
|
251
|
+
options[2]
|
252
|
+
else
|
253
|
+
options[0] + 's'
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
def print_array(array, name)
|
258
|
+
puts "\n " + name + "\n"
|
259
|
+
array.map{|f| puts "\n -> " + f.inspect}
|
260
|
+
end
|
261
|
+
|
262
|
+
def print_note
|
263
|
+
puts "\n\nSucces!"
|
264
|
+
puts "Add these lines to your app/graphql/types/mutation_type.rb\n\n"
|
265
|
+
puts "field :create_#{@snake_case_name}, mutation: mutations::Create#{@camelize_name}"
|
266
|
+
puts "field :update_#{@snake_case_name}, mutation: mutations::Update#{@camelize_name}"
|
267
|
+
puts "field :delete_#{@snake_case_name}, mutation: mutations::Delete#{@camelize_name}"
|
268
|
+
puts "\n"
|
269
|
+
end
|
270
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Mutations
|
2
|
+
class Create<%= @camelize_name %> <%= "<" %> BaseMutation
|
3
|
+
include Guardian
|
4
|
+
<% for field in @create_mutation_lines %><%=field%>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
type Types::<%= @camelize_name %>Type
|
8
|
+
|
9
|
+
def resolve(**params)
|
10
|
+
check_authentication!
|
11
|
+
create_<%= @snake_case_name %>(params)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def create_<%= @snake_case_name %>(params)
|
17
|
+
<%= "#{@snake_case_name} = #{@camelize_name}.new(params)" %>
|
18
|
+
|
19
|
+
if <%=@snake_case_name%>.save
|
20
|
+
<%=@snake_case_name%>
|
21
|
+
else
|
22
|
+
raise GraphQL::ExecutionError, "Invalid input: #{<%=@snake_case_name%>.errors.full_messages.join(', ')}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Mutations
|
2
|
+
class Delete<%= @camelize_name %> <%= "<" %> BaseMutation
|
3
|
+
include Guardian
|
4
|
+
argument :id, ID, required: true
|
5
|
+
|
6
|
+
type Types::<%= @camelize_name %>Type
|
7
|
+
|
8
|
+
def resolve(**params)
|
9
|
+
check_authentication!
|
10
|
+
delete_<%= @snake_case_name %>(params)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def delete_<%= @snake_case_name %>(params)
|
16
|
+
<%= "#{@snake_case_name} = #{@camelize_name}.find(params[:id])" %>
|
17
|
+
|
18
|
+
if <%=@snake_case_name%>.destroy
|
19
|
+
<%=@snake_case_name%>
|
20
|
+
else
|
21
|
+
raise GraphQL::ExecutionError, "Invalid input: #{<%=@snake_case_name%>.errors.full_messages.join(', ')}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Mutations
|
2
|
+
class Update<%= @camelize_name %> <%= "<" %> BaseMutation
|
3
|
+
include Guardian
|
4
|
+
argument :id, ID, required: true
|
5
|
+
<% for field in @update_mutation_lines %><%=field%>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
type Types::<%= @camelize_name %>Type
|
9
|
+
|
10
|
+
def resolve(**params)
|
11
|
+
check_authentication!
|
12
|
+
update_<%= @snake_case_name %>(params)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def update_<%= @snake_case_name %>(params)
|
18
|
+
<%= "#{@snake_case_name} = #{@camelize_name}.find(params[:id])" %>
|
19
|
+
|
20
|
+
if <%=@snake_case_name%>.update(params)
|
21
|
+
<%=@snake_case_name%>
|
22
|
+
else
|
23
|
+
raise GraphQL::ExecutionError, "Invalid input: #{<%=@snake_case_name%>.errors.full_messages.join(', ')}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module GraphQLGenerator
|
2
|
+
def self.root
|
3
|
+
File.dirname __dir__
|
4
|
+
end
|
5
|
+
|
6
|
+
class MyRailtie < Rails::Railtie
|
7
|
+
generator_path = GraphQLGenerator::root.+'/graphql_generator/generator/graphql_generator.rb'
|
8
|
+
|
9
|
+
config.app_generators do
|
10
|
+
require generator_path
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql-generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oleg Savinov
|
@@ -43,7 +43,28 @@ email:
|
|
43
43
|
executables: []
|
44
44
|
extensions: []
|
45
45
|
extra_rdoc_files: []
|
46
|
-
files:
|
46
|
+
files:
|
47
|
+
- Gemfile
|
48
|
+
- README.md
|
49
|
+
- Rakefile
|
50
|
+
- bin/console
|
51
|
+
- bin/setup
|
52
|
+
- graphql-generator-0.0.1.gem
|
53
|
+
- graphql-generator-0.0.2.gem
|
54
|
+
- graphql-generator-0.0.3.gem
|
55
|
+
- graphql_generator.gemspec
|
56
|
+
- lib/graphql_generator.rb
|
57
|
+
- lib/graphql_generator/generator/USAGE
|
58
|
+
- lib/graphql_generator/generator/graphql_generator.rb
|
59
|
+
- lib/graphql_generator/generator/templates/graphql_types/input_type_template.erb
|
60
|
+
- lib/graphql_generator/generator/templates/graphql_types/type_template.erb
|
61
|
+
- lib/graphql_generator/generator/templates/migration_template.erb
|
62
|
+
- lib/graphql_generator/generator/templates/model_template.erb
|
63
|
+
- lib/graphql_generator/generator/templates/mutations/create_mutation_template.erb
|
64
|
+
- lib/graphql_generator/generator/templates/mutations/delete_mutation_template.erb
|
65
|
+
- lib/graphql_generator/generator/templates/mutations/update_mutation_template.erb
|
66
|
+
- lib/graphql_generator/railtie.rb
|
67
|
+
- lib/graphql_generator/version.rb
|
47
68
|
homepage:
|
48
69
|
licenses: []
|
49
70
|
metadata: {}
|