dry-web-web_pipe 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +37 -0
- data/.rspec +2 -0
- data/.travis.yml +31 -0
- data/CHANGELOG.md +283 -0
- data/CONTRIBUTING.md +29 -0
- data/Gemfile +36 -0
- data/LICENSE +22 -0
- data/README.md +72 -0
- data/Rakefile +6 -0
- data/dry-web-web_pipe.gemspec +33 -0
- data/exe/dry-web-web_pipe +6 -0
- data/lib/dry/web/web_pipe/cli/generate.rb +18 -0
- data/lib/dry/web/web_pipe/cli.rb +26 -0
- data/lib/dry/web/web_pipe/generate.rb +52 -0
- data/lib/dry/web/web_pipe/generators/abstract_generator.rb +54 -0
- data/lib/dry/web/web_pipe/generators/abstract_project.rb +116 -0
- data/lib/dry/web/web_pipe/generators/flat_project.rb +43 -0
- data/lib/dry/web/web_pipe/generators/inflections.rb +21 -0
- data/lib/dry/web/web_pipe/generators/sub_app.rb +68 -0
- data/lib/dry/web/web_pipe/generators/umbrella_project.rb +29 -0
- data/lib/dry/web/web_pipe/templates/.env.test.tt +1 -0
- data/lib/dry/web/web_pipe/templates/.env.tt +2 -0
- data/lib/dry/web/web_pipe/templates/.gitignore.tt +11 -0
- data/lib/dry/web/web_pipe/templates/.keep +0 -0
- data/lib/dry/web/web_pipe/templates/.rspec +2 -0
- data/lib/dry/web/web_pipe/templates/Gemfile +47 -0
- data/lib/dry/web/web_pipe/templates/README.md.tt +15 -0
- data/lib/dry/web/web_pipe/templates/Rakefile.tt +109 -0
- data/lib/dry/web/web_pipe/templates/application.html.slim +3 -0
- data/lib/dry/web/web_pipe/templates/config.ru.tt +7 -0
- data/lib/dry/web/web_pipe/templates/console.tt +7 -0
- data/lib/dry/web/web_pipe/templates/container.rb.tt +17 -0
- data/lib/dry/web/web_pipe/templates/flat_project/boot.rb.tt +12 -0
- data/lib/dry/web/web_pipe/templates/flat_project/root.rb.tt +16 -0
- data/lib/dry/web/web_pipe/templates/flat_project/router.rb.tt +8 -0
- data/lib/dry/web/web_pipe/templates/flat_project/web.rb.tt +52 -0
- data/lib/dry/web/web_pipe/templates/import.rb.tt +5 -0
- data/lib/dry/web/web_pipe/templates/monitor.rb.tt +10 -0
- data/lib/dry/web/web_pipe/templates/operation.rb.tt +11 -0
- data/lib/dry/web/web_pipe/templates/persistence.rb.tt +36 -0
- data/lib/dry/web/web_pipe/templates/repository.rb.tt +11 -0
- data/lib/dry/web/web_pipe/templates/sample_data.rb +1 -0
- data/lib/dry/web/web_pipe/templates/seed.rb +1 -0
- data/lib/dry/web/web_pipe/templates/settings.rb.tt +10 -0
- data/lib/dry/web/web_pipe/templates/setup +7 -0
- data/lib/dry/web/web_pipe/templates/spec/db_spec_helper.rb.tt +23 -0
- data/lib/dry/web/web_pipe/templates/spec/factories/example.rb +9 -0
- data/lib/dry/web/web_pipe/templates/spec/spec_helper.rb.tt +61 -0
- data/lib/dry/web/web_pipe/templates/spec/support/db/factory.rb +8 -0
- data/lib/dry/web/web_pipe/templates/spec/support/db/helpers.rb.tt +13 -0
- data/lib/dry/web/web_pipe/templates/spec/support/web/helpers.rb.tt +9 -0
- data/lib/dry/web/web_pipe/templates/spec/web_spec_helper.rb +37 -0
- data/lib/dry/web/web_pipe/templates/subapp/boot.rb.tt +5 -0
- data/lib/dry/web/web_pipe/templates/subapp/container.rb.tt +21 -0
- data/lib/dry/web/web_pipe/templates/subapp/import.rb.tt +7 -0
- data/lib/dry/web/web_pipe/templates/subapp/root.rb.tt +18 -0
- data/lib/dry/web/web_pipe/templates/subapp/router.rb.tt +10 -0
- data/lib/dry/web/web_pipe/templates/subapp/view.rb.tt +17 -0
- data/lib/dry/web/web_pipe/templates/subapp/view_context.rb.tt +8 -0
- data/lib/dry/web/web_pipe/templates/subapp/web.rb.tt +54 -0
- data/lib/dry/web/web_pipe/templates/subapp/welcome.rb.tt +13 -0
- data/lib/dry/web/web_pipe/templates/types.rb +6 -0
- data/lib/dry/web/web_pipe/templates/umbrella_project/boot.rb.tt +18 -0
- data/lib/dry/web/web_pipe/templates/umbrella_project/router.rb.tt +8 -0
- data/lib/dry/web/web_pipe/templates/view.rb.tt +15 -0
- data/lib/dry/web/web_pipe/templates/view_context.rb.tt +31 -0
- data/lib/dry/web/web_pipe/templates/welcome.html.slim +1 -0
- data/lib/dry/web/web_pipe/templates/welcome.rb.tt +11 -0
- data/lib/dry/web/web_pipe/version.rb +7 -0
- data/lib/dry-web-web_pipe.rb +1 -0
- data/script/ci +67 -0
- data/script/setup +47 -0
- data/script/teardown +42 -0
- data/spec/integration/new_app_spec.rb +21 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/app.rb +64 -0
- data/spec/support/bundler.rb +113 -0
- data/spec/support/cli.rb +47 -0
- data/spec/support/directories.rb +37 -0
- data/spec/support/env.rb +84 -0
- data/spec/support/files.rb +59 -0
- data/spec/support/project.rb +60 -0
- data/spec/support/requests.rb +5 -0
- data/spec/support/silently.rb +28 -0
- data/spec/unit/generators/inflections_spec.rb +33 -0
- metadata +268 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
require "dry/web/web_pipe/generate"
|
2
|
+
require "dry/web/web_pipe/generators/inflections"
|
3
|
+
|
4
|
+
module Dry
|
5
|
+
module Web
|
6
|
+
module WebPipe
|
7
|
+
module Generators
|
8
|
+
class AbstractGenerator
|
9
|
+
attr_reader :target_dir, :options
|
10
|
+
|
11
|
+
def initialize(target_dir, options = {})
|
12
|
+
@target_dir = target_dir
|
13
|
+
@options = options
|
14
|
+
@templates = []
|
15
|
+
populate_templates
|
16
|
+
@templates.freeze
|
17
|
+
end
|
18
|
+
|
19
|
+
def call
|
20
|
+
templates.each do |source, target|
|
21
|
+
generator.(source, target)
|
22
|
+
end
|
23
|
+
post_process_callback
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
attr_reader :templates
|
28
|
+
|
29
|
+
def add_template(source, target)
|
30
|
+
templates << [source, target]
|
31
|
+
end
|
32
|
+
|
33
|
+
def generator
|
34
|
+
@generator ||= Generate.new(destination, template_scope)
|
35
|
+
end
|
36
|
+
|
37
|
+
def post_process_callback; end
|
38
|
+
|
39
|
+
def underscored_project_name
|
40
|
+
@underscored_project_name ||= Inflections.underscored_name(target_dir)
|
41
|
+
end
|
42
|
+
|
43
|
+
def template_scope
|
44
|
+
fail NotImplementedError
|
45
|
+
end
|
46
|
+
|
47
|
+
def destination
|
48
|
+
fail NotImplementedError
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
require "dry/web/web_pipe/generators/abstract_generator"
|
3
|
+
|
4
|
+
module Dry
|
5
|
+
module Web
|
6
|
+
module WebPipe
|
7
|
+
module Generators
|
8
|
+
class AbstractProject < AbstractGenerator
|
9
|
+
def populate_templates
|
10
|
+
add_bin
|
11
|
+
add_config
|
12
|
+
add_db
|
13
|
+
add_log
|
14
|
+
add_spec
|
15
|
+
add_lib
|
16
|
+
add_system
|
17
|
+
add_boot
|
18
|
+
add_application
|
19
|
+
add_config_files
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def destination
|
25
|
+
target_dir
|
26
|
+
end
|
27
|
+
|
28
|
+
def template_scope
|
29
|
+
{
|
30
|
+
underscored_project_name: underscored_project_name,
|
31
|
+
camel_cased_app_name: Inflections.camel_cased_name(target_dir)
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_bin
|
36
|
+
add_template('console.tt', 'bin/console')
|
37
|
+
add_template('setup', 'bin/setup')
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_config
|
41
|
+
add_template('.env.tt', '.env')
|
42
|
+
add_template('.env.test.tt', '.env.test')
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_db
|
46
|
+
add_template('sample_data.rb', 'db/sample_data.rb')
|
47
|
+
add_template('seed.rb', 'db/seed.rb')
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_lib
|
51
|
+
add_template('types.rb', 'lib/types.rb')
|
52
|
+
add_template('operation.rb.tt', "lib/#{underscored_project_name}/operation.rb")
|
53
|
+
add_template('repository.rb.tt', "lib/#{underscored_project_name}/repository.rb")
|
54
|
+
add_template('.keep', 'lib/persistence/relations/.keep')
|
55
|
+
add_template('.keep', 'lib/persistence/commands/.keep')
|
56
|
+
add_template('view_context.rb.tt', "lib/#{underscored_project_name}/view_context.rb")
|
57
|
+
add_template('view.rb.tt', "lib/#{underscored_project_name}/view.rb")
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_log
|
61
|
+
add_template('.keep', 'log/.keep')
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_spec
|
65
|
+
add_template('.rspec', '.rspec')
|
66
|
+
|
67
|
+
# Base spec helpers
|
68
|
+
add_template('spec/web_spec_helper.rb', 'spec/web_spec_helper.rb')
|
69
|
+
add_template('spec/db_spec_helper.rb.tt', 'spec/db_spec_helper.rb')
|
70
|
+
add_template('spec/spec_helper.rb.tt', 'spec/spec_helper.rb')
|
71
|
+
|
72
|
+
# DB support
|
73
|
+
add_template('spec/support/db/factory.rb', 'spec/support/db/factory.rb')
|
74
|
+
add_template('spec/support/db/helpers.rb.tt', 'spec/support/db/helpers.rb')
|
75
|
+
add_template('spec/factories/example.rb', 'spec/factories/example.rb')
|
76
|
+
|
77
|
+
# Web support
|
78
|
+
add_template('spec/support/web/helpers.rb.tt', 'spec/support/web/helpers.rb')
|
79
|
+
end
|
80
|
+
|
81
|
+
def add_system
|
82
|
+
add_system_lib
|
83
|
+
add_system_boot
|
84
|
+
end
|
85
|
+
|
86
|
+
def add_boot
|
87
|
+
raise NotImplementedError
|
88
|
+
end
|
89
|
+
|
90
|
+
def add_application
|
91
|
+
raise NotImplementedError
|
92
|
+
end
|
93
|
+
|
94
|
+
def add_system_lib
|
95
|
+
add_template("container.rb.tt", "system/#{underscored_project_name}/container.rb")
|
96
|
+
add_template("import.rb.tt", "system/#{underscored_project_name}/import.rb")
|
97
|
+
end
|
98
|
+
|
99
|
+
def add_system_boot
|
100
|
+
add_template("monitor.rb.tt", "system/boot/monitor.rb")
|
101
|
+
add_template("persistence.rb.tt", "system/boot/persistence.rb")
|
102
|
+
add_template("settings.rb.tt", "system/boot/settings.rb")
|
103
|
+
end
|
104
|
+
|
105
|
+
def add_config_files
|
106
|
+
add_template('.gitignore.tt', '.gitignore')
|
107
|
+
add_template('Gemfile', 'Gemfile')
|
108
|
+
add_template('Rakefile.tt', 'Rakefile')
|
109
|
+
add_template('config.ru.tt', 'config.ru')
|
110
|
+
add_template('README.md.tt', 'README.md')
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
require "dry/web/web_pipe/generators/abstract_project"
|
3
|
+
|
4
|
+
module Dry
|
5
|
+
module Web
|
6
|
+
module WebPipe
|
7
|
+
module Generators
|
8
|
+
class FlatProject < AbstractProject
|
9
|
+
def populate_templates
|
10
|
+
super
|
11
|
+
add_views
|
12
|
+
add_actions
|
13
|
+
add_web
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def add_boot
|
19
|
+
add_template("flat_project/boot.rb.tt", "system/boot.rb")
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_application
|
23
|
+
add_template("flat_project/router.rb.tt", "system/#{underscored_project_name}/router.rb")
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_views
|
27
|
+
add_template('welcome.rb.tt', "lib/#{underscored_project_name}/views/welcome.rb")
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_actions
|
31
|
+
add_template('flat_project/web.rb.tt', "lib/#{underscored_project_name}/web.rb")
|
32
|
+
add_template('flat_project/root.rb.tt', "lib/#{underscored_project_name}/actions/root.rb")
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_web
|
36
|
+
add_template('application.html.slim', 'web/templates/layouts/application.html.slim')
|
37
|
+
add_template('welcome.html.slim', 'web/templates/welcome.html.slim')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "inflecto"
|
2
|
+
|
3
|
+
module Dry
|
4
|
+
module Web
|
5
|
+
module WebPipe
|
6
|
+
module Generators
|
7
|
+
module Inflections
|
8
|
+
module_function
|
9
|
+
|
10
|
+
def underscored_name(name)
|
11
|
+
Inflecto.underscore(name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def camel_cased_name(name)
|
15
|
+
Inflecto.camelize(underscored_name(name))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require "dry/web/web_pipe/generators/abstract_generator"
|
2
|
+
|
3
|
+
module Dry
|
4
|
+
module Web
|
5
|
+
module WebPipe
|
6
|
+
module Generators
|
7
|
+
class SubApp < AbstractGenerator
|
8
|
+
def populate_templates
|
9
|
+
add_lib
|
10
|
+
add_system
|
11
|
+
add_web
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def destination
|
17
|
+
options.fetch(:to) { File.join("apps", target_dir) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def umbrella_name
|
21
|
+
options.fetch(:umbrella)
|
22
|
+
end
|
23
|
+
|
24
|
+
def underscored_umbrella_name
|
25
|
+
Inflections.underscored_name(umbrella_name)
|
26
|
+
end
|
27
|
+
|
28
|
+
def lib_path
|
29
|
+
"lib/#{underscored_umbrella_name}/#{underscored_project_name}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def system_lib_path
|
33
|
+
"system/#{underscored_umbrella_name}/#{underscored_project_name}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_lib
|
37
|
+
add_template('subapp/web.rb.tt', "#{lib_path}/web.rb")
|
38
|
+
add_template('subapp/root.rb.tt', "#{lib_path}/actions/root.rb")
|
39
|
+
add_template('subapp/view_context.rb.tt', "#{lib_path}/view_context.rb")
|
40
|
+
add_template('subapp/view.rb.tt', "#{lib_path}/view.rb")
|
41
|
+
add_template('subapp/welcome.rb.tt', "#{lib_path}/views/welcome.rb")
|
42
|
+
end
|
43
|
+
|
44
|
+
def add_system
|
45
|
+
add_template("subapp/router.rb.tt", "#{system_lib_path}/router.rb")
|
46
|
+
add_template('subapp/container.rb.tt', "#{system_lib_path}/container.rb")
|
47
|
+
add_template('subapp/import.rb.tt', "#{system_lib_path}/import.rb")
|
48
|
+
add_template('subapp/boot.rb.tt', 'system/boot.rb')
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_web
|
52
|
+
add_template('application.html.slim', 'web/templates/layouts/application.html.slim')
|
53
|
+
add_template('welcome.html.slim', 'web/templates/welcome.html.slim')
|
54
|
+
end
|
55
|
+
|
56
|
+
def template_scope
|
57
|
+
{
|
58
|
+
underscored_project_name: underscored_project_name,
|
59
|
+
camel_cased_app_name: Inflections.camel_cased_name(target_dir),
|
60
|
+
underscored_umbrella_name: underscored_umbrella_name,
|
61
|
+
camel_cased_umbrella_name: Inflections.camel_cased_name(umbrella_name),
|
62
|
+
}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
require "dry/web/web_pipe/generators/abstract_project"
|
3
|
+
require "dry/web/web_pipe/generators/sub_app"
|
4
|
+
|
5
|
+
module Dry
|
6
|
+
module Web
|
7
|
+
module WebPipe
|
8
|
+
module Generators
|
9
|
+
class UmbrellaProject < AbstractProject
|
10
|
+
private
|
11
|
+
|
12
|
+
def add_boot
|
13
|
+
add_template("umbrella_project/boot.rb.tt", "system/boot.rb")
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_application
|
17
|
+
add_template("umbrella_project/router.rb.tt", "system/#{underscored_project_name}/router.rb")
|
18
|
+
end
|
19
|
+
|
20
|
+
def post_process_callback
|
21
|
+
Dir.chdir(target_dir) do
|
22
|
+
Generators::SubApp.new("main", umbrella: target_dir).call
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
DATABASE_URL='postgres://localhost/<%= config[:underscored_project_name] %>_test'
|
File without changes
|
@@ -0,0 +1,47 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
gem "rake"
|
4
|
+
|
5
|
+
# Web framework
|
6
|
+
gem "dry-system", "~> 0.9"
|
7
|
+
gem "dry-web", "~> 0.7"
|
8
|
+
gem "dry-web-web_pipe", "~> 0.1"
|
9
|
+
gem "puma"
|
10
|
+
gem "rack_csrf"
|
11
|
+
gem "hanami-router", "~> 1.3"
|
12
|
+
gem "web_pipe", "~> 0.8"
|
13
|
+
gem "rack-flash3", "~> 1.0"
|
14
|
+
|
15
|
+
gem "rack", ">= 2.0"
|
16
|
+
|
17
|
+
# Database persistence
|
18
|
+
gem "pg"
|
19
|
+
gem "rom", "~> 5.1"
|
20
|
+
gem "rom-sql", "~> 3.0"
|
21
|
+
|
22
|
+
# Application dependencies
|
23
|
+
gem "dry-matcher", "~> 0.7"
|
24
|
+
gem "dry-monads", "~> 1.2"
|
25
|
+
gem "dry-struct", "~> 1.0"
|
26
|
+
gem "dry-transaction", "~> 0.13"
|
27
|
+
gem "dry-types", "~> 1.1"
|
28
|
+
gem "dry-validation", "~> 1.0"
|
29
|
+
gem "dry-view", "~> 0.7"
|
30
|
+
gem "slim"
|
31
|
+
|
32
|
+
group :development, :test do
|
33
|
+
gem "pry-byebug", platform: :mri
|
34
|
+
end
|
35
|
+
|
36
|
+
group :development do
|
37
|
+
gem "rerun"
|
38
|
+
end
|
39
|
+
|
40
|
+
group :test do
|
41
|
+
gem "capybara"
|
42
|
+
gem "capybara-screenshot"
|
43
|
+
gem "database_cleaner"
|
44
|
+
gem "poltergeist"
|
45
|
+
gem "rspec"
|
46
|
+
gem "rom-factory", "~> 0.5"
|
47
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# <%= config[:camel_cased_app_name] %>
|
2
|
+
|
3
|
+
Welcome! You’ve generated an app using dry-web-web_pipe.
|
4
|
+
|
5
|
+
## First steps
|
6
|
+
|
7
|
+
1. Run `bundle`
|
8
|
+
2. Review `.env` & `.env.test` (and make a copy to e.g. `.example.env` if you want example settings checked in). In
|
9
|
+
particular, ensure that your PostgreSQL username and password are specified in the `DATABASE_URL` variable as follows:
|
10
|
+
`postgres://username:password@your_host/...`.
|
11
|
+
3. Run `bundle exec rake db:create` to create the development database.
|
12
|
+
4. Run `RACK_ENV=test bundle exec rake db:create` to create the test database.
|
13
|
+
5. Add your own steps to `bin/setup`
|
14
|
+
6. Run the app with `bundle exec rerun -- rackup --port 4000 config.ru`
|
15
|
+
7. Initialize git with `git init` and make your initial commit
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require "pry-byebug" unless ENV["RACK_ENV"] == "production"
|
3
|
+
require "rom/sql/rake_task"
|
4
|
+
require "shellwords"
|
5
|
+
require_relative "system/<%= config[:underscored_project_name] %>/container"
|
6
|
+
|
7
|
+
begin
|
8
|
+
require "rspec/core/rake_task"
|
9
|
+
RSpec::Core::RakeTask.new :spec
|
10
|
+
task default: [:spec]
|
11
|
+
rescue LoadError
|
12
|
+
end
|
13
|
+
|
14
|
+
def db
|
15
|
+
<%= config[:camel_cased_app_name] %>::Container["persistence.db"]
|
16
|
+
end
|
17
|
+
|
18
|
+
def settings
|
19
|
+
<%= config[:camel_cased_app_name] %>::Container["settings"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def database_uri
|
23
|
+
require "uri"
|
24
|
+
URI.parse(settings.database_url)
|
25
|
+
end
|
26
|
+
|
27
|
+
def postgres_env_vars(uri)
|
28
|
+
{}.tap do |vars|
|
29
|
+
vars["PGHOST"] = uri.host.to_s
|
30
|
+
vars["PGPORT"] = uri.port.to_s if uri.port
|
31
|
+
vars["PGUSER"] = uri.user.to_s if uri.user
|
32
|
+
vars["PGPASSWORD"] = uri.password.to_s if uri.password
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
namespace :db do
|
37
|
+
task :setup do
|
38
|
+
<%= config[:camel_cased_app_name] %>::Container.init :persistence
|
39
|
+
end
|
40
|
+
|
41
|
+
desc "Print current database schema version"
|
42
|
+
task version: :setup do
|
43
|
+
version =
|
44
|
+
if db.tables.include?(:schema_migrations)
|
45
|
+
db[:schema_migrations].order(:filename).last[:filename]
|
46
|
+
else
|
47
|
+
"not available"
|
48
|
+
end
|
49
|
+
|
50
|
+
puts "Current schema version: #{version}"
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Create database"
|
54
|
+
task :create do
|
55
|
+
if system("which createdb", out: File::NULL)
|
56
|
+
uri = database_uri
|
57
|
+
system(postgres_env_vars(uri), "createdb #{Shellwords.escape(uri.path[1..-1])}")
|
58
|
+
else
|
59
|
+
puts "You must have Postgres installed to create a database"
|
60
|
+
exit 1
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Drop database"
|
65
|
+
task :drop do
|
66
|
+
if system("which dropdb", out: File::NULL)
|
67
|
+
uri = database_uri
|
68
|
+
system(postgres_env_vars(uri), "dropdb #{Shellwords.escape(uri.path[1..-1])}")
|
69
|
+
else
|
70
|
+
puts "You must have Postgres installed to drop a database"
|
71
|
+
exit 1
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
desc "Migrate database up to latest migration available"
|
76
|
+
task :migrate do
|
77
|
+
# Enhance the migration task provided by ROM
|
78
|
+
|
79
|
+
# Once it finishes, dump the db structure
|
80
|
+
Rake::Task["db:structure:dump"].execute
|
81
|
+
|
82
|
+
# And print the current migration version
|
83
|
+
Rake::Task["db:version"].execute
|
84
|
+
end
|
85
|
+
|
86
|
+
namespace :structure do
|
87
|
+
desc "Dump database structure to db/structure.sql"
|
88
|
+
task :dump do
|
89
|
+
if system("which pg_dump", out: File::NULL)
|
90
|
+
uri = database_uri
|
91
|
+
system(postgres_env_vars(uri), "pg_dump -s -x -O #{Shellwords.escape(uri.path[1..-1])}", out: "db/structure.sql")
|
92
|
+
else
|
93
|
+
puts "You must have pg_dump installed to dump the database structure"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
desc "Load seed data into the database"
|
99
|
+
task :seed do
|
100
|
+
seed_data = File.join("db", "seed.rb")
|
101
|
+
load(seed_data) if File.exist?(seed_data)
|
102
|
+
end
|
103
|
+
|
104
|
+
desc "Load a small, representative set of data so that the application can start in a useful state (for development)."
|
105
|
+
task :sample_data do
|
106
|
+
sample_data = File.join("db", "sample_data.rb")
|
107
|
+
load(sample_data) if File.exist?(sample_data)
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "dry/web/container"
|
2
|
+
require "dry/system/components"
|
3
|
+
require 'dry-monitor'
|
4
|
+
Dry::Monitor.load_extensions(:rack)
|
5
|
+
|
6
|
+
module <%= config[:camel_cased_app_name] %>
|
7
|
+
class Container < Dry::Web::Container
|
8
|
+
configure do
|
9
|
+
config.name = :<%= config[:underscored_project_name] %>
|
10
|
+
config.listeners = true
|
11
|
+
config.default_namespace = "<%= config[:underscored_project_name] %>"
|
12
|
+
config.auto_register = %w[lib/<%= config[:underscored_project_name] %>]
|
13
|
+
end
|
14
|
+
|
15
|
+
load_paths! "lib"
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
|
3
|
+
begin
|
4
|
+
require "pry-byebug"
|
5
|
+
rescue LoadError
|
6
|
+
end
|
7
|
+
|
8
|
+
require_relative "<%= config[:underscored_project_name] %>/container"
|
9
|
+
|
10
|
+
<%= config[:camel_cased_app_name] %>::Container.finalize!
|
11
|
+
|
12
|
+
require_relative "<%= config[:underscored_project_name] %>/router"
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "web_pipe"
|
2
|
+
require "<%= config[:underscored_project_name] %>/web"
|
3
|
+
|
4
|
+
module <%= config[:camel_cased_app_name] %>
|
5
|
+
module Actions
|
6
|
+
class Root
|
7
|
+
include WebPipe
|
8
|
+
|
9
|
+
compose :web, Web.new
|
10
|
+
|
11
|
+
plug(:view) do |conn|
|
12
|
+
conn.view('views.welcome')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "web_pipe"
|
2
|
+
require 'web_pipe/plugs/content_type'
|
3
|
+
require "web_pipe/plugs/config"
|
4
|
+
require "rack/csrf"
|
5
|
+
require "rack/session/cookie"
|
6
|
+
require 'rack-flash'
|
7
|
+
require "<%= config[:underscored_project_name] %>/container"
|
8
|
+
|
9
|
+
WebPipe.load_extensions(
|
10
|
+
:container,
|
11
|
+
:cookies,
|
12
|
+
:flash,
|
13
|
+
:dry_schema,
|
14
|
+
:dry_view,
|
15
|
+
:params,
|
16
|
+
:redirect,
|
17
|
+
:router_params,
|
18
|
+
:session,
|
19
|
+
:url
|
20
|
+
)
|
21
|
+
|
22
|
+
module <%= config[:camel_cased_app_name] %>
|
23
|
+
class Web
|
24
|
+
include WebPipe
|
25
|
+
|
26
|
+
use :cookies, Rack::Session::Cookie, key: "<%= config[:underscored_project_name] %>.session", secret: Container["settings"].session_secret
|
27
|
+
use :csrf, Rack::Csrf, raise: true
|
28
|
+
use :flash, Rack::Flash
|
29
|
+
|
30
|
+
plug :config, WebPipe::Plugs::Config.(
|
31
|
+
container: Container,
|
32
|
+
|
33
|
+
view_context: lambda do |conn|
|
34
|
+
{
|
35
|
+
flash: conn.flash,
|
36
|
+
csrf_token: Rack::Csrf.token(conn.env),
|
37
|
+
csrf_metatag: Rack::Csrf.metatag(conn.env),
|
38
|
+
csrf_tag: Rack::Csrf.tag(conn.env)
|
39
|
+
}
|
40
|
+
end,
|
41
|
+
|
42
|
+
sanitization_handler: lambda do |conn, result|
|
43
|
+
conn.
|
44
|
+
set_status(500).
|
45
|
+
set_response_body("Params #{conn.params} do not conform with the schema: #{result.errors.inspect}").
|
46
|
+
halt
|
47
|
+
end
|
48
|
+
)
|
49
|
+
|
50
|
+
plug :content_type, WebPipe::Plugs::ContentType.('text/html')
|
51
|
+
end
|
52
|
+
end
|