journea 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 (135) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +8 -0
  3. data/README.md +131 -0
  4. data/Rakefile +26 -0
  5. data/app/controllers/journea/engine_controller.rb +19 -0
  6. data/app/controllers/journea/journeys_controller.rb +10 -0
  7. data/app/controllers/journea/steps_controller.rb +52 -0
  8. data/app/helpers/journea/form_helper.rb +25 -0
  9. data/app/models/journea/journey.rb +54 -0
  10. data/app/models/journea/journey_transition.rb +17 -0
  11. data/app/models/journea/keyvalue.rb +5 -0
  12. data/app/views/application/_back_link.html.haml +5 -0
  13. data/config/initializers/simple_form.rb +179 -0
  14. data/config/locales/simple_form.en.yml +31 -0
  15. data/config/routes.rb +5 -0
  16. data/db/migrate/20161201153630_create_journey_transitions.rb +22 -0
  17. data/db/migrate/20161201162349_create_journeys_table.rb +10 -0
  18. data/db/migrate/20161202162350_create_keyvalues_table.rb +11 -0
  19. data/lib/generators/journea/install_generator.rb +76 -0
  20. data/lib/generators/journea/templates/assets/application.js +23 -0
  21. data/lib/generators/journea/templates/assets/application.scss +49 -0
  22. data/lib/generators/journea/templates/config/initializers/journea.rb +23 -0
  23. data/lib/generators/journea/templates/config/initializers/journea2.rb +24 -0
  24. data/lib/generators/journea/templates/controllers/pages_controller.rb.example +2 -0
  25. data/lib/generators/journea/templates/views/application.html.haml +20 -0
  26. data/lib/generators/journea/templates/views/pages/start.html.haml.example +12 -0
  27. data/lib/generators/journea/templates/views/shared/error_messages.html.haml.example +7 -0
  28. data/lib/generators/journea/templates/views/steps/step.html.haml.example +8 -0
  29. data/lib/journea.rb +25 -0
  30. data/lib/journea/data.rb +20 -0
  31. data/lib/journea/engine.rb +27 -0
  32. data/lib/journea/state_machine.rb +40 -0
  33. data/lib/journea/step.rb +32 -0
  34. data/lib/journea/version.rb +3 -0
  35. data/lib/simple_form_object.rb +146 -0
  36. data/lib/tasks/journea_tasks.rake +4 -0
  37. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  38. data/spec/dummy/Rakefile +6 -0
  39. data/spec/dummy/app/assets/config/manifest.js +5 -0
  40. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  41. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  42. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  43. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  44. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  45. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  46. data/spec/dummy/app/controllers/pages_controller.rb +4 -0
  47. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  48. data/spec/dummy/app/jobs/application_job.rb +2 -0
  49. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  50. data/spec/dummy/app/models/application_record.rb +3 -0
  51. data/spec/dummy/app/steps/address_step.rb +4 -0
  52. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  53. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  54. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  55. data/spec/dummy/app/views/pages/start.html.erb +1 -0
  56. data/spec/dummy/app/views/steps/address.html.erb +5 -0
  57. data/spec/dummy/app/views/steps/name.html.erb +5 -0
  58. data/spec/dummy/app/views/steps/phone_number.html.erb +0 -0
  59. data/spec/dummy/bin/bundle +3 -0
  60. data/spec/dummy/bin/rails +4 -0
  61. data/spec/dummy/bin/rake +4 -0
  62. data/spec/dummy/bin/setup +34 -0
  63. data/spec/dummy/bin/update +29 -0
  64. data/spec/dummy/config.ru +5 -0
  65. data/spec/dummy/config/application.rb +14 -0
  66. data/spec/dummy/config/boot.rb +5 -0
  67. data/spec/dummy/config/cable.yml +9 -0
  68. data/spec/dummy/config/database.yml +25 -0
  69. data/spec/dummy/config/environment.rb +5 -0
  70. data/spec/dummy/config/environments/development.rb +54 -0
  71. data/spec/dummy/config/environments/production.rb +86 -0
  72. data/spec/dummy/config/environments/test.rb +42 -0
  73. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  74. data/spec/dummy/config/initializers/assets.rb +11 -0
  75. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  76. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  77. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  78. data/spec/dummy/config/initializers/inflections.rb +16 -0
  79. data/spec/dummy/config/initializers/journea.rb +8 -0
  80. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  81. data/spec/dummy/config/initializers/new_framework_defaults.rb +24 -0
  82. data/spec/dummy/config/initializers/session_store.rb +3 -0
  83. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  84. data/spec/dummy/config/locales/en.yml +23 -0
  85. data/spec/dummy/config/puma.rb +47 -0
  86. data/spec/dummy/config/routes.rb +4 -0
  87. data/spec/dummy/config/secrets.yml +22 -0
  88. data/spec/dummy/config/spring.rb +6 -0
  89. data/spec/dummy/db/development.sqlite3 +0 -0
  90. data/spec/dummy/db/schema.rb +42 -0
  91. data/spec/dummy/db/test.sqlite3 +0 -0
  92. data/spec/dummy/log/development.log +57 -0
  93. data/spec/dummy/log/test.log +448 -0
  94. data/spec/dummy/public/404.html +67 -0
  95. data/spec/dummy/public/422.html +67 -0
  96. data/spec/dummy/public/500.html +66 -0
  97. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  98. data/spec/dummy/public/apple-touch-icon.png +0 -0
  99. data/spec/dummy/public/favicon.ico +0 -0
  100. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EA/EAR2KaBsPQau6HwaTGrxV7EGMwAWyS-4C8pGVDU1Z-Q.cache +1 -0
  101. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/JZ/JZuPFgM2mLQgAHB-r7Pt_TdGW3DRWPrplT7xPjnCJSE.cache +1 -0
  102. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LT/LTt1oE1gi9m65YRwUp78DuufkCOfi3sa3Qa05_ykADk.cache +1 -0
  103. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Lj/LjRKOqtrClPtb97phuIWI7HHA8-p5J5nKHVE_zEycxo.cache +1 -0
  104. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QM/QMxUWUtpFaqwG3RI9t3m38QtFAOvHpiY3LphKJiVRTc.cache +1 -0
  105. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/St/StFuOi5bd69ceiqz2D6EOCmRzHgwY0IxERsMfiCneGM.cache +1 -0
  106. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vj/VjCUmI9pp5eD8BlYATbwJ4ZOk0438rwvtDrsttyWbfQ.cache +0 -0
  107. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wl/WlLcUIADXcUxaOt8Gq59uQbO0mquikyz7jxiJjXjhaI.cache +1 -0
  108. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YH/YHo__TrFq5y8rpx49T8d8ecyvMLbHFbnhz7IBV7pM98.cache +1 -0
  109. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Zu/ZuLXgeX6x_Dx8sCUbzuTtWu42HzQXWe7eooTgsonTnc.cache +0 -0
  110. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aG/aG1tp1pv4kBiSKx9ixZH5xiRXH-rGa0Hi6sdl4SHw6g.cache +3 -0
  111. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aw/awTDtuorxLsRLIGEYCefR-PTN7yptoaGRLEk13vHVLA.cache +1 -0
  112. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/b_/b_Itlk9QZZd7Rvf8kcA4yLP1R5Acu7jB-m1xQiSU0qE.cache +2 -0
  113. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cW/cWHxYOqms7abJ-dzXyrn2G7nadJicU5kkC8SduS06yc.cache +0 -0
  114. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cb/cbX7RFavWZoWojlrsXhsy4FN46UOfMwZYStkLHT5HJw.cache +1 -0
  115. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eY/eYTHvo0Wl2TD2vipDcJ966HHXGrA4ZlJaiA2DnftKhM.cache +1 -0
  116. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/f4/f4CpFuYmsdh1EvlFVjsl1WmM2QA9_z9AuOebEOw4mts.cache +0 -0
  117. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gH/gHSjqTBRSW22rP9mSj8XW6huEXKpcIOehvF-2fvuShQ.cache +1 -0
  118. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m0/m0smDeM83DcmOVpX9zos6AIX40E9Tf2j26tyvKFgMwc.cache +1 -0
  119. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mW/mWrwQwWUQpAlMCLQ8dGv5VkAXd-TxvAtB5WPg9l09-A.cache +1 -0
  120. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mX/mX1nlsL_SWOB4y22W5FheRX0YEONKyOY7xUeIvRiHco.cache +2 -0
  121. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +2 -0
  122. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +2 -0
  123. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oA/oAtzk5ZeF7lWCwNufspgWqtv_dQN_n5GumFNB4ScfBE.cache +2 -0
  124. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rA/rACdJeX3jZNkhx4awGhdZeMdOfmARubkoVKVAZdwYog.cache +0 -0
  125. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sC/sCEBZXwTjRpEzThf7YHzHNfkAupMVOx_Ko7WNMAFHS0.cache +0 -0
  126. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/x7/x7PYh8DJvPykcEqpVab2vcY9-GFz-3cqtoMlRAu94Uc.cache +2 -0
  127. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yT/yTOf3QInGfDlRZlwZNDBLlbma19FQRHM035AKRxcRyw.cache +0 -0
  128. data/spec/features/journey_spec.rb +9 -0
  129. data/spec/lib/simple_form_object/attribute_spec.rb +74 -0
  130. data/spec/lib/simple_form_object/delegation_spec.rb +50 -0
  131. data/spec/lib/simple_form_object/model_spec.rb +90 -0
  132. data/spec/lib/steps_spec.rb +0 -0
  133. data/spec/requests/journeys_spec.rb +6 -0
  134. data/spec/spec_helper.rb +44 -0
  135. metadata +449 -0
