souls 0.51.2 → 0.52.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -1
  3. data/exe/souls +4 -202
  4. data/lib/souls/api/generate/application.rb +97 -94
  5. data/lib/souls/api/generate/connection.rb +5 -4
  6. data/lib/souls/api/generate/edge.rb +5 -4
  7. data/lib/souls/api/generate/index.rb +0 -1
  8. data/lib/souls/api/generate/manager.rb +9 -7
  9. data/lib/souls/api/generate/model.rb +16 -18
  10. data/lib/souls/api/generate/mutation.rb +217 -218
  11. data/lib/souls/api/generate/policy.rb +5 -5
  12. data/lib/souls/api/generate/query.rb +51 -51
  13. data/lib/souls/api/generate/resolver.rb +115 -115
  14. data/lib/souls/api/generate/rspec_factory.rb +53 -53
  15. data/lib/souls/api/generate/rspec_model.rb +5 -5
  16. data/lib/souls/api/generate/rspec_mutation.rb +178 -178
  17. data/lib/souls/api/generate/rspec_policy.rb +5 -5
  18. data/lib/souls/api/generate/rspec_query.rb +111 -111
  19. data/lib/souls/api/generate/rspec_resolver.rb +163 -163
  20. data/lib/souls/api/generate/type.rb +66 -66
  21. data/lib/souls/api/index.rb +7 -4
  22. data/lib/souls/api/update/index.rb +15 -0
  23. data/lib/souls/api/update/mutation.rb +68 -64
  24. data/lib/souls/api/update/resolver.rb +59 -60
  25. data/lib/souls/api/update/rspec_factory.rb +40 -39
  26. data/lib/souls/api/update/rspec_mutation.rb +84 -83
  27. data/lib/souls/api/update/rspec_resolver.rb +70 -69
  28. data/lib/souls/api/update/type.rb +39 -38
  29. data/lib/souls/cli/console/index.rb +13 -1
  30. data/lib/souls/cli/create/index.rb +97 -93
  31. data/lib/souls/cli/db/index.rb +122 -1
  32. data/lib/souls/cli/docker/index.rb +30 -38
  33. data/lib/souls/cli/gcloud/compute/index.rb +100 -98
  34. data/lib/souls/cli/gcloud/iam/index.rb +84 -69
  35. data/lib/souls/cli/gcloud/index.rb +36 -35
  36. data/lib/souls/cli/gcloud/pubsub/subscriptions.rb +40 -27
  37. data/lib/souls/cli/gcloud/pubsub/topics.rb +16 -10
  38. data/lib/souls/cli/gcloud/run/index.rb +23 -17
  39. data/lib/souls/cli/gcloud/sql/index.rb +66 -47
  40. data/lib/souls/cli/index.rb +3 -20
  41. data/lib/souls/cli/init/index.rb +140 -140
  42. data/lib/souls/cli/release/release.rb +106 -105
  43. data/lib/souls/cli/server/index.rb +12 -1
  44. data/lib/souls/cli/sync/conf.rb +39 -38
  45. data/lib/souls/cli/sync/model.rb +19 -20
  46. data/lib/souls/cli/sync/pubsub.rb +69 -70
  47. data/lib/souls/cli/upgrade/gemfile.rb +108 -0
  48. data/lib/souls/cli/upgrade/index.rb +1 -1
  49. data/lib/souls/cli.rb +57 -0
  50. data/lib/souls/index.rb +1 -5
  51. data/lib/souls/version.rb +1 -1
  52. data/lib/souls/versions/.souls_api_version +1 -1
  53. data/lib/souls/versions/.souls_worker_version +1 -1
  54. data/lib/souls/worker/generate/index.rb +1 -1
  55. data/lib/souls/worker/generate/job.rb +45 -0
  56. data/lib/souls/worker/generate/mailer.rb +38 -43
  57. data/lib/souls/worker/index.rb +3 -1
  58. data/lib/souls.rb +2 -0
  59. metadata +19 -5
  60. data/lib/souls/api/generate/migration.rb +0 -51
  61. data/lib/souls/cli/upgrade/gem_update.rb +0 -107
  62. data/lib/souls/worker/generate/mutation.rb +0 -44
