trailblazer-future 2.1.0.rc1

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 (161) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +6 -0
  4. data/CHANGES.md +4 -0
  5. data/LICENSE.txt +9 -0
  6. data/README.md +48 -0
  7. data/Rakefile +10 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +8 -0
  10. data/gems.rb +3 -0
  11. data/lib/trailblazer/future.rb +9 -0
  12. data/lib/trailblazer/future/version.rb +5 -0
  13. data/lib/trailblazer/v2_1/activity.rb +123 -0
  14. data/lib/trailblazer/v2_1/activity/config.rb +37 -0
  15. data/lib/trailblazer/v2_1/activity/dsl/add_task.rb +22 -0
  16. data/lib/trailblazer/v2_1/activity/dsl/helper.rb +68 -0
  17. data/lib/trailblazer/v2_1/activity/dsl/magnetic.rb +36 -0
  18. data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder.rb +101 -0
  19. data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/default_normalizer.rb +26 -0
  20. data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/fast_track.rb +118 -0
  21. data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/normalizer.rb +113 -0
  22. data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/path.rb +105 -0
  23. data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/railway.rb +97 -0
  24. data/lib/trailblazer/v2_1/activity/dsl/magnetic/builder/state.rb +58 -0
  25. data/lib/trailblazer/v2_1/activity/dsl/magnetic/finalizer.rb +51 -0
  26. data/lib/trailblazer/v2_1/activity/dsl/magnetic/generate.rb +62 -0
  27. data/lib/trailblazer/v2_1/activity/dsl/magnetic/merge.rb +16 -0
  28. data/lib/trailblazer/v2_1/activity/dsl/magnetic/process_options.rb +76 -0
  29. data/lib/trailblazer/v2_1/activity/dsl/magnetic/structure/alterations.rb +44 -0
  30. data/lib/trailblazer/v2_1/activity/dsl/magnetic/structure/plus_poles.rb +85 -0
  31. data/lib/trailblazer/v2_1/activity/dsl/magnetic/structure/polarization.rb +23 -0
  32. data/lib/trailblazer/v2_1/activity/dsl/record.rb +11 -0
  33. data/lib/trailblazer/v2_1/activity/dsl/schema/dependencies.rb +46 -0
  34. data/lib/trailblazer/v2_1/activity/dsl/schema/sequence.rb +46 -0
  35. data/lib/trailblazer/v2_1/activity/dsl/strategy/build_state.rb +32 -0
  36. data/lib/trailblazer/v2_1/activity/dsl/strategy/fast_track.rb +24 -0
  37. data/lib/trailblazer/v2_1/activity/dsl/strategy/path.rb +26 -0
  38. data/lib/trailblazer/v2_1/activity/dsl/strategy/plan.rb +36 -0
  39. data/lib/trailblazer/v2_1/activity/dsl/strategy/railway.rb +23 -0
  40. data/lib/trailblazer/v2_1/activity/interface.rb +16 -0
  41. data/lib/trailblazer/v2_1/activity/introspect.rb +167 -0
  42. data/lib/trailblazer/v2_1/activity/present.rb +95 -0
  43. data/lib/trailblazer/v2_1/activity/structures.rb +57 -0
  44. data/lib/trailblazer/v2_1/activity/task_builder.rb +41 -0
  45. data/lib/trailblazer/v2_1/activity/task_wrap.rb +40 -0
  46. data/lib/trailblazer/v2_1/activity/task_wrap/call_task.rb +19 -0
  47. data/lib/trailblazer/v2_1/activity/task_wrap/merge.rb +23 -0
  48. data/lib/trailblazer/v2_1/activity/task_wrap/runner.rb +62 -0
  49. data/lib/trailblazer/v2_1/activity/task_wrap/trace.rb +44 -0
  50. data/lib/trailblazer/v2_1/activity/task_wrap/variable_mapping.rb +162 -0
  51. data/lib/trailblazer/v2_1/activity/testing.rb +32 -0
  52. data/lib/trailblazer/v2_1/activity/trace.rb +97 -0
  53. data/lib/trailblazer/v2_1/circuit.rb +71 -0
  54. data/lib/trailblazer/v2_1/container_chain.rb +45 -0
  55. data/lib/trailblazer/v2_1/context.rb +79 -0
  56. data/lib/trailblazer/v2_1/deprecation/call.rb +46 -0
  57. data/lib/trailblazer/v2_1/deprecation/context.rb +43 -0
  58. data/lib/trailblazer/v2_1/dsl.rb +47 -0
  59. data/lib/trailblazer/v2_1/macro.rb +11 -0
  60. data/lib/trailblazer/v2_1/macro/contract.rb +5 -0
  61. data/lib/trailblazer/v2_1/operation.rb +91 -0
  62. data/lib/trailblazer/v2_1/operation/auto_inject.rb +47 -0
  63. data/lib/trailblazer/v2_1/operation/callable.rb +42 -0
  64. data/lib/trailblazer/v2_1/operation/class_dependencies.rb +25 -0
  65. data/lib/trailblazer/v2_1/operation/contract.rb +61 -0
  66. data/lib/trailblazer/v2_1/operation/deprecated_macro.rb +19 -0
  67. data/lib/trailblazer/v2_1/operation/deprecations.rb +21 -0
  68. data/lib/trailblazer/v2_1/operation/guard.rb +18 -0
  69. data/lib/trailblazer/v2_1/operation/heritage.rb +30 -0
  70. data/lib/trailblazer/v2_1/operation/inject.rb +36 -0
  71. data/lib/trailblazer/v2_1/operation/inspect.rb +79 -0
  72. data/lib/trailblazer/v2_1/operation/model.rb +50 -0
  73. data/lib/trailblazer/v2_1/operation/module.rb +29 -0
  74. data/lib/trailblazer/v2_1/operation/nested.rb +98 -0
  75. data/lib/trailblazer/v2_1/operation/persist.rb +14 -0
  76. data/lib/trailblazer/v2_1/operation/policy.rb +44 -0
  77. data/lib/trailblazer/v2_1/operation/public_call.rb +55 -0
  78. data/lib/trailblazer/v2_1/operation/pundit.rb +38 -0
  79. data/lib/trailblazer/v2_1/operation/railway.rb +32 -0
  80. data/lib/trailblazer/v2_1/operation/railway/fast_track.rb +13 -0
  81. data/lib/trailblazer/v2_1/operation/railway/macaroni.rb +23 -0
  82. data/lib/trailblazer/v2_1/operation/railway/normalizer.rb +58 -0
  83. data/lib/trailblazer/v2_1/operation/railway/task_builder.rb +37 -0
  84. data/lib/trailblazer/v2_1/operation/rescue.rb +42 -0
  85. data/lib/trailblazer/v2_1/operation/responder.rb +18 -0
  86. data/lib/trailblazer/v2_1/operation/result.rb +30 -0
  87. data/lib/trailblazer/v2_1/operation/test.rb +17 -0
  88. data/lib/trailblazer/v2_1/operation/trace.rb +46 -0
  89. data/lib/trailblazer/v2_1/operation/validate.rb +76 -0
  90. data/lib/trailblazer/v2_1/operation/wrap.rb +83 -0
  91. data/lib/trailblazer/v2_1/option.rb +78 -0
  92. data/lib/trailblazer/v2_1/rails.rb +12 -0
  93. data/lib/trailblazer/v2_1/rails/cell.rb +22 -0
  94. data/lib/trailblazer/v2_1/rails/controller.rb +66 -0
  95. data/lib/trailblazer/v2_1/rails/form.rb +21 -0
  96. data/lib/trailblazer/v2_1/rails/railtie.rb +31 -0
  97. data/lib/trailblazer/v2_1/rails/railtie/extend_application_controller.rb +28 -0
  98. data/lib/trailblazer/v2_1/rails/railtie/loader.rb +58 -0
  99. data/lib/trailblazer/v2_1/rails/test/integration.rb +6 -0
  100. data/lib/trailblazer/v2_1/versions.txt +7 -0
  101. data/test/rails5.0/.gitignore +17 -0
  102. data/test/rails5.0/Gemfile +21 -0
  103. data/test/rails5.0/Rakefile +3 -0
  104. data/test/rails5.0/app/concepts/artist/cell/dashboard.rb +7 -0
  105. data/test/rails5.0/app/concepts/artist/cell/show.rb +4 -0
  106. data/test/rails5.0/app/concepts/artist/view/dashboard.erb +4 -0
  107. data/test/rails5.0/app/concepts/artist/view/show.erb +1 -0
  108. data/test/rails5.0/app/concepts/params/operation/with_args.rb +5 -0
  109. data/test/rails5.0/app/concepts/song/contract/form.rb +6 -0
  110. data/test/rails5.0/app/concepts/song/operation/create.rb +15 -0
  111. data/test/rails5.0/app/concepts/song/operation/show.rb +3 -0
  112. data/test/rails5.0/app/concepts/song/operation/update.rb +15 -0
  113. data/test/rails5.0/app/controllers/application_controller.rb +46 -0
  114. data/test/rails5.0/app/controllers/args_controller.rb +5 -0
  115. data/test/rails5.0/app/controllers/artists_controller.rb +24 -0
  116. data/test/rails5.0/app/controllers/params_controller.rb +11 -0
  117. data/test/rails5.0/app/controllers/songs_controller.rb +35 -0
  118. data/test/rails5.0/app/models/artist.rb +2 -0
  119. data/test/rails5.0/app/models/song.rb +2 -0
  120. data/test/rails5.0/app/views/args/with_args.html.erb +1 -0
  121. data/test/rails5.0/app/views/layouts/application.html.erb +2 -0
  122. data/test/rails5.0/app/views/songs/edit.html.erb +4 -0
  123. data/test/rails5.0/app/views/songs/new.html.erb +5 -0
  124. data/test/rails5.0/app/views/songs/new_with_result.html.erb +3 -0
  125. data/test/rails5.0/app/views/songs/show.html.erb +3 -0
  126. data/test/rails5.0/bin/bundle +3 -0
  127. data/test/rails5.0/bin/rails +4 -0
  128. data/test/rails5.0/bin/rake +4 -0
  129. data/test/rails5.0/bin/setup +29 -0
  130. data/test/rails5.0/config.ru +4 -0
  131. data/test/rails5.0/config/application.rb +25 -0
  132. data/test/rails5.0/config/boot.rb +3 -0
  133. data/test/rails5.0/config/database.yml +21 -0
  134. data/test/rails5.0/config/environment.rb +5 -0
  135. data/test/rails5.0/config/environments/development.rb +41 -0
  136. data/test/rails5.0/config/environments/test.rb +42 -0
  137. data/test/rails5.0/config/initializers/assets.rb +11 -0
  138. data/test/rails5.0/config/initializers/backtrace_silencers.rb +7 -0
  139. data/test/rails5.0/config/initializers/cookies_serializer.rb +3 -0
  140. data/test/rails5.0/config/initializers/filter_parameter_logging.rb +4 -0
  141. data/test/rails5.0/config/initializers/inflections.rb +16 -0
  142. data/test/rails5.0/config/initializers/mime_types.rb +4 -0
  143. data/test/rails5.0/config/initializers/session_store.rb +3 -0
  144. data/test/rails5.0/config/initializers/wrap_parameters.rb +14 -0
  145. data/test/rails5.0/config/locales/en.yml +23 -0
  146. data/test/rails5.0/config/routes.rb +15 -0
  147. data/test/rails5.0/config/secrets.yml +17 -0
  148. data/test/rails5.0/db/migrate/20161122145124_create_songs.rb +8 -0
  149. data/test/rails5.0/db/schema.rb +19 -0
  150. data/test/rails5.0/log/.keep +0 -0
  151. data/test/rails5.0/test/concepts/song/operation/create_test.rb +11 -0
  152. data/test/rails5.0/test/concepts/song/operation/update_test.rb +34 -0
  153. data/test/rails5.0/test/integration/.keep +0 -0
  154. data/test/rails5.0/test/integration/args_controller_test.rb +8 -0
  155. data/test/rails5.0/test/integration/artists_controller_test.rb +28 -0
  156. data/test/rails5.0/test/integration/params_controller_test.rb +8 -0
  157. data/test/rails5.0/test/integration/songs_controller_test.rb +40 -0
  158. data/test/rails5.0/test/test_helper.rb +7 -0
  159. data/test/test_helper.rb +5 -0
  160. data/trailblazer-future.gemspec +25 -0
  161. metadata +246 -0
