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.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +37 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +31 -0
  5. data/CHANGELOG.md +283 -0
  6. data/CONTRIBUTING.md +29 -0
  7. data/Gemfile +36 -0
  8. data/LICENSE +22 -0
  9. data/README.md +72 -0
  10. data/Rakefile +6 -0
  11. data/dry-web-web_pipe.gemspec +33 -0
  12. data/exe/dry-web-web_pipe +6 -0
  13. data/lib/dry/web/web_pipe/cli/generate.rb +18 -0
  14. data/lib/dry/web/web_pipe/cli.rb +26 -0
  15. data/lib/dry/web/web_pipe/generate.rb +52 -0
  16. data/lib/dry/web/web_pipe/generators/abstract_generator.rb +54 -0
  17. data/lib/dry/web/web_pipe/generators/abstract_project.rb +116 -0
  18. data/lib/dry/web/web_pipe/generators/flat_project.rb +43 -0
  19. data/lib/dry/web/web_pipe/generators/inflections.rb +21 -0
  20. data/lib/dry/web/web_pipe/generators/sub_app.rb +68 -0
  21. data/lib/dry/web/web_pipe/generators/umbrella_project.rb +29 -0
  22. data/lib/dry/web/web_pipe/templates/.env.test.tt +1 -0
  23. data/lib/dry/web/web_pipe/templates/.env.tt +2 -0
  24. data/lib/dry/web/web_pipe/templates/.gitignore.tt +11 -0
  25. data/lib/dry/web/web_pipe/templates/.keep +0 -0
  26. data/lib/dry/web/web_pipe/templates/.rspec +2 -0
  27. data/lib/dry/web/web_pipe/templates/Gemfile +47 -0
  28. data/lib/dry/web/web_pipe/templates/README.md.tt +15 -0
  29. data/lib/dry/web/web_pipe/templates/Rakefile.tt +109 -0
  30. data/lib/dry/web/web_pipe/templates/application.html.slim +3 -0
  31. data/lib/dry/web/web_pipe/templates/config.ru.tt +7 -0
  32. data/lib/dry/web/web_pipe/templates/console.tt +7 -0
  33. data/lib/dry/web/web_pipe/templates/container.rb.tt +17 -0
  34. data/lib/dry/web/web_pipe/templates/flat_project/boot.rb.tt +12 -0
  35. data/lib/dry/web/web_pipe/templates/flat_project/root.rb.tt +16 -0
  36. data/lib/dry/web/web_pipe/templates/flat_project/router.rb.tt +8 -0
  37. data/lib/dry/web/web_pipe/templates/flat_project/web.rb.tt +52 -0
  38. data/lib/dry/web/web_pipe/templates/import.rb.tt +5 -0
  39. data/lib/dry/web/web_pipe/templates/monitor.rb.tt +10 -0
  40. data/lib/dry/web/web_pipe/templates/operation.rb.tt +11 -0
  41. data/lib/dry/web/web_pipe/templates/persistence.rb.tt +36 -0
  42. data/lib/dry/web/web_pipe/templates/repository.rb.tt +11 -0
  43. data/lib/dry/web/web_pipe/templates/sample_data.rb +1 -0
  44. data/lib/dry/web/web_pipe/templates/seed.rb +1 -0
  45. data/lib/dry/web/web_pipe/templates/settings.rb.tt +10 -0
  46. data/lib/dry/web/web_pipe/templates/setup +7 -0
  47. data/lib/dry/web/web_pipe/templates/spec/db_spec_helper.rb.tt +23 -0
  48. data/lib/dry/web/web_pipe/templates/spec/factories/example.rb +9 -0
  49. data/lib/dry/web/web_pipe/templates/spec/spec_helper.rb.tt +61 -0
  50. data/lib/dry/web/web_pipe/templates/spec/support/db/factory.rb +8 -0
  51. data/lib/dry/web/web_pipe/templates/spec/support/db/helpers.rb.tt +13 -0
  52. data/lib/dry/web/web_pipe/templates/spec/support/web/helpers.rb.tt +9 -0
  53. data/lib/dry/web/web_pipe/templates/spec/web_spec_helper.rb +37 -0
  54. data/lib/dry/web/web_pipe/templates/subapp/boot.rb.tt +5 -0
  55. data/lib/dry/web/web_pipe/templates/subapp/container.rb.tt +21 -0
  56. data/lib/dry/web/web_pipe/templates/subapp/import.rb.tt +7 -0
  57. data/lib/dry/web/web_pipe/templates/subapp/root.rb.tt +18 -0
  58. data/lib/dry/web/web_pipe/templates/subapp/router.rb.tt +10 -0
  59. data/lib/dry/web/web_pipe/templates/subapp/view.rb.tt +17 -0
  60. data/lib/dry/web/web_pipe/templates/subapp/view_context.rb.tt +8 -0
  61. data/lib/dry/web/web_pipe/templates/subapp/web.rb.tt +54 -0
  62. data/lib/dry/web/web_pipe/templates/subapp/welcome.rb.tt +13 -0
  63. data/lib/dry/web/web_pipe/templates/types.rb +6 -0
  64. data/lib/dry/web/web_pipe/templates/umbrella_project/boot.rb.tt +18 -0
  65. data/lib/dry/web/web_pipe/templates/umbrella_project/router.rb.tt +8 -0
  66. data/lib/dry/web/web_pipe/templates/view.rb.tt +15 -0
  67. data/lib/dry/web/web_pipe/templates/view_context.rb.tt +31 -0
  68. data/lib/dry/web/web_pipe/templates/welcome.html.slim +1 -0
  69. data/lib/dry/web/web_pipe/templates/welcome.rb.tt +11 -0
  70. data/lib/dry/web/web_pipe/version.rb +7 -0
  71. data/lib/dry-web-web_pipe.rb +1 -0
  72. data/script/ci +67 -0
  73. data/script/setup +47 -0
  74. data/script/teardown +42 -0
  75. data/spec/integration/new_app_spec.rb +21 -0
  76. data/spec/spec_helper.rb +22 -0
  77. data/spec/support/app.rb +64 -0
  78. data/spec/support/bundler.rb +113 -0
  79. data/spec/support/cli.rb +47 -0
  80. data/spec/support/directories.rb +37 -0
  81. data/spec/support/env.rb +84 -0
  82. data/spec/support/files.rb +59 -0
  83. data/spec/support/project.rb +60 -0
  84. data/spec/support/requests.rb +5 -0
  85. data/spec/support/silently.rb +28 -0
  86. data/spec/unit/generators/inflections_spec.rb +33 -0
  87. metadata +268 -0