@@ -1,81 +1,81 @@
1
1
  module Souls
2
- module Api::Generate
3
- class << self
4
- ## Generate Type
5
- def create_type_head(class_name: "user")
6
- file_dir = "./app/graphql/types/"
7
- FileUtils.mkdir_p(file_dir) unless Dir.exist?(file_dir)
8
- file_path = "./app/graphql/types/#{class_name}_type.rb"
9
- File.open(file_path, "w") do |f|
10
- f.write(<<~TEXT)
11
- module Types
12
- class #{class_name.camelize}Type < BaseObject
13
- implements GraphQL::Types::Relay::Node
2
+ class Generate < Thor
3
+ desc "type [CLASS_NAME]", "Generate GraphQL Type from schema.rb"
4
+ def type(class_name)
5
+ singularized_class_name = class_name.singularize
6
+ file_path = "./app/graphql/types/#{singularized_class_name}_type.rb"
7
+ return "Type already exist! #{file_path}" if File.exist?(file_path)
14
8
 
15
- TEXT
16
- end
9
+ create_type_head(class_name: singularized_class_name)
10
+ create_type_params(class_name: singularized_class_name)
11
+ create_type_end(class_name: singularized_class_name)
12
+ puts(Paint % ["Created file! : %{white_text}", :green, { white_text: [file_path.to_s, :white] }])
13
+ file_path
14
+ rescue Thor::Error => e
15
+ raise(Thor::Error, e)
16
+ end
17
+
18
+ private
19
+
20
+ def create_type_head(class_name: "user")
21
+ file_dir = "./app/graphql/types/"
22
+ FileUtils.mkdir_p(file_dir) unless Dir.exist?(file_dir)
23
+ file_path = "./app/graphql/types/#{class_name}_type.rb"
24
+ File.open(file_path, "w") do |f|
25
+ f.write(<<~TEXT)
26
+ module Types
27
+ class #{class_name.camelize}Type < BaseObject
28
+ implements GraphQL::Types::Relay::Node
29
+
30
+ TEXT
17
31
  end
32
+ end
18
33
 
19
- def create_type_params(class_name: "user")
20
- file_path = "./app/graphql/types/#{class_name}_type.rb"
21
- path = "./db/schema.rb"
22
- @on = false
23
- File.open(file_path, "a") do |new_line|
24
- File.open(path, "r") do |f|
25
- f.each_line.with_index do |line, _i|
26
- if @on
27
- new_line.write("\n" && break) if line.include?("t.index") || line.strip == "end"
28
- field = "[String]" if line.include?("array: true")
29
- type, name = line.split(",")[0].gsub("\"", "").scan(/((?<=t\.).+(?=\s)) (.+)/)[0]
30
- field ||= Souls.type_check(type)
31
- case name
32
- when /$*_id\z/
33
- new_line.write(
34
- " field :#{name.gsub(
35
- '_id',
36
- ''
37
- )}, Types::#{name.gsub(
38
- '_id',
39
- ''
40
- ).singularize.camelize}Type, null: false\n"
41
- )
42
- else
43
- new_line.write(" field :#{name}, #{field}, null: true\n")
44
- end
45
- end
46
- if Souls.table_check(line: line, class_name: class_name)
47
- @on = true
48
- new_line.write(" global_id_field :id\n")
34
+ def create_type_params(class_name: "user")
35
+ file_path = "./app/graphql/types/#{class_name}_type.rb"
36
+ path = "./db/schema.rb"
37
+ @on = false
38
+ File.open(file_path, "a") do |new_line|
39
+ File.open(path, "r") do |f|
40
+ f.each_line.with_index do |line, _i|
41
+ if @on
42
+ new_line.write("\n" && break) if line.include?("t.index") || line.strip == "end"
43
+ field = "[String]" if line.include?("array: true")
44
+ type, name = line.split(",")[0].gsub("\"", "").scan(/((?<=t\.).+(?=\s)) (.+)/)[0]
45
+ field ||= Souls.type_check(type)
46
+ case name
47
+ when /$*_id\z/
48
+ new_line.write(
49
+ " field :#{name.gsub(
50
+ '_id',
51
+ ''
52
+ )}, Types::#{name.gsub(
53
+ '_id',
54
+ ''
55
+ ).singularize.camelize}Type, null: false\n"
56
+ )
57
+ else
58
+ new_line.write(" field :#{name}, #{field}, null: true\n")
49
59
  end
