kanji-web 0.1.0
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 +7 -0
- data/LICENSE +21 -0
- data/Rakefile +1 -0
- data/bin/kanji +6 -0
- data/lib/kanji.rb +5 -0
- data/lib/kanji/application.rb +37 -0
- data/lib/kanji/cli.rb +36 -0
- data/lib/kanji/cli/generate.rb +13 -0
- data/lib/kanji/container.rb +12 -0
- data/lib/kanji/errors.rb +10 -0
- data/lib/kanji/generate.rb +48 -0
- data/lib/kanji/generators/abstract_generator.rb +50 -0
- data/lib/kanji/generators/project.rb +155 -0
- data/lib/kanji/generators/type.rb +110 -0
- data/lib/kanji/graph.rb +1 -0
- data/lib/kanji/graph/coerce_type.rb +66 -0
- data/lib/kanji/graph/container.rb +18 -0
- data/lib/kanji/graph/helpers.rb +27 -0
- data/lib/kanji/graph/import.rb +8 -0
- data/lib/kanji/graph/query.rb +16 -0
- data/lib/kanji/graph/register_mutation.rb +43 -0
- data/lib/kanji/graph/register_object.rb +40 -0
- data/lib/kanji/graph/schema.rb +17 -0
- data/lib/kanji/import.rb +5 -0
- data/lib/kanji/instance_define.rb +11 -0
- data/lib/kanji/logger.rb +10 -0
- data/lib/kanji/repository.rb +53 -0
- data/lib/kanji/templates/.gitignore +11 -0
- data/lib/kanji/templates/.keep +0 -0
- data/lib/kanji/templates/.rspec +2 -0
- data/lib/kanji/templates/Gemfile +14 -0
- data/lib/kanji/templates/README.md.tt +12 -0
- data/lib/kanji/templates/Rakefile.tt +113 -0
- data/lib/kanji/templates/app/mutation_type.rb.tt +14 -0
- data/lib/kanji/templates/app/query_type.rb.tt +13 -0
- data/lib/kanji/templates/app/repositories/repo.rb.tt +7 -0
- data/lib/kanji/templates/app/schema.rb.tt +21 -0
- data/lib/kanji/templates/app/types.rb.tt +5 -0
- data/lib/kanji/templates/app/types/type.rb.tt +26 -0
- data/lib/kanji/templates/app/views/graphiql.html.erb +24 -0
- data/lib/kanji/templates/bin/console.tt +7 -0
- data/lib/kanji/templates/bin/setup +7 -0
- data/lib/kanji/templates/config.ru.tt +2 -0
- data/lib/kanji/templates/db/sample_data.rb +1 -0
- data/lib/kanji/templates/db/seed.rb +1 -0
- data/lib/kanji/templates/migration.rb.tt +10 -0
- data/lib/kanji/templates/spec/db_spec_helper.rb.tt +23 -0
- data/lib/kanji/templates/spec/factories/example.rb +9 -0
- data/lib/kanji/templates/spec/spec_helper.rb +61 -0
- data/lib/kanji/templates/spec/support/db/factory.rb +8 -0
- data/lib/kanji/templates/spec/support/db/helpers.rb.tt +13 -0
- data/lib/kanji/templates/system/boot.rb.tt +13 -0
- data/lib/kanji/templates/system/boot/graph.rb.tt +11 -0
- data/lib/kanji/templates/system/boot/monitor.rb.tt +9 -0
- data/lib/kanji/templates/system/boot/repos.rb.tt +23 -0
- data/lib/kanji/templates/system/boot/rom.rb.tt +37 -0
- data/lib/kanji/templates/system/boot/settings.rb.tt +10 -0
- data/lib/kanji/templates/system/project/application.rb.tt +35 -0
- data/lib/kanji/templates/system/project/container.rb.tt +13 -0
- data/lib/kanji/templates/system/project/import.rb.tt +5 -0
- data/lib/kanji/templates/system/project/settings.rb.tt +8 -0
- data/lib/kanji/type.rb +62 -0
- data/lib/kanji/type/argument.rb +12 -0
- data/lib/kanji/type/attribute.rb +14 -0
- data/lib/kanji/type/attribute_definer.rb +33 -0
- data/lib/kanji/type/class_interface.rb +156 -0
- data/lib/kanji/type/mutation.rb +13 -0
- data/lib/kanji/type/mutation_definer.rb +43 -0
- data/lib/kanji/types.rb +11 -0
- data/lib/kanji/types/callable.rb +30 -0
- data/lib/kanji/types/type_interface.rb +43 -0
- data/lib/kanji/version.rb +3 -0
- metadata +538 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 864b99448c021a5a6e386c1be615540b1a0094bb
|
|
4
|
+
data.tar.gz: 11fcc22cf234333a3ffb229a71483cebb0233d84
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 109cb177d81512bef482275367e962ce5b04715bb7737ee9e9c2db7c86e4afacf26d9c691d8088ce29171ebc28d1a27e9e3c2fbca82d8b48c8d2818703b73ac6
|
|
7
|
+
data.tar.gz: 36d8b79e6d993098a966ab3d3aaaba29aa90cb146802bcf8876acaa06a4d5c65b6714d716ad805c616e704e83239fa2bf35554ec3824376a8e228c311c74a100
|
data/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2016 Darin Haener
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/Rakefile
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Dir.glob('lib/tasks/*.rake').each { |r| load r }
|
data/bin/kanji
ADDED
data/lib/kanji.rb
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require "roda"
|
|
2
|
+
require "roda/plugins/flow"
|
|
3
|
+
require "dry-configurable"
|
|
4
|
+
|
|
5
|
+
module Kanji
|
|
6
|
+
class Application < ::Roda
|
|
7
|
+
extend Dry::Configurable
|
|
8
|
+
|
|
9
|
+
setting :container, reader: true
|
|
10
|
+
|
|
11
|
+
plugin :render, views: "app/views"
|
|
12
|
+
plugin :error_handler
|
|
13
|
+
plugin :flow
|
|
14
|
+
|
|
15
|
+
def self.configure(&block)
|
|
16
|
+
super.tap do
|
|
17
|
+
use(container[:rack_monitor]) if container.config.listeners
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.resolve(name)
|
|
22
|
+
container[name]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.[](name)
|
|
26
|
+
container[name]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.root
|
|
30
|
+
container.config.root
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def notifications
|
|
34
|
+
self.class[:notifications]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
data/lib/kanji/cli.rb
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require "thor"
|
|
2
|
+
|
|
3
|
+
module Kanji
|
|
4
|
+
class CLI < Thor
|
|
5
|
+
desc "new APP", "Generate a new Kanji project"
|
|
6
|
+
def new(app_name)
|
|
7
|
+
require "kanji/generators/project"
|
|
8
|
+
Generators::Project.new(app_name).call
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
map "n" => "new"
|
|
12
|
+
|
|
13
|
+
desc "generate GENERATOR", "Generate a new item for this project"
|
|
14
|
+
require "kanji/cli/generate"
|
|
15
|
+
subcommand "generate", CLI::Generate
|
|
16
|
+
|
|
17
|
+
map "g" => "generate"
|
|
18
|
+
|
|
19
|
+
desc "server", "Start the application server"
|
|
20
|
+
def server
|
|
21
|
+
`shotgun config.ru > stdout`
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
map "s" => "server"
|
|
25
|
+
|
|
26
|
+
desc "console", "Open up the application console"
|
|
27
|
+
def console
|
|
28
|
+
require "bundler/setup"
|
|
29
|
+
require "dry/web/console"
|
|
30
|
+
require_relative "#{Dir.pwd}/system/boot"
|
|
31
|
+
Dry::Web::Console.start
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
map "c" => "console"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require "thor"
|
|
2
|
+
|
|
3
|
+
module Kanji
|
|
4
|
+
class CLI < Thor
|
|
5
|
+
class Generate < Thor
|
|
6
|
+
desc "type NAME ATTRIBUTES", "Generate a new type and all of it's dependencies"
|
|
7
|
+
def type(name, *attributes)
|
|
8
|
+
require "kanji/generators/type"
|
|
9
|
+
Generators::Type.new(name, attributes).call
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require "dry/system/container"
|
|
2
|
+
require "kanji/graph/container"
|
|
3
|
+
|
|
4
|
+
module Kanji
|
|
5
|
+
class Container < Dry::System::Container
|
|
6
|
+
configure do |config|
|
|
7
|
+
config.root = Pathname.new("./")
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
load_paths!("lib/kanji/type", "lib/kanji/graph")
|
|
11
|
+
end
|
|
12
|
+
end
|
data/lib/kanji/errors.rb
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require "pathname"
|
|
2
|
+
require "thor"
|
|
3
|
+
|
|
4
|
+
module Kanji
|
|
5
|
+
class Generate
|
|
6
|
+
TEMPLATES_DIR = "templates".freeze
|
|
7
|
+
SOURCE_DIR = Pathname(__FILE__).dirname.join(TEMPLATES_DIR)
|
|
8
|
+
|
|
9
|
+
attr_reader :target_dir, :template_scope, :template_files, :processor
|
|
10
|
+
|
|
11
|
+
def initialize(target_dir, template_scope)
|
|
12
|
+
@target_dir = target_dir
|
|
13
|
+
@template_scope = template_scope
|
|
14
|
+
@template_files = Dir[SOURCE_DIR.join('**/{.,}*')]
|
|
15
|
+
|
|
16
|
+
@processor = Class.new(Thor) do
|
|
17
|
+
include Thor::Actions
|
|
18
|
+
end.new
|
|
19
|
+
@processor.class.source_root SOURCE_DIR
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def call(source, target)
|
|
23
|
+
source = Pathname(source)
|
|
24
|
+
aboslute_source_path = source.expand_path(SOURCE_DIR)
|
|
25
|
+
target_file = get_target_file(target)
|
|
26
|
+
template_file = template_files.find { |f| f == aboslute_source_path.to_s } or raise "missing template file +#{source}+"
|
|
27
|
+
template_file = Pathname(template_file)
|
|
28
|
+
|
|
29
|
+
processor.template template_file, target_file, template_scope
|
|
30
|
+
|
|
31
|
+
create_executable(target_file) if executable?(template_file)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def get_target_file(target)
|
|
37
|
+
Pathname.getwd.join(target_dir, target)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def create_executable(file)
|
|
41
|
+
FileUtils.chmod "a+x", file
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def executable?(file)
|
|
45
|
+
file.file? && file.executable?
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require "kanji/generate"
|
|
2
|
+
require "dry/core/inflector"
|
|
3
|
+
|
|
4
|
+
module Kanji
|
|
5
|
+
module Generators
|
|
6
|
+
class AbstractGenerator
|
|
7
|
+
def initialize(target_dir)
|
|
8
|
+
@target_dir = target_dir
|
|
9
|
+
@templates = []
|
|
10
|
+
populate_templates
|
|
11
|
+
@templates.freeze
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def call
|
|
15
|
+
templates.each do |source, target|
|
|
16
|
+
generator.(source, target)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
post_process_callback
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
attr_reader :target_dir, :templates
|
|
24
|
+
|
|
25
|
+
def populate_templates
|
|
26
|
+
fail NotImplementedError
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def post_process_callback
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def add_template(source, target)
|
|
34
|
+
templates << [source, target]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def generator
|
|
38
|
+
@generator ||= Generate.new(destination, template_scope)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def destination
|
|
42
|
+
fail NotImplementedError
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def template_scope
|
|
46
|
+
fail NotImplementedError
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
require "kanji/generate"
|
|
2
|
+
require "kanji/generators/abstract_generator"
|
|
3
|
+
require "dry/core/inflector"
|
|
4
|
+
|
|
5
|
+
module Kanji
|
|
6
|
+
module Generators
|
|
7
|
+
class Project < AbstractGenerator
|
|
8
|
+
def initialize(app_name, options = {})
|
|
9
|
+
@app_name = app_name
|
|
10
|
+
super(underscored_project_name)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def populate_templates
|
|
14
|
+
add_bin
|
|
15
|
+
add_config
|
|
16
|
+
add_db
|
|
17
|
+
add_log
|
|
18
|
+
add_spec
|
|
19
|
+
add_app
|
|
20
|
+
add_lib
|
|
21
|
+
add_system
|
|
22
|
+
add_config_files
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
attr_reader :app_name
|
|
27
|
+
|
|
28
|
+
def post_process_callback
|
|
29
|
+
message = <<-TEXT
|
|
30
|
+
\n
|
|
31
|
+
You're now ready to start writing your Kanji app! Congratulations!
|
|
32
|
+
Because this is a data driven API application, you can't do much
|
|
33
|
+
with it until you create some types! Get started by using a generator:
|
|
34
|
+
`kanji g type User email:string`
|
|
35
|
+
|
|
36
|
+
This will generate a type and some mutations for you! Then you can:
|
|
37
|
+
`rake db:create && rake db:migrate`
|
|
38
|
+
|
|
39
|
+
After that open up `app/query_type.rb` and add a field to your root query
|
|
40
|
+
type:
|
|
41
|
+
|
|
42
|
+
field :users do
|
|
43
|
+
type -> { types[Types::User[:graphql_type]] }
|
|
44
|
+
description "All of the users for this app"
|
|
45
|
+
|
|
46
|
+
resolve -> (obj, args, ctx) { Types::User[:repo].all }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
Now open up `app/schema.rb` and uncomment the lines that add the
|
|
50
|
+
query and mutation types.
|
|
51
|
+
|
|
52
|
+
Start your server: `kanji s` and visit `localhost:9393/graphiql` and
|
|
53
|
+
start exploring!
|
|
54
|
+
TEXT
|
|
55
|
+
|
|
56
|
+
generator.processor.say(message, :cyan)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def destination
|
|
60
|
+
underscored_project_name
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def template_scope
|
|
64
|
+
{
|
|
65
|
+
underscored_project_name: underscored_project_name,
|
|
66
|
+
camel_cased_app_name: camel_cased_app_name
|
|
67
|
+
}
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def underscored_project_name
|
|
71
|
+
Dry::Core::Inflector.underscore(app_name)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def camel_cased_app_name
|
|
75
|
+
Dry::Core::Inflector.camelize(app_name)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def add_bin
|
|
79
|
+
add_template("bin/console.tt", "bin/console")
|
|
80
|
+
add_template("bin/setup", "bin/setup")
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def add_config
|
|
84
|
+
add_template(".env.tt", ".env")
|
|
85
|
+
add_template(".env.test.tt", ".env.test")
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def add_db
|
|
89
|
+
add_template("db/sample_data.rb", "db/sample_data.rb")
|
|
90
|
+
add_template("db/seed.rb", "db/seed.rb")
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def add_app
|
|
94
|
+
add_template("app/types.rb.tt", "app/types.rb")
|
|
95
|
+
add_template("app/schema.rb.tt", "app/schema.rb")
|
|
96
|
+
add_template("app/query_type.rb.tt", "app/query_type.rb")
|
|
97
|
+
add_template("app/mutation_type.rb.tt", "app/mutation_type.rb")
|
|
98
|
+
add_template("app/views/graphiql.html.erb", "app/views/graphiql.html.erb")
|
|
99
|
+
add_template(".keep", "app/repositories/.keep")
|
|
100
|
+
add_template(".keep", "app/types/.keep")
|
|
101
|
+
add_template(".keep", "client/.keep")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def add_lib
|
|
105
|
+
add_template(".keep", "lib/.keep")
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def add_log
|
|
109
|
+
add_template(".keep", "log/.keep")
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def add_spec
|
|
113
|
+
add_template(".rspec", ".rspec")
|
|
114
|
+
|
|
115
|
+
# Base spec helpers
|
|
116
|
+
add_template("spec/db_spec_helper.rb.tt", "spec/db_spec_helper.rb")
|
|
117
|
+
add_template("spec/spec_helper.rb", "spec/spec_helper.rb")
|
|
118
|
+
|
|
119
|
+
# DB support
|
|
120
|
+
add_template("spec/support/db/factory.rb", "spec/support/db/factory.rb")
|
|
121
|
+
add_template("spec/support/db/helpers.rb.tt", "spec/support/db/helpers.rb")
|
|
122
|
+
add_template("spec/factories/example.rb", "spec/factories/example.rb")
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def add_system
|
|
126
|
+
add_system_lib
|
|
127
|
+
add_system_boot
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def add_system_lib
|
|
131
|
+
add_template("system/project/container.rb.tt", "system/#{underscored_project_name}/container.rb")
|
|
132
|
+
add_template("system/project/import.rb.tt", "system/#{underscored_project_name}/import.rb")
|
|
133
|
+
add_template("system/project/settings.rb.tt", "system/#{underscored_project_name}/settings.rb")
|
|
134
|
+
add_template("system/project/application.rb.tt", "system/#{underscored_project_name}/application.rb")
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def add_system_boot
|
|
138
|
+
add_template("system/boot.rb.tt", "system/boot.rb")
|
|
139
|
+
add_template("system/boot/monitor.rb.tt", "system/boot/monitor.rb")
|
|
140
|
+
add_template("system/boot/rom.rb.tt", "system/boot/rom.rb")
|
|
141
|
+
add_template("system/boot/settings.rb.tt", "system/boot/settings.rb")
|
|
142
|
+
add_template("system/boot/graph.rb.tt", "system/boot/graph.rb")
|
|
143
|
+
add_template("system/boot/repos.rb.tt", "system/boot/repos.rb")
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def add_config_files
|
|
147
|
+
add_template(".gitignore", ".gitignore")
|
|
148
|
+
add_template("Gemfile", "Gemfile")
|
|
149
|
+
add_template("Rakefile.tt", "Rakefile")
|
|
150
|
+
add_template("config.ru.tt", "config.ru")
|
|
151
|
+
add_template("README.md.tt", "README.md")
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
require "thor"
|
|
2
|
+
require "dry/core/inflector"
|
|
3
|
+
require "kanji/generators/abstract_generator"
|
|
4
|
+
|
|
5
|
+
module Kanji
|
|
6
|
+
module Generators
|
|
7
|
+
class Type < AbstractGenerator
|
|
8
|
+
def initialize(name, attributes)
|
|
9
|
+
@name = name
|
|
10
|
+
@attributes = attributes.map { |attr| attr.split(":") }
|
|
11
|
+
super(destination)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def populate_templates
|
|
15
|
+
add_type
|
|
16
|
+
add_repository
|
|
17
|
+
add_mutations
|
|
18
|
+
add_migration
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
attr_reader :name, :attributes
|
|
23
|
+
|
|
24
|
+
def template_scope
|
|
25
|
+
{
|
|
26
|
+
type_name: type_name,
|
|
27
|
+
pluralized_type_name: pluralized_type_name,
|
|
28
|
+
class_name: class_name,
|
|
29
|
+
pluralized_class_name: pluralized_class_name,
|
|
30
|
+
attributes: attributes,
|
|
31
|
+
application_class: application_class,
|
|
32
|
+
lookup_type: -> (name) { lookup_type(name) },
|
|
33
|
+
lookup_column_type: -> (name) { lookup_column_type(name) }
|
|
34
|
+
}
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def add_type
|
|
38
|
+
add_template("app/types/type.rb.tt", "app/types/#{type_name}.rb")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def add_repository
|
|
42
|
+
add_template("app/repositories/repo.rb.tt", "app/repositories/#{pluralized_type_name}.rb")
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def destination
|
|
46
|
+
"./"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def add_mutations
|
|
50
|
+
fields = "\n\n field :create#{class_name}, Types::#{class_name}[:create_mutation]\n" +
|
|
51
|
+
" field :update#{class_name}, Types::#{class_name}[:update_mutation]\n" +
|
|
52
|
+
" field :destroy#{class_name}, Types::#{class_name}[:destroy_mutation]\n"
|
|
53
|
+
|
|
54
|
+
generator.processor.insert_into_file "./app/mutation_type.rb", fields, after: /description ".*"/
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def add_migration
|
|
58
|
+
add_template("migration.rb.tt", "db/migrate/#{Time.now.strftime("%Y%m%d%H%M%S")}_create_#{pluralized_type_name}.rb")
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def application_class
|
|
62
|
+
@_application_class ||= Dry::Core::Inflector.camelize(File.basename(Dir.pwd))
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def type_name
|
|
66
|
+
@_type_name ||= Dry::Core::Inflector.underscore(name)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def pluralized_type_name
|
|
70
|
+
@_pluralized_type_name ||= Dry::Core::Inflector.pluralize(type_name)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def class_name
|
|
74
|
+
@_class_name ||= Dry::Core::Inflector.camelize(name)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def pluralized_class_name
|
|
78
|
+
@_pluralized_class_name ||= Dry::Core::Inflector.pluralize(class_name)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def lookup_type(type_name)
|
|
82
|
+
map = {
|
|
83
|
+
"string" => "Kanji::Types::String",
|
|
84
|
+
"integer" => "Kanji::Types::Int",
|
|
85
|
+
"decimal" => "Kanji::Types::Decimal",
|
|
86
|
+
"text" => "Kanji::Types::String",
|
|
87
|
+
"boolean" => "Kanji::Types::Bool",
|
|
88
|
+
"float" => "Kanji::Types::Float",
|
|
89
|
+
"datetime" => "Kanji::Types::DateTime"
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
map.fetch(type_name, "Kanji::Types::Any")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def lookup_column_type(type_name)
|
|
96
|
+
map = {
|
|
97
|
+
"string" => "varchar(255)",
|
|
98
|
+
"integer" => "integer",
|
|
99
|
+
"decimal" => "numeric",
|
|
100
|
+
"text" => "text",
|
|
101
|
+
"boolean" => "boolean",
|
|
102
|
+
"datetime" => "timestamp",
|
|
103
|
+
"float" => "double precision"
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
map.fetch(type_name, nil)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|