graphql-generator 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 809e7405e2236351ec92df7e8a914c0c7fd2e01854554a8a698497419f8cbd4b
4
- data.tar.gz: 7f44786ee31e007b4bf577e56c04bb04a33a2de48fd90e438b56e23ea6765c9e
3
+ metadata.gz: 9ad705835188a2c3d95aec1bbedd3ab0b57b1c4ff8b468f25b830008e1c8de2c
4
+ data.tar.gz: 765a5b79b7607850671297269942fe215906db8477d5bace53dae338e0d860ac
5
5
  SHA512:
6
- metadata.gz: 87b1d8c74f3f8694341dca78ea964f6afd0113f294b31f0a559ef3567f12ce84dd27db32c143df70919ec8bf2cc9175b406f1a45703c69bd729c2c7af30691e4
7
- data.tar.gz: d5e108000fc342f306ff5e029b2239bb44233467b5330254d03b8f60681dd47f63013dd4dd84c83fffe457e4725298561f121f34df7d39a95b97d20adeef35c4
6
+ metadata.gz: ec6bf6234ffec9e6c3f2b4289d2205cd20c6106863bece3eb7b0688694ba8161c605cf1009303c915de8272ef78bcd10efb43587a539c9b2db77c081eb71bd91
7
+ data.tar.gz: ee55a5e45ef8cc6b58b0afb50d59dc06600d94a62ed86fde5d01ce6327bc3201d5880fd025c526987204e6cddb6b3a95b949ddfa114ecea8a518564e7e4938f1
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in matas_service_generator.gemspec
6
+ gemspec
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
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
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
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
Binary file
@@ -0,0 +1,24 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "graphql-generator"
6
+ spec.version = "0.0.2"
7
+ spec.authors = ["Oleg Savinov"]
8
+
9
+ spec.summary = %q{Creates GraphQL generator}
10
+ spec.description = %q{Creates GraphQL generator}
11
+
12
+
13
+ # Specify which files should be added to the gem when it is released.
14
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
15
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
16
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ end
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.16"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+ 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,4 @@
1
+ class Types::Inputs::<%= @camelize_name %>InputType <%= "<" %> Types::BaseInputObject
2
+ <% for field in @update_mutation_lines %><%=field%>
3
+ <% end %>
4
+ end
@@ -0,0 +1,10 @@
1
+ <%# TEMPLATE TYPE %>
2
+ module Types
3
+ class <%= @camelize_name %>Type <%= "<" %> Types::BaseObject
4
+ <% for field in @type_fields %><%=field%>
5
+ <% end %>
6
+
7
+ field :created_at, String, null: true
8
+ field :updated_at, String, null: true
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class <%= @camelize_name %> <%= "<" %> ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :<%= @snake_case_name + "s" %>, id: :uuid do |t|
4
+ <% for field in @migration_fields %><%=field%>
5
+ <% end %>
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ class <%= @camelize_name %> <%= "<" %> ApplicationRecord
2
+ <%for field in @model_lines %><%=field%>
3
+ <% end %>
4
+ 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/graph_ql_generator.rb'
8
+
9
+ config.app_generators do
10
+ require generator_path
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module GraphQLGenerator
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,5 @@
1
+ require "graphql_generator/version"
2
+ require 'graphql_generator/railtie' if defined?(Rails)
3
+
4
+ module GraphQLGenerator
5
+ 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.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleg Savinov
@@ -43,7 +43,26 @@ 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.gemspec
54
+ - lib/graphql_generator.rb
55
+ - lib/graphql_generator/generator/USAGE
56
+ - lib/graphql_generator/generator/graph_ql_generator.rb
57
+ - lib/graphql_generator/generator/templates/graphql_types/input_type_template.erb
58
+ - lib/graphql_generator/generator/templates/graphql_types/type_template.erb
59
+ - lib/graphql_generator/generator/templates/migration_template.erb
60
+ - lib/graphql_generator/generator/templates/model_template.erb
61
+ - lib/graphql_generator/generator/templates/mutations/create_mutation_template.erb
62
+ - lib/graphql_generator/generator/templates/mutations/delete_mutation_template.erb
63
+ - lib/graphql_generator/generator/templates/mutations/update_mutation_template.erb
64
+ - lib/graphql_generator/railtie.rb
65
+ - lib/graphql_generator/version.rb
47
66
  homepage:
48
67
  licenses: []
49
68
  metadata: {}