@@ -0,0 +1,22 @@
1
+ module Trailblazer::V2_1::Rails::Controller::Cell
2
+ private # rubocop:disable Lint/UselessAccessModifier
3
+
4
+ module Render
5
+ def render(cell = nil, options = {}, *, &block)
6
+ return super unless cell.kind_of?(::Cell::ViewModel)
7
+
8
+ render_cell(cell, options)
9
+ end
10
+
11
+ def render_cell(cell, options)
12
+ options = options.reverse_merge(layout: true)
13
+
14
+ # render the cell.
15
+ content = cell.()
16
+
17
+ render({html: content}.merge(options))
18
+ end
19
+ end
20
+
21
+ include Render unless method_defined?(:render_cell)
22
+ end
@@ -0,0 +1,66 @@
1
+ module Trailblazer::V2_1::Rails
2
+ module Controller
3
+ def run_v21(operation, *dependencies)
4
+ result = if Rails.application.config.trailblazer.enable_tracing
5
+ _run_operation_v21(operation, :trace, *dependencies).tap { |r| _operation_trace(r) }
6
+ else
7
+ _run_operation_v21(operation, :call, *dependencies)
8
+ end
9
+
10
+ _assign_trb_ivars(result)
11
+
12
+ yield(result) if result.success? && block_given?
13
+
14
+ @_result = result
15
+ end
16
+
17
+ alias run run_v21 unless method_defined?(:run)
18
+
19
+ private
20
+
21
+ # Override to tweak params. Not recommended.
22
+ # Use a deserializer instead.
23
+ def _run_params(params)
24
+ params
25
+ end
26
+
27
+ # This is where we can inject Dry.RB containers and the like via dependencies.
28
+ def _run_runtime_options(ctx = {}, *dependencies)
29
+ [_run_options(ctx), *dependencies]
30
+ end
31
+
32
+ # Override this to inject dependencies such as "current_user"
33
+ # into the runtime options.
34
+ def _run_options(ctx)
35
+ ctx
36
+ end
37
+
38
+ def _run_operation_v21(operation, call_method, *dependencies)
39
+ operation.send(
40
+ call_method,
41
+ {params: _run_params(self.params)}.merge(*_run_runtime_options(*dependencies)) # rubocop:disable Style/RedundantSelf
42
+ )
43
+ end
44
+
45
+ def _operation_trace(result)
46
+ puts result.wtf?
47
+ end
48
+
49
+ def _assign_trb_ivars(result)
50
+ @model = result[:model]
51
+ @form = _wrap_with_trb_form(result["contract.default"], @model.class)
52
+ end
53
+
54
+ def _wrap_with_trb_form(form, model)
55
+ Trailblazer::V2_1::Rails::Form.new(form, model)
56
+ end
57
+
58
+ module Result
59
+ def result
60
+ @_result
61
+ end
62
+ end
63
+
64
+ include Result
65
+ end
66
+ end
@@ -0,0 +1,21 @@
1
+ module Trailblazer::V2_1
2
+ class Rails::Form < SimpleDelegator
3
+ def initialize(delegated, model_class)
4
+ super(delegated)
5
+ @model_class = model_class
6
+ end
7
+
8
+ def self.name
9
+ # for whatever reason, validations climb up the inheritance tree and require _every_ class to have a name (4.1).
10
+ "Reform::Form"
11
+ end
12
+
13
+ def model_name
14
+ ::ActiveModel::Name.new(self, nil, @model_class.to_s.camelize)
15
+ end
16
+
17
+ def to_model
18
+ self
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ require "rails/railtie"
2
+ require "trailblazer/v2_1/loader"
3
+ require "trailblazer/v2_1/rails/railtie/extend_application_controller"
4
+ require "trailblazer/v2_1/rails/railtie/loader"
5
+
6
+ module Trailblazer::V2_1
7
+ class Railtie < ::Rails::Railtie
8
+ config.trailblazer = ActiveSupport::OrderedOptions.new
9
+ ## Accept also an Array of controllers
10
+ config.trailblazer.application_controller ||= 'ActionController::Base'
11
+ config.trailblazer.enable_loader ||= true
12
+ config.trailblazer.use_loader ||= true # TODO: remove with next release
13
+ config.trailblazer.enable_tracing ||= false
14
+
15
+ include Loader
16
+ include ExtendApplicationController
17
+
18
+ private
19
+
20
+ def reloader_class
21
+ # Rails 5.0.0.rc1 says:
22
+ # DEPRECATION WARNING: to_prepare is deprecated and will be removed from Rails 5.1
23
+ # (use ActiveSupport::Reloader.to_prepare instead)
24
+ if Gem.loaded_specs['activesupport'].version >= Gem::Version.new('5')
25
+ ActiveSupport::Reloader
26
+ else
27
+ ActionDispatch::Reloader
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ require "active_support/concern"
2
+
3
+ module Trailblazer::V2_1
4
+ class Railtie < ::Rails::Railtie
5
+ module ExtendApplicationController
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ initializer "trailblazer.application_controller", before: "finisher_hook" do
10
+ reloader_class.to_prepare do
11
+ ActiveSupport.on_load(:action_controller) do |app|
12
+ Trailblazer::V2_1::Railtie.extend_application_controller!(app)
13
+ end
14
+ end
15
+ end
16
+
17
+ def extend_application_controller!(app)
18
+ controllers = Array(::Rails.application.config.trailblazer.application_controller).map(&:to_s)
19
+ if controllers.include? app.to_s
20
+ app.send :include, Trailblazer::V2_1::Rails::Controller
21
+ app.send :include, Trailblazer::V2_1::Rails::Controller::Cell if defined?(::Cell)
22
+ end
23
+ app
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,58 @@
1
+ require "active_support/concern"
2
+
3
+ module Trailblazer::V2_1
4
+ class Railtie < ::Rails::Railtie
5
+ module Loader
6
+ extend ActiveSupport::Concern
7
+
8
+ included do # rubocop:disable Metrics/BlockLength
9
+ def self.load_concepts(app)
10
+ load_for(app)
11
+
12
+ engines.each { |engine| load_for(engine) }
13
+ end
14
+
15
+ def self.engines
16
+ ::Rails.application.railties.select { |tie| tie.is_a?(::Rails::Engine) }
17
+ end
18
+
19
+ def self.load_for(app)
20
+ Trailblazer::V2_1::Loader.new.(prepend: AllModelFiles, root: app.root) { |file| require_dependency(file) }
21
+ end
22
+
23
+ # Prepend model file, before the concept files like operation.rb get loaded.
24
+ ModelFile = lambda do |input, options|
25
+ model = "app/models/#{options[:name]}.rb"
26
+ File.exist?(model) ? [model] + input : input
27
+ end
28
+
29
+ # Load all model files before any TRB files.
30
+ AllModelFiles = lambda do |input, options|
31
+ Dir.glob("#{options[:root]}/app/models/**/*.rb").sort + input
32
+ end
33
+
34
+ # This is to autoload Operation::Dispatch, etc. I'm simply assuming people find this helpful in Rails.
35
+ initializer "trailblazer.library_autoloading" do
36
+ end
37
+
38
+ # thank you, http://stackoverflow.com/a/17573888/465070
39
+ initializer "trailblazer.install", after: "reform.form_extensions" do |app|
40
+ # the trb autoloading has to be run after initializers have been loaded, so we can tweak inclusion of features in
41
+ # initializers.
42
+
43
+ # TODO: remove me in the next version!
44
+ if config.trailblazer.use_loader.to_s.present?
45
+ warn "DEPRECATION WARNING [trailblazer-rails]: please use config.trailblazer.enable_loader" \
46
+ " to enable/disable the loader. config.trailblazer.use_loader will be removed from version > 2.1.6"
47
+ end
48
+
49
+ if config.trailblazer.enable_loader || config.trailblazer.use_loader
50
+ reloader_class.to_prepare do
51
+ Trailblazer::V2_1::Railtie.load_concepts(app)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,6 @@
1
+ require "minitest/rails/capybara" # loads Capybara, etc.
2
+
3
+ module Trailblazer::V2_1::Test
4
+ class Integration < Capybara::Rails::TestCase
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ 'trailblazer' => 'v2.1.0.rc1'
2
+ 'trailblazer-activity' => 'v0.7.1'
3
+ 'trailblazer-context' => 'v0.1.2'
4
+ 'trailblazer-macro' => 'v2.1.0.rc1'
5
+ 'trailblazer-macro-contract' => 'v2.1.0.rc1'
6
+ 'trailblazer-operation' => 'v0.4.1'
7
+ 'trailblazer-rails' => 'v2.1.6'
@@ -0,0 +1,17 @@
1
+ # See https://help.github.com/articles/ignoring-files for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile '~/.gitignore_global'
6
+
7
+ # Ignore bundler config.
8
+ /.bundle
9
+
10
+ # Ignore the default SQLite database.
11
+ /db/*.sqlite3
12
+ /db/*.sqlite3-journal
13
+
14
+ # Ignore all logfiles and tempfiles.
15
+ /log/*
16
+ !/log/.keep
17
+ /tmp
@@ -0,0 +1,21 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
4
+ gem 'rails', '~> 5.0.0'
5
+ # Use sqlite3 as the database for Active Record
6
+ gem 'sqlite3'
7
+ # Use SCSS for stylesheets
8
+
9
+ gem "trailblazer"
10
+ gem "trailblazer-future", path: '../../../trailblazer-future'
11
+ gem "trailblazer-rails"
12
+
13
+ gem "minitest-rails-capybara"
14
+
15
+ gem "trailblazer-cells"
16
+ gem "cells-rails"
17
+ gem "cells-erb"
18
+
19
+ gem "minitest-line"
20
+
21
+ gem "reform-rails"
@@ -0,0 +1,3 @@
1
+ require File.expand_path('../config/application', __FILE__)
2
+
3
+ Rails.application.load_tasks
@@ -0,0 +1,7 @@
1
+ module Artist::Cell
2
+ class Dashboard < Trailblazer::Cell
3
+ def theme
4
+ options[:theme]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ module Artist::Cell
2
+ class Show < Trailblazer::Cell
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ <h1 theme="<%= theme %>">
2
+ <%= model.title %>
3
+ </h1>
4
+ <%= link_to artists_path %>
@@ -0,0 +1 @@
1
+ <p><%= model["model"].inspect %>,<%= model["contract.default"].class.superclass %>,<%= options[:song].inspect %></p>
@@ -0,0 +1,5 @@
1
+ module Params
2
+ class WithArgs < Trailblazer::Operation
3
+ step ->(options) { options["x"] = %{#{options["params"].to_h} #{options["current_user"] }} }
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module Song::Contract
2
+ class Form < Reform::Form
3
+ property :id
4
+ property :title
5
+ end
6
+ end
@@ -0,0 +1,15 @@
1
+ class Song::New < Trailblazer::Operation
2
+ step Model( Song, :new )
3
+ step Contract::Build(constant: Song::Contract::Form)
4
+ step :set_current_user!
5
+
6
+ def set_current_user!(_options, model:, current_user:, **)
7
+ model.user_name = current_user
8
+ end
9
+ end
10
+
11
+ class Song::Create < Trailblazer::Operation
12
+ step Nested( Song::New )
13
+ step Contract::Validate()
14
+ step Contract::Persist()
15
+ end
@@ -0,0 +1,3 @@
1
+ class Song::Show < Trailblazer::Operation
2
+ step Model( Song, :new )
3
+ end
@@ -0,0 +1,15 @@
1
+ class Song::Update < Trailblazer::V2_1::Operation
2
+ class Present < Trailblazer::V2_1::Operation
3
+ step Model(Song, :find_by)
4
+ step Contract::Build(constant: Song::Contract::Form)
5
+ step Policy::Guard(:policy)
6
+
7
+ def policy(_options, model:, current_user:, **)
8
+ model.user_name == current_user
9
+ end
10
+ end
11
+
12
+ step Nested(Present)
13
+ step Contract::Validate()
14
+ step Contract::Persist()
15
+ end
@@ -0,0 +1,46 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+
6
+ def run(operation, params=self.params, *dependencies)
7
+ if operation < Trailblazer::Operation
8
+ super
9
+ else
10
+ result = operation.({params: _run_params(self.params) }.merge(*_run_runtime_options(*dependencies)))
11
+
12
+ @model = result[:model]
13
+ @form = Rails::Form.new( result[ "contract.default" ], @model.class )
14
+
15
+ yield(result) if result.success? && block_given?
16
+
17
+ @_result = result
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def _run_options(options)
24
+ options.merge("current_user" => "user_name" )
25
+ end
26
+
27
+ class Rails::Form < SimpleDelegator
28
+ def initialize(delegated, model_class)
29
+ super(delegated)
30
+ @model_class = model_class
31
+ end
32
+
33
+ def self.name
34
+ # for whatever reason, validations climb up the inheritance tree and require _every_ class to have a name (4.1).
35
+ "Reform::Form"
36
+ end
37
+
38
+ def model_name
39
+ ::ActiveModel::Name.new(self, nil, @model_class.to_s.camelize)
40
+ end
41
+
42
+ def to_model
43
+ self
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ class ArgsController < ApplicationController
2
+ def with_args
3
+ run Params::WithArgs, { fake: "bla" }, "current_user" => Module
4
+ end
5
+ end
@@ -0,0 +1,24 @@
1
+ class ArtistsController < ApplicationController
2
+ def dashboard
3
+ model = Struct.new(:title).new("Dashboard")
4
+ render cell( Artist::Cell::Dashboard, model, theme: "cute" )
5
+ end
6
+
7
+ def widget
8
+ model = Struct.new(:title).new("Dashboard")
9
+ render cell( Artist::Cell::Dashboard, model ), layout: false
10
+ end
11
+
12
+ include Trailblazer::Rails::Controller::Result
13
+
14
+ def with_expose
15
+ run Song::New
16
+ render cell( Artist::Cell::Show, result )
17
+ # render cell( Artist::Cell::Show, expose(search: @search, %w{model contract.default}) )
18
+ end
19
+
20
+ def with_expose_and_args
21
+ run Song::New
22
+ render cell( Artist::Cell::Show, result, song: @model )
23
+ end
24
+ end