50
60
  end
61
+ if Souls.table_check(line: line, class_name: class_name)
62
+ @on = true
63
+ new_line.write(" global_id_field :id\n")
64
+ end
51
65
  end
52
66
  end
53
67
  end
68
+ end
54
69
 
55
- def create_type_end(class_name: "user")
56
- file_path = "./app/graphql/types/#{class_name}_type.rb"
57
- File.open(file_path, "a") do |f|
58
- f.write(<<~TEXT)
59
- end
70
+ def create_type_end(class_name: "user")
71
+ file_path = "./app/graphql/types/#{class_name}_type.rb"
72
+ File.open(file_path, "a") do |f|
73
+ f.write(<<~TEXT)
60
74
  end
61
- TEXT
62
- end
63
- file_path
64
- end
65
-
66
- def type(class_name: "user")
67
- singularized_class_name = class_name.singularize
68
- file_path = "./app/graphql/types/#{singularized_class_name}_type.rb"
69
- return "Type already exist! #{file_path}" if File.exist?(file_path)
70
-
71
- create_type_head(class_name: singularized_class_name)
72
- create_type_params(class_name: singularized_class_name)
73
- create_type_end(class_name: singularized_class_name)
74
- puts(Paint % ["Created file! : %{white_text}", :green, { white_text: [file_path.to_s, :white] }])
75
- file_path
76
- rescue StandardError => e
77
- raise(StandardError, e)
75
+ end
76
+ TEXT
78
77
  end
78
+ file_path
79
79
  end
80
80
  end
81
81
  end
@@ -1,10 +1,13 @@
1
1
  require_relative "./generate/index"
2
2
  require_relative "./update/index"
3
-
4
3
  module Souls
5
- module Api::Generate
6
- end
4
+ class API < Thor
5
+ desc "generate [COMMAND]", "souls api generate Commands"
6
+ subcommand "generate", Generate
7
+
8
+ desc "update [COMMAND]", "souls api update Commands"
9
+ subcommand "update", Update
7
10
 
8
- module Api::Update
11
+ map "g" => :generate
9
12
  end
10
13
  end
@@ -4,3 +4,18 @@ require_relative "./type"
4
4
  require_relative "./rspec_factory"
5
5
  require_relative "./rspec_mutation"
6
6
  require_relative "./rspec_resolver"
7
+
8
+ module Souls
9
+ class Update < Thor
10
+ desc "scaffold [CLASS_NAME]", "Update Scaffold Params"
11
+ def scaffold(_class_name)
12
+ invoke(:create_mutation)
13
+ invoke(:update_mutation)
14
+ invoke(:resolver)
15
+ invoke(:type)
16
+ invoke(:rspec_factory)
17
+ invoke(:rspec_mutation)
18
+ invoke(:rspec_resolver)
19
+ end
20
+ end
21
+ end
@@ -1,82 +1,86 @@
1
1
  module Souls
2
- module Api
3
- module Update
4
- class << self
5
- def create_mutation(class_name: "user")
6
- singularized_class_name = class_name.singularize.underscore
7
- new_cols = Souls.get_columns_num(class_name: singularized_class_name)
8
- dir_name = "./app/graphql/mutations/base/#{singularized_class_name}"
9
- new_file_path = "tmp/create_mutation.rb"
10
- file_path = "#{dir_name}/create_#{singularized_class_name}.rb"
11
- argument = false
12
- File.open(file_path) do |f|
13
- File.open(new_file_path, "w") do |new_line|
14
- f.each_line do |line|
15
- new_line.write(line)
16
- next unless line.include?("argument") && !argument
2
+ class Update < Thor
3
+ desc "create_mutation [CLASS_NAME]", "Update GraphQL Type from schema.rb"
4
+ def create_mutation(class_name)
5
+ singularized_class_name = class_name.singularize.underscore
6
+ new_cols = Souls.get_columns_num(class_name: singularized_class_name)
7
+ dir_name = "./app/graphql/mutations/base/#{singularized_class_name}"
8
+ new_file_path = "tmp/create_mutation.rb"
9
+ file_path = "#{dir_name}/create_#{singularized_class_name}.rb"
10
+ argument = false
11
+ File.open(file_path) do |f|
12
+ File.open(new_file_path, "w") do |new_line|
13
+ f.each_line do |line|
14
+ new_line.write(line)
15
+ next unless line.include?("argument") && !argument
17
16
 