@@ -0,0 +1,10 @@
1
+ <%= config[:camel_cased_app_name] %>::Container.boot :monitor do
2
+ init do
3
+ require "dry/monitor/sql/logger"
4
+ end
5
+
6
+ start do
7
+ notifications.register_event(:sql)
8
+ Dry::Monitor::SQL::Logger.new(logger).subscribe(notifications)
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ # auto_register: false
2
+
3
+ require "dry/transaction/operation"
4
+
5
+ module <%= config[:camel_cased_app_name] %>
6
+ class Operation
7
+ def self.inherited(subclass)
8
+ subclass.include Dry::Transaction::Operation
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,36 @@
1
+ <%= config[:camel_cased_app_name] %>::Container.boot :persistence, namespace: true do |system|
2
+ init do
3
+ require "sequel"
4
+ require "rom"
5
+ require "rom/sql"
6
+
7
+ use :monitor, :settings
8
+
9
+ ROM::SQL.load_extensions :postgres
10
+
11
+ Sequel.database_timezone = :utc
12
+ Sequel.application_timezone = :local
13
+
14
+ rom_config = ROM::Configuration.new(
15
+ :sql,
16
+ system[:settings].database_url,
17
+ extensions: %i[error_sql pg_array pg_json],
18
+ )
19
+
20
+ rom_config.plugin :sql, relations: :instrumentation do |plugin_config|
21
+ plugin_config.notifications = notifications
22
+ end
23
+
24
+ rom_config.plugin :sql, relations: :auto_restrictions
25
+
26
+ register "config", rom_config
27
+ register "db", rom_config.gateways[:default].connection
28
+ end
29
+
30
+ start do
31
+ config = container["persistence.config"]
32
+ config.auto_registration system.root.join("lib/persistence")
33
+
34
+ register "rom", ROM.container(config)
35
+ end
36
+ end
@@ -0,0 +1,11 @@
1
+ # auto_register: false
2
+
3
+ require "rom-repository"
4
+ require "<%= config[:underscored_project_name] %>/container"
5
+ require "<%= config[:underscored_project_name] %>/import"
6
+
7
+ module <%= config[:camel_cased_app_name] %>
8
+ class Repository < ROM::Repository::Root
9
+ include Import.args["persistence.rom"]
10
+ end
11
+ end
@@ -0,0 +1 @@
1
+ # Build your sample data here
@@ -0,0 +1 @@
1
+ # Build your seed data here
@@ -0,0 +1,10 @@
1
+ <%= config[:camel_cased_app_name] %>::Container.boot :settings, from: :system do
2
+ before :init do
3
+ require "types"
4
+ end
5
+
6
+ settings do
7
+ key :session_secret, Types::Strict::String.constrained(filled: true)
8
+ key :database_url, Types::Strict::String.constrained(filled: true)
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ APP_ROOT = File.expand_path("../../", __FILE__)
4
+
5
+ Dir.chdir(APP_ROOT) do
6
+ # Set up your app for development here
7
+ end
@@ -0,0 +1,23 @@
1
+ require_relative "spec_helper"
2
+
3
+ <%= config[:camel_cased_app_name] %>::Container.start :persistence
4
+
5
+ Dir[SPEC_ROOT.join("support/db/*.rb").to_s].each(&method(:require))
6
+ Dir[SPEC_ROOT.join("shared/db/*.rb").to_s].each(&method(:require))
7
+
8
+ require "database_cleaner"
9
+ DatabaseCleaner[:sequel, connection: Test::DatabaseHelpers.db].strategy = :truncation
10
+
11
+ RSpec.configure do |config|
12
+ config.include Test::DatabaseHelpers
13
+
14
+ config.before :suite do
15
+ DatabaseCleaner.clean_with :truncation
16
+ end
17
+
18
+ config.around :each do |example|
19
+ DatabaseCleaner.cleaning do
20
+ example.run
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ # Define your factories here, e.g.
2
+ #
3
+ # Factory.define :article do |f|
4
+ # f.sequence(:slug) { |i| "article-#{i}" }
5
+ # f.title { fake(:lorem, :words, 5) }
6
+ # f.body { fake(:lorem, :paragraphs, 1) }
7
+ # end
8
+ #
9
+ # See https://github.com/rom-rb/rom-factory for more.
@@ -0,0 +1,61 @@
1
+ ENV["RACK_ENV"] = "test"
2
+
3
+ require "pry-byebug"
4
+
5
+ SPEC_ROOT = Pathname(__FILE__).dirname
6
+
7
+ Dir[SPEC_ROOT.join("support/*.rb").to_s].each(&method(:require))
8
+ Dir[SPEC_ROOT.join("shared/*.rb").to_s].each(&method(:require))
9
+
10
+ require SPEC_ROOT.join("../system/<%= config[:underscored_project_name] %>/container")
11
+
12
+ RSpec.configure do |config|
13
+ config.disable_monkey_patching!
14
+
15
+ config.expect_with :rspec do |expectations|
16
+ # This option will default to `true` in RSpec 4.
17
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
18
+ end
19
+
20
+ config.mock_with :rspec do |mocks|
21
+ # Prevents you from mocking or stubbing a method that does not exist on a
22
+ # real object. This is generally recommended, and will default to `true`
23
+ # in RSpec 4.
24
+ mocks.verify_partial_doubles = true
25
+ end
26
+
27
+ # These two settings work together to allow you to limit a spec run to
28
+ # individual examples or groups you care about by tagging them with `:focus`
29
+ # metadata. When nothing is tagged with `:focus`, all examples get run.
30
+ config.filter_run :focus
31
+ config.run_all_when_everything_filtered = true
32
+
33
+ # Allows RSpec to persist some state between runs in order to support the
34
+ # `--only-failures` and `--next-failure` CLI options.
35
+ config.example_status_persistence_file_path = "spec/examples.txt"
36
+
37
+ # Many RSpec users commonly either run the entire suite or an individual
38
+ # file, and it's useful to allow more verbose output when running an
39
+ # individual spec file.
40
+ if config.files_to_run.one?
41
+ # Use the documentation formatter for detailed output, unless a formatter
42
+ # has already been configured (e.g. via a command-line flag).
43
+ config.default_formatter = "doc"
44
+ end
45
+
46
+ # Print the 10 slowest examples and example groups at the end of the spec
47
+ # run, to help surface which specs are running particularly slow.
48
+ config.profile_examples = 10
49
+
50
+ # Run specs in random order to surface order dependencies. If you find an
51
+ # order dependency and want to debug it, you can fix the order by providing
52
+ # the seed, which is printed after each run.
53
+ # --seed 1234
54
+ config.order = :random
55
+
56
+ # Seed global randomization in this process using the `--seed` CLI option.
57
+ # Setting this allows you to use `--seed` to deterministically reproduce
58
+ # test failures related to randomization by passing the same `--seed` value
59
+ # as the one that triggered the failure.
60
+ Kernel.srand config.seed
61
+ end
@@ -0,0 +1,8 @@
1
+ require "rom-factory"
2
+ require_relative "helpers"
3
+
4
+ Factory = ROM::Factory.configure do |config|
5
+ config.rom = Test::DatabaseHelpers.rom
6
+ end
7
+
8
+ Dir[Pathname(__FILE__).dirname.join("../../factories/**/*.rb")].each(&method(:require))
@@ -0,0 +1,13 @@
1
+ module Test
2
+ module DatabaseHelpers
3
+ module_function
4
+
5
+ def rom
6
+ <%= config[:camel_cased_app_name] %>::Container["persistence.rom"]
7
+ end
8
+
9
+ def db
10
+ <%= config[:camel_cased_app_name] %>::Container["persistence.db"]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module Test
2
+ module WebHelpers
3
+ module_function
4
+
5
+ def app
6
+ <%= config[:camel_cased_app_name] %>::ROUTER
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ require_relative "db_spec_helper"
2
+
3
+ require "rack/test"
4
+ require "capybara/rspec"
5
+ require "capybara-screenshot/rspec"
6
+ require "capybara/poltergeist"
7
+
8
+ Dir[SPEC_ROOT.join("support/web/*.rb").to_s].each(&method(:require))
9
+ Dir[SPEC_ROOT.join("shared/web/*.rb").to_s].each(&method(:require))
10
+
11
+ require SPEC_ROOT.join("../system/boot").realpath
12
+
13
+ Capybara.app = Test::WebHelpers.app
14
+ Capybara.server_port = 3001
15
+ Capybara.save_path = "#{File.dirname(__FILE__)}/../tmp/capybara-screenshot"
16
+ Capybara.javascript_driver = :poltergeist
17
+ Capybara::Screenshot.prune_strategy = {keep: 10}
18
+
19
+ Capybara.register_driver :poltergeist do |app|
20
+ Capybara::Poltergeist::Driver.new(
21
+ app,
22
+ js_errors: false,
23
+ phantomjs_logger: File.open(SPEC_ROOT.join("../log/phantomjs.log"), "w"),
24
+ phantomjs_options: %w(--load-images=no),
25
+ window_size: [1600, 768],
26
+ )
27
+ end
28
+
29
+ RSpec.configure do |config|
30
+ config.include Rack::Test::Methods, type: :request
31
+ config.include Rack::Test::Methods, Capybara::DSL, type: :feature
32
+ config.include Test::WebHelpers
33
+
34
+ config.before :suite do
35
+ Test::WebHelpers.app.freeze
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ require_relative "<%= config[:underscored_umbrella_name] %>/<%= config[:underscored_project_name] %>/container"
2
+
3
+ <%= config[:camel_cased_umbrella_name] %>::<%= config[:camel_cased_app_name] %>::Container.finalize!
4
+
5
+ require "<%= config[:underscored_umbrella_name] %>/<%= config[:underscored_project_name] %>/router"
@@ -0,0 +1,21 @@
1
+ require "pathname"
2
+ require "dry/web/container"
3
+ require "dry/system/components"
4
+
5
+ module <%= config[:camel_cased_umbrella_name] %>
6
+ module <%= config[:camel_cased_app_name] %>
7
+ class Container < Dry::Web::Container
8
+ require root.join("system/<%= config[:underscored_umbrella_name] %>/container")
9
+ import core: <%= config[:camel_cased_umbrella_name] %>::Container
10
+
11
+ configure do |config|
12
+ config.root = Pathname(__FILE__).join("../../..").realpath.dirname.freeze
13
+ config.logger = <%= config[:camel_cased_umbrella_name] %>::Container[:logger]
14
+ config.default_namespace = "<%= config[:underscored_umbrella_name] %>.<%= config[:underscored_project_name] %>"
15
+ config.auto_register = %w[lib/<%= config[:underscored_umbrella_name] %>/<%= config[:underscored_project_name] %>]
16
+ end
17
+
18
+ load_paths! "lib"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ require_relative "container"
2
+
3
+ module <%= config[:camel_cased_umbrella_name] %>
4
+ module <%= config[:camel_cased_app_name] %>
5
+ Import = Container.injector
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ require "web_pipe"
2
+ require "<%= config[:underscored_umbrella_name] %>/<%= config[:underscored_project_name] %>/web"
3
+
4
+ module <%= config[:camel_cased_umbrella_name] %>
5
+ module <%= config[:camel_cased_app_name] %>
6
+ module Actions
7
+ class Root
8
+ include WebPipe
9
+
10
+ compose :web, Web.new
11
+
12
+ plug(:view) do |conn|
13
+ conn.view('views.welcome')
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ require "hanami/router"
2
+ require_relative "container"
3
+
4
+ module <%= config[:camel_cased_umbrella_name] %>
5
+ module <%= config[:camel_cased_app_name] %>
6
+ ROUTER = Hanami::Router.new do
7
+ root to: Container["actions.root"]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ # auto_register: false
2
+
3
+ require "slim"
4
+ require "dry/view"
5
+ require "<%= config[:underscored_umbrella_name] %>/<%= config[:underscored_project_name] %>/container"
6
+
7
+ module <%= config[:camel_cased_umbrella_name] %>
8
+ module <%= config[:camel_cased_app_name] %>
9
+ class View < Dry::View
10
+ configure do |config|
11
+ config.paths = [Container.root.join("web/templates")]
12
+ config.default_context = Container["view_context"]
13
+ config.layout = "application"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ require "<%= config[:underscored_umbrella_name] %>/view_context"
2
+
3
+ module <%= config[:camel_cased_umbrella_name] %>
4
+ module <%= config[:camel_cased_app_name] %>
5
+ class ViewContext < <%= config[:camel_cased_umbrella_name] %>::ViewContext
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,54 @@
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_umbrella_name] %>/<%= 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_umbrella_name] %>
23
+ module <%= config[:camel_cased_app_name] %>
24
+ class Web
25
+ include WebPipe
26
+
27
+ use :cookies, Rack::Session::Cookie, key: "<%= config[:underscored_project_name] %>.session", secret: Container["core.settings"].session_secret
28
+ use :csrf, Rack::Csrf, raise: true
29
+ use :flash, Rack::Flash
30
+
31
+ plug :config, WebPipe::Plugs::Config.(
32
+ container: Container,
33
+
34
+ view_context: lambda do |conn|
35
+ {
36
+ flash: conn.flash,
37
+ csrf_token: Rack::Csrf.token(conn.env),
38
+ csrf_metatag: Rack::Csrf.metatag(conn.env),
39
+ csrf_tag: Rack::Csrf.tag(conn.env)
40
+ }
41
+ end,
42
+
43
+ sanitization_handler: lambda do |conn, result|
44
+ conn.
45
+ set_status(500).
46
+ set_response_body("Params #{conn.params} do not conform with the schema: #{result.errors.inspect}").
47
+ halt
48
+ end
49
+ )
50
+
51
+ plug :content_type, WebPipe::Plugs::ContentType.('text/html')
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,13 @@
1
+ require "<%= config[:underscored_umbrella_name] %>/<%= config[:underscored_project_name] %>/view"
2
+
3
+ module <%= config[:camel_cased_umbrella_name] %>
4
+ module <%= config[:camel_cased_app_name] %>
5
+ module Views
6
+ class Welcome < View
7
+ configure do |config|
8
+ config.template = "welcome"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,6 @@
1
+ require "dry-struct"
2
+ require "dry-types"
3
+
4
+ module Types
5
+ include Dry.Types()
6
+ end
@@ -0,0 +1,18 @@
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
+ # Load sub-apps
13
+ app_paths = Pathname(__FILE__).dirname.join("../apps").realpath.join("*")
14
+ Dir[app_paths].each do |f|
15
+ require "#{f}/system/boot"
16
+ end
17
+
18
+ require_relative "<%= config[:underscored_project_name] %>/router"
@@ -0,0 +1,8 @@
1
+ require "hanami/router"
2
+ require "<%= config[:underscored_project_name] %>/main/router"
3
+
4
+ module <%= config[:camel_cased_app_name] %>
5
+ ROUTER = Hanami::Router.new do
6
+ mount Main::ROUTER, at: '/'
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ # auto_register: false
2
+
3
+ require "slim"
4
+ require "dry/view"
5
+ require "<%= config[:underscored_project_name] %>/container"
6
+
7
+ module <%= config[:camel_cased_app_name] %>
8
+ class View < Dry::View
9
+ configure do |config|
10
+ config.paths = [Container.root.join("web/templates")]
11
+ config.default_context = Container["view_context"]
12
+ config.layout = "application"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,31 @@
1
+ require "dry/view/context"
2
+
3
+ module <%= config[:camel_cased_app_name] %>
4
+ class ViewContext < Dry::View::Context
5
+ def csrf_token
6
+ self[:csrf_token]
7
+ end
8
+
9
+ def csrf_metatag
10
+ self[:csrf_metatag]
11
+ end
12
+
13
+ def csrf_tag
14
+ self[:csrf_tag]
15
+ end
16
+
17
+ def flash
18
+ self[:flash]
19
+ end
20
+
21
+ def flash?
22
+ %i[notice alert].any? { |type| flash[type] }
23
+ end
24
+
25
+ private
26
+
27
+ def [](name)
28
+ _options.fetch(name)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1 @@
1
+ h1 Welcome to dry-web-web_pipe!
@@ -0,0 +1,11 @@
1
+ require "<%= config[:underscored_project_name] %>/view"
2
+
3
+ module <%= config[:camel_cased_app_name] %>
4
+ module Views
5
+ class Welcome < <%= config[:camel_cased_app_name] %>::View
6
+ configure do |config|
7
+ config.template = "welcome"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Dry
2
+ module Web
3
+ module WebPipe
4
+ VERSION = "0.1.0".freeze
5
+ end
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ require "dry/web/web_pipe/application"
data/script/ci ADDED
@@ -0,0 +1,67 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ setup() {
6
+ ./script/setup
7
+ }
8
+
9
+ teardown() {
10
+ ./script/teardown
11
+ }
12
+
13
+ run_all() {
14
+ bundle exec rake
15
+ }
16
+
17
+ run_unit_tests() {
18
+ bundle exec rake spec:coverage
19
+ }
20
+
21
+ run_isolation_tests() {
22
+ local pwd=$PWD
23
+ local root="$pwd/spec/isolation"
24
+
25
+ run_tests $root
26
+ }
27
+
28
+ run_integration_tests() {
29
+ local pwd=$PWD
30
+ local root="$pwd/spec/integration"
31
+
32
+ run_tests $root
33
+ }
34
+
35
+ run_tests() {
36
+ local root=$1
37
+
38
+ for test in $(find $root -name '*_spec.rb')
39
+ do
40
+ run_test $test
41
+
42
+ if [ $? -ne 0 ]; then
43
+ local exit_code=$?
44
+ echo "Failing test: $test"
45
+ exit $exit_code
46
+ fi
47
+ done
48
+ }
49
+
50
+ run_test() {
51
+ local test=$1
52
+
53
+ printf "\n\n\nRunning: $test\n"
54
+ COVERAGE=true bundle exec rspec $test
55
+ }
56
+
57
+ main() {
58
+ setup &&
59
+ run_all
60
+ # run_unit_tests &&
61
+ # run_isolation_tests &&
62
+ # run_integration_tests
63
+ }
64
+
65
+ trap teardown EXIT
66
+
67
+ main
data/script/setup ADDED
@@ -0,0 +1,47 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ declare pwd=$PWD
6
+ declare cache="$pwd/vendor/cache"
7
+
8
+ cleanup() {
9
+ ./script/teardown
10
+ }
11
+
12
+ bundle_package() {
13
+ bundle package --all
14
+ echo ""
15
+ }
16
+
17
+ # We may need something like this in future if we use github checkouts of gems
18
+ # (see `install_hanami_frameworks()` in hanami/hanami's setup script)
19
+ #
20
+ # install_from_git_checkouts() { }
21
+
22
+ install_base_gem() {
23
+ bundle exec rake build
24
+ local pkg=`ls $pwd/pkg/*.gem | sort -r | head -1`
25
+
26
+ gem install $pkg > /dev/null
27
+ mv $pkg $cache
28
+
29
+ echo "Installed $pkg (from $(git rev-parse HEAD))"
30
+ echo ""
31
+ }
32
+
33
+ generate_index() {
34
+ pushd $cache > /dev/null
35
+ gem generate_index
36
+ popd > /dev/null
37
+ echo ""
38
+ }
39
+
40
+ main() {
41
+ cleanup &&
42
+ bundle_package &&
43
+ install_base_gem &&
44
+ generate_index
45
+ }
46
+
47
+ main