dry-web-web_pipe 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/.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
|