18
- new_cols.each do |col|
19
- type = Souls.type_check(col[:type])
20
- type = "[#{type}]" if col[:array]
21
- args = check_mutation_argument(class_name: class_name)
22
- next if args.include?(col[:column_name])
23
- next if col[:column_name] == "created_at" || col[:column_name] == "updated_at"
17
+ new_cols.each do |col|
18
+ type = Souls.type_check(col[:type])
19
+ type = "[#{type}]" if col[:array]
20
+ args = check_mutation_argument(class_name: class_name)
21
+ next if args.include?(col[:column_name])
22
+ next if col[:column_name] == "created_at" || col[:column_name] == "updated_at"
24
23
 
25
- new_line.write(" argument :#{col[:column_name]}, #{type}, required: false\n")
26
- end
27
- argument = true
28
- end
24
+ new_line.write(" argument :#{col[:column_name]}, #{type}, required: false\n")
29
25
  end
26
+ argument = true
30
27
  end
31
- FileUtils.rm(file_path)
32
- FileUtils.mv(new_file_path, file_path)
33
- puts(Paint % ["Updated file! : %{white_text}", :green, { white_text: [file_path.to_s, :white] }])
34
28
  end
29
+ end
30
+ FileUtils.rm(file_path)
31
+ FileUtils.mv(new_file_path, file_path)
32
+ puts(Paint % ["Updated file! : %{white_text}", :green, { white_text: [file_path.to_s, :white] }])
33
+ rescue Thor::Error => e
34
+ raise(Thor::Error, e)
35
+ end
35
36
 
36
- def update_mutation(class_name: "user")
37
- singularized_class_name = class_name.singularize.underscore
38
- new_cols = Souls.get_columns_num(class_name: singularized_class_name)
39
- dir_name = "./app/graphql/mutations/base/#{singularized_class_name}"
40
- new_file_path = "tmp/update_mutation.rb"
41
- file_path = "#{dir_name}/update_#{singularized_class_name}.rb"
42
- argument = false
43
- File.open(file_path) do |f|
44
- File.open(new_file_path, "w") do |new_line|
45
- f.each_line do |line|
46
- new_line.write(line)
47
- next unless line.include?("argument") && !argument
37
+ desc "update_mutation [CLASS_NAME]", "Update GraphQL Type from schema.rb"
38
+ def update_mutation(class_name)
39
+ singularized_class_name = class_name.singularize.underscore
40
+ new_cols = Souls.get_columns_num(class_name: singularized_class_name)
41
+ dir_name = "./app/graphql/mutations/base/#{singularized_class_name}"
42
+ new_file_path = "tmp/update_mutation.rb"
43
+ file_path = "#{dir_name}/update_#{singularized_class_name}.rb"
44
+ argument = false
45
+ File.open(file_path) do |f|
46
+ File.open(new_file_path, "w") do |new_line|
47
+ f.each_line do |line|
48
+ new_line.write(line)
49
+ next unless line.include?("argument") && !argument
48
50
 
49
- new_cols.each do |col|
50
- type = Souls.type_check(col[:type])
51
- type = "[#{type}]" if col[:array]
52
- args = check_mutation_argument(class_name: class_name, action: "update")
53
- next if args.include?(col[:column_name])
54
- next if col[:column_name] == "created_at" || col[:column_name] == "updated_at"
51
+ new_cols.each do |col|
52
+ type = Souls.type_check(col[:type])
53
+ type = "[#{type}]" if col[:array]
54
+ args = check_mutation_argument(class_name: class_name, action: "update")
55
+ next if args.include?(col[:column_name])
56
+ next if col[:column_name] == "created_at" || col[:column_name] == "updated_at"
55
57
 