@@ -0,0 +1,31 @@
1
+ en:
2
+ simple_form:
3
+ "yes": 'Yes'
4
+ "no": 'No'
5
+ required:
6
+ text: 'required'
7
+ mark: '*'
8
+ # You can uncomment the line below if you need to overwrite the whole required html.
9
+ # When using html, text and mark won't be used.
10
+ # html: '<abbr title="required">*</abbr>'
11
+ error_notification:
12
+ default_message: "Please review the problems below:"
13
+ # Examples
14
+ # labels:
15
+ # defaults:
16
+ # password: 'Password'
17
+ # user:
18
+ # new:
19
+ # email: 'E-mail to sign in.'
20
+ # edit:
21
+ # email: 'E-mail.'
22
+ # hints:
23
+ # defaults:
24
+ # username: 'User name to sign in.'
25
+ # password: 'No special characters, please.'
26
+ # include_blanks:
27
+ # defaults:
28
+ # age: 'Rather not say'
29
+ # prompts:
30
+ # defaults:
31
+ # age: 'Select your age'
@@ -0,0 +1,5 @@
1
+ Journea::Engine.routes.draw do
2
+ resources :journeys, only: [:create], path: "/" do
3
+ resources :steps, only: [:edit, :update]
4
+ end
5
+ end
@@ -0,0 +1,22 @@
1
+ class CreateJourneyTransitions < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :journea_journey_transitions do |t|
4
+ t.string :to_state, null: false
5
+ t.text :metadata, default: "{}"
6
+ t.integer :sort_key, null: false
7
+ t.integer :journey_id, null: false
8
+ t.boolean :most_recent, null: false
9
+ t.timestamps null: false
10
+ end
11
+
12
+ add_index(:journea_journey_transitions,
13
+ [:journey_id, :sort_key],
14
+ unique: true,
15
+ name: "index_journey_transitions_parent_sort")
16
+ add_index(:journea_journey_transitions,
17
+ [:journey_id, :most_recent],
18
+ unique: true,
19
+ where: "most_recent",
20
+ name: "index_journey_transitions_parent_most_recent")
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ class CreateJourneysTable < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :journea_journeys do |t|
4
+ t.string :key
5
+ t.string :value
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class CreateKeyvaluesTable < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :journea_keyvalues do |t|
4
+ t.integer :journey_id
5
+ t.string :key
6
+ t.string :value
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,76 @@
1
+ module Journea
2
+ class InstallGenerator < Rails::Generators::Base
3
+ source_root File.expand_path("../templates", __FILE__)
4
+
5
+ def init
6
+ @steps = []
7
+ @install_assets = false
8
+ end
9
+
10
+ def setup_deps
11
+ @install_assets = yes?("Do you want to install the GOV.UK styles?")
12
+ if @install_assets
13
+ gem "govuk_template"
14
+ gem "govuk_frontend_toolkit"
15
+ gem "govuk_elements_rails"
16
+ end
17
+ gem "haml-rails", "~> 0.9"
18
+ Bundler.with_clean_env do
19
+ run "bundle install"
20
+ end
21
+ end
22
+
23
+ def setup_assets
24
+ return unless @install_assets
25
+
26
+ copy_file "views/application.html.haml", "app/views/layouts/application.html.haml"
27
+ remove_file "app/views/layouts/application.html.erb"
28
+ copy_file "assets/application.js", "app/assets/javascripts/application.js"
29
+ copy_file "assets/application.scss", "app/assets/stylesheets/application.scss"
30
+ remove_file "app/assets/stylesheets/application.css"
31
+ end
32
+
33
+ def create_start_page
34
+ return unless yes?("Do you need a start page?")
35
+
36
+ puts "Generating start page..."
37
+ copy_file "views/pages/start.html.haml.example", "app/views/pages/start.html.haml"
38
+ copy_file "controllers/pages_controller.rb.example", "app/controllers/pages_controller.rb"
39
+ route "root 'pages#start'"
40
+ end
41
+
42
+ def generate_steps
43
+ begin
44
+ puts "How many steps do you need to generate?"
45
+ step_number = gets.chomp
46
+ step_number = Integer(step_number)
47
+ rescue
48
+ print "Please enter an integer number:"
49
+ retry
50
+ end
51
+
52
+ if step_number > 0
53
+ copy_file "views/shared/error_messages.html.haml.example", "app/views/shared/_error_messages.html.haml"
54
+ end
55
+
56
+ step_number.times do |i|
57
+ name = ask "What is the name of step #{i + 1}?"
58
+ puts "Generating #{name} step..."
59
+ @name = name.downcase.strip
60
+ @steps << name
61
+ create_file "app/steps/#{@name}_step.rb", "class #{name.capitalize}Step < Journea::Step \nend"
62
+ template "views/steps/step.html.haml.example", "app/views/steps/#{@name}.html.haml"
63
+ end
64
+ end
65
+
66
+ def create_initializer
67
+ puts "generating initializer"
68
+ inside "config" do
69
+ inside "initializers" do
70
+ template "journea.rb"
71
+ end
72
+ end
73
+ route "mount Journea::Engine, at: '/journey'"
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,23 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require details.polyfill
16
+ //= require vendor/polyfills/bind
17
+ //= require govuk_toolkit
18
+ //= require_tree .
19
+
20
+ $( document ).ready(function() {
21
+ var $buttons = $('label input[type=radio], label input[type=checkbox]')
22
+ var selectionButtons = new GOVUK.SelectionButtons($buttons)
23
+ });
@@ -0,0 +1,49 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
16
+
17
+ @import 'govuk-elements';
18
+
19
+ .error {
20
+ label {
21
+ @extend .form-label-bold;
22
+ }
23
+ .selection-button-radio {
24
+ @extend .form-label;
25
+ }
26
+ }
27
+
28
+ .radio_buttons .radio {
29
+ label {
30
+ @extend .block-label;
31
+ @extend .selection-button-radio;
32
+ margin-bottom: 10px !important;
33
+ }
34
+ }
35
+
36
+ .check_boxes .checkbox {
37
+ label {
38
+ @extend .block-label;
39
+ @extend .selection-button-checkbox;
40
+ margin-bottom: 10px !important;
41
+ }
42
+ }
43
+
44
+ td.numeric {
45
+ font-size: 19px !important;
46
+ &.bold {
47
+ font-weight: bold;
48
+ }
49
+ }
@@ -0,0 +1,23 @@
1
+ Journea.configure_steps do
2
+ # step :first_step, initial: true
3
+ # step :second_step
4
+ #
5
+ # transition from: :first_step, to: :second
6
+ #
7
+ # before_transition(to: :second_step) do |journea|
8
+ # end
9
+
10
+ <% @steps.each_with_index do |step, i| -%>
11
+ <% if i == 0 -%>
12
+ step :<%= step %>, initial: true
13
+ <% else -%>
14
+ step :<%= step %>
15
+ <% end -%>
16
+ <% end -%>
17
+
18
+ <% @steps.each_with_index do |step, i| -%>
19
+ <% if @steps[i + 1].present? -%>
20
+ transition from: :<%= step %>, to: :<%= @steps[i + 1] %>
21
+ <% end -%>
22
+ <% end -%>
23
+ end
@@ -0,0 +1,24 @@
1
+ Journea.configure_steps do
2
+ # step :first_step, initial: true
3
+ # step :second_step
4
+ #
5
+ # transition from: :first_step, to: :second
6
+ #
7
+ # before_transition(to: :second_step) do |journea|
8
+ # end
9
+
10
+ <%- @steps.each_with_index do |step, i| -%>
11
+ <%- if i == 0 %>
12
+ * step :<%= step %>, initial: true
13
+ <%- else -%>
14
+ step :<%= step %>
15
+ <%- end -%>
16
+ <%- end -%>
17
+
18
+ <% @steps.each_with_index do |step, i| %>
19
+ <% if @steps[i + 1].present? %>
20
+ transition from: :<%= step -%>, to: :<%= @steps[i + 1] -%>
21
+
22
+ <% end %>
23
+ <% end %>
24
+ end
@@ -0,0 +1,2 @@
1
+ class PagesController < ApplicationController
2
+ end
@@ -0,0 +1,20 @@
1
+ - content_for(:head) do
2
+ = stylesheet_link_tag "application", media: "all"
3
+ /[if IE 8] <haml_loud> stylesheet_link_tag &quot;ie8&quot; </haml_loud>
4
+ = javascript_include_tag "application"
5
+ = csrf_meta_tags
6
+ - content_for :header_class, 'with-proposition'
7
+ - content_for :proposition_header do
8
+ .header-proposition
9
+ .content
10
+ %nav#proposition-menu
11
+ = link_to t('global_proposition_header'), '/', id: "proposition-name"
12
+ - content_for(:content) do
13
+ %main#content{:role => "main"}
14
+ = yield :datashift_journey_state_jumper
15
+ .phase-banner-alpha
16
+ %p
17
+ %strong.phase-tag= t(".proof_of_concept")
18
+ = render 'back_link'
19
+ = yield
20
+ = render template: "layouts/govuk_template"
@@ -0,0 +1,12 @@
1
+ %body
2
+ .grid-row.start-page
3
+ .column-two-thirds
4
+ %header.text
5
+ %h1#groupLabel.form-title.heading-large
6
+ Start
7
+ %h2.heading-small Summary
8
+ %ul.list.list-bullet.text
9
+ %li Requirement 1
10
+ %li Requirement 2
11
+
12
+ = link_to 'Start now', journea.journeys_path, class: 'button button-start', role: 'button', method: :post
@@ -0,0 +1,7 @@
1
+ - if @step.errors.any?
2
+ .error-summary
3
+ .heading-medium.error-summary-heading
4
+ There #{'is'.pluralize(@step.errors.count)} #{pluralize(@step.errors.count, "error")} with the information you've provided.
5
+ %ul.error-summary-list
6
+ - @step.errors.messages.each do |element, message|
7
+ = link_to_input_with_error(element, message)
@@ -0,0 +1,8 @@
1
+ .grid-row
2
+ .column-two-thirds
3
+ = simple_form_for @step do |f|
4
+ = render 'shared/error_messages'
5
+
6
+ %h1.heading-medium <%= @name.capitalize %>
7
+
8
+ = f.button :submit, 'Continue'
@@ -0,0 +1,25 @@
1
+ # Auto require all dependencies in the gemspec
2
+ Gem.loaded_specs["journea"].dependencies.each do |d|
3
+ begin
4
+ require d.name
5
+
6
+ # At this point in time unsure why exceptions are being swallowed here so
7
+ # am having to disable the cop for this section of code.
8
+ # rubocop:disable Lint/HandleExceptions
9
+ rescue(LoadError)
10
+ # Gem require failed
11
+ # puts "Couldn't require #{d.name}"
12
+ end
13
+ # rubocop:enable Lint/HandleExceptions
14
+ end
15
+
16
+ require "journea/engine"
17
+ require "journea/step"
18
+ require "journea/state_machine"
19
+ require "journea/data"
20
+
21
+ module Journea
22
+ def self.configure_steps(&block)
23
+ StateMachine.class_eval(&block)
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ module Journea
2
+ class Data
3
+
4
+ attr_reader :keyvalues
5
+
6
+ def initialize(keyvalue_collection)
7
+ @keyvalues = keyvalue_collection
8
+ end
9
+
10
+ # TODO: Currently having to eat this rubocop error until such time as we
11
+ # understand what form the respond_to_missing? should take
12
+ # rubocop:disable Style/MethodMissing
13
+ def method_missing(method_sym, *arguments, &block)
14
+ val = keyvalues.find_by(key: method_sym).value
15
+ return val if val.present?
16
+ super
17
+ end
18
+ # rubocop:enable Style/MethodMissing
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ module Journea
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Journea
4
+
5
+ config.generators do |g|
6
+ g.test_framework :rspec, fixture: false
7
+ g.fixture_replacement :factory_girl, dir: "spec/factories"
8
+ g.assets false
9
+ g.helper false
10
+ end
11
+
12
+ initializer :append_migrations do |app|
13
+ # From: https://blog.pivotal.io/labs/labs/leave-your-migrations-in-your-rails-engines
14
+ unless app.root.to_s.match root.to_s
15
+ config.paths["db/migrate"].expanded.each do |expanded_path|
16
+ app.config.paths["db/migrate"] << expanded_path
17
+ end
18
+ end
19
+ end
20
+
21
+ initializer :statesman, before: :load_config_initializers do
22
+ Statesman.configure do
23
+ storage_adapter(Statesman::Adapters::ActiveRecord)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,40 @@
1
+ module Journea
2
+ class StateMachine
3
+ include Statesman::Machine
4
+
5
+ def self.step(*args)
6
+ # Instead of using Statesman 'state', this let's us use 'step'
7
+ state(*args)
8
+ end
9
+
10
+ def previous_step
11
+ return nil unless last_transition.present?
12
+ last_transition.metadata["previous_state"]
13
+ end
14
+
15
+ def next_step
16
+ raise "No next step defined" if allowed_transitions.empty?
17
+ allowed_transitions.first.to_sym
18
+ end
19
+
20
+ def transition_to_next_step
21
+ transition_to!(next_step, previous_state: current_state)
22
+ end
23
+
24
+ def in_initial_state?
25
+ current_state
26
+ end
27
+
28
+ # Monkey patch to prevent hard fail on transitioning between unsupported routes
29
+ def validate_transition(options = { from: nil, to: nil, metadata: nil })
30
+ from = to_s_or_nil(options[:from])
31
+ to = to_s_or_nil(options[:to])
32
+
33
+ # Call all guards, they raise exceptions if they fail
34
+ guards_for(from: from, to: to).each do |guard|
35
+ guard.call(@object, last_transition, options[:metadata])
36
+ end
37
+ end
38
+
39
+ end
40
+ end