56
- new_line.write(" argument :#{col[:column_name]}, #{type}, required: false\n")
57
- end
58
- argument = true
59
- end
58
+ new_line.write(" argument :#{col[:column_name]}, #{type}, required: false\n")
60
59
  end
60
+ argument = true
61
61
  end
62
- FileUtils.rm(file_path)
63
- FileUtils.mv(new_file_path, file_path)
64
- puts(Paint % ["Updated file! : %{white_text}", :green, { white_text: [file_path.to_s, :white] }])
65
62
  end
63
+ end
64
+ FileUtils.rm(file_path)
65
+ FileUtils.mv(new_file_path, file_path)
66
+ puts(Paint % ["Updated file! : %{white_text}", :green, { white_text: [file_path.to_s, :white] }])
67
+ rescue Thor::Error => e
68
+ raise(Thor::Error, e)
69
+ end
66
70
 
67
- def check_mutation_argument(class_name: "user", action: "create")
68
- singularized_class_name = class_name.singularize.underscore
69
- dir_name = "./app/graphql/mutations/base/#{singularized_class_name}"
70
- file_path = "#{dir_name}/#{action}_#{singularized_class_name}.rb"
71
- args = []
72
- File.open(file_path) do |f|
73
- f.each_line do |line|
74
- args << line.split(",")[0].gsub("argument :", "").strip.underscore if line.include?("argument")
75
- end
76
- end
77
- args
71
+ private
72
+
73
+ def check_mutation_argument(class_name: "user", action: "create")
74
+ singularized_class_name = class_name.singularize.underscore
75
+ dir_name = "./app/graphql/mutations/base/#{singularized_class_name}"
76
+ file_path = "#{dir_name}/#{action}_#{singularized_class_name}.rb"
77
+ args = []
78
+ File.open(file_path) do |f|
79
+ f.each_line do |line|
80
+ args << line.split(",")[0].gsub("argument :", "").strip.underscore if line.include?("argument")
78
81
  end
79
82
  end
83
+ args
80
84
  end
81
85
  end
82
86
  end
@@ -1,74 +1,73 @@
1
1
  module Souls
2
- module Api
3
- module Update
4
- class << self
5
- def resolver(class_name: "user")
6
- singularized_class_name = class_name.singularize.underscore
7
- new_cols = Souls.get_columns_num(class_name: singularized_class_name)
8
- dir_name = "./app/graphql/resolvers"
9
- new_file_path = "tmp/update_resolver.rb"
10
- file_path = "#{dir_name}/#{singularized_class_name}_search.rb"
11
- args = check_resolver_argument(class_name: class_name)
12
- scope_args = check_resolver_argument(class_name: class_name, action: "scope")
13
- argument = false
14
- scope = false
15
- File.open(file_path) do |f|
16
- File.open(new_file_path, "w") do |new_line|
17
- f.each_line do |line|
18
- new_line.write(line)
19
- if line.include?("argument") && !argument
20
- new_cols.each do |col|
21
- type = Souls.type_check(col[:type])
22
- type = "[#{type}]" if col[:array]
23
- add_line = " argument :#{col[:column_name]}, #{type}, required: false\n"
24
- new_line.write(add_line) unless args.include?(col[:column_name])
25
- end
26
- argument = true
27
- elsif line.include?("scope = ::") && !scope
28
- new_cols.each do |col|
29
- type = Souls.type_check(col[:type])
30
- type = "[#{type}]" if col[:array]
2
+ class Update < Thor
3
+ desc "resolver [CLASS_NAME]", "Update GraphQL Type from schema.rb"
4
+ def resolver(class_name)
5
+ singularized_class_name = class_name.singularize.underscore
6
+ new_cols = Souls.get_columns_num(class_name: singularized_class_name)
7
+ dir_name = "./app/graphql/resolvers"
8
+ new_file_path = "tmp/update_resolver.rb"
9
+ file_path = "#{dir_name}/#{singularized_class_name}_search.rb"
10
+ args = check_resolver_argument(class_name: class_name)
11
+ scope_args = check_resolver_argument(class_name: class_name, action: "scope")
12
+ argument = false
13
+ scope = false
14
+ File.open(file_path) do |f|
15
+ File.open(new_file_path, "w") do |new_line|
16
+ f.each_line do |line|
17
+ new_line.write(line)
18
+ if line.include?("argument") && !argument
19
+ new_cols.each do |col|
20
+ type = Souls.type_check(col[:type])
21
+ type = "[#{type}]" if col[:array]
22
+ add_line = " argument :#{col[:column_name]}, #{type}, required: false\n"
23
+ new_line.write(add_line) unless args.include?(col[:column_name])
24
+ end
25
+ argument = true
26
+ elsif line.include?("scope = ::") && !scope
27
+ new_cols.each do |col|
28
+ type = Souls.type_check(col[:type])
29
+ type = "[#{type}]" if col[:array]
31
30
 
32
- if type.include?("[")
33
- add_line = " scope = scope.where('#{col[:column_name]} @> ARRAY[?]::#{col[:type]}[]', value[:#{col[:column_name]}]) if value[:#{col[:column_name]}]\n"
34
- else
35
- add_line = " scope = scope.where(#{col[:column_name]}: value[:#{col[:column_name]}]) if value[:#{col[:column_name]}]\n"
36
- end
37
- new_line.write(add_line) unless scope_args.include?(col[:column_name])
38
- end
39
- scope = true
31
+ if type.include?("[")
32
+ add_line = " scope = scope.where('#{col[:column_name]} @> ARRAY[?]::#{col[:type]}[]', value[:#{col[:column_name]}]) if value[:#{col[:column_name]}]\n"
33
+ else
34
+ add_line = " scope = scope.where(#{col[:column_name]}: value[:#{col[:column_name]}]) if value[:#{col[:column_name]}]\n"
40
35
  end
36
+ new_line.write(add_line) unless scope_args.include?(col[:column_name])
41
37
  end
38
+ scope = true
42
39
  end
43
40
  end
44
- FileUtils.rm(file_path)
45
- FileUtils.mv(new_file_path, file_path)
46
- puts(Paint % ["Updated file! : %{white_text}", :green, { white_text: [file_path.to_s, :white] }])
47
- rescue StandardError => e
48
- p(e)
49
41
  end
42
+ end
43
+ FileUtils.rm(file_path)
44
+ FileUtils.mv(new_file_path, file_path)
45
+ puts(Paint % ["Updated file! : %{white_text}", :green, { white_text: [file_path.to_s, :white] }])
46
+ rescue Thor::Error => e
47
+ raise(Thor::Error, e)
48
+ end
50
49
 
51
- def check_resolver_argument(class_name: "user", action: "argument")
52
- singularized_class_name = class_name.singularize.underscore
53
- dir_name = "./app/graphql/resolvers"
54
- file_path = "#{dir_name}/#{singularized_class_name}_search.rb"
55
- args = []
56
- File.open(file_path) do |f|
57
- f.each_line do |line|
58
- if action == "scope" && line.include?("scope = scope.where")
59
- args << if line.include?("is_deleted")
60
- "is_deleted"
61
- else
62
- line.to_s.match(/if value\[:(.+)\]/)[1].underscore
63
- end
64
- elsif action == "argument" && line.include?("argument")
65
- args << line.split(",")[0].gsub("argument :", "").strip.underscore
66
- end
67
- end
50
+ private
51
+
52
+ def check_resolver_argument(class_name: "user", action: "argument")
53
+ singularized_class_name = class_name.singularize.underscore
54
+ dir_name = "./app/graphql/resolvers"
55
+ file_path = "#{dir_name}/#{singularized_class_name}_search.rb"
56
+ args = []
57
+ File.open(file_path) do |f|
58
+ f.each_line do |line|
59
+ if action == "scope" && line.include?("scope = scope.where")
60
+ args << if line.include?("is_deleted")
61
+ "is_deleted"
62
+ else
63
+ line.to_s.match(/if value\[:(.+)\]/)[1].underscore
64
+ end
65
+ elsif action == "argument" && line.include?("argument")
66
+ args << line.split(",")[0].gsub("argument :", "").strip.underscore
68
67
  end
69
- args
70
68
  end
71
69
  end
70
+ args
72
71
  end
73
72
  end
74
73
  end