script_core 0.0.4 → 0.0.5

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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -1
  3. data/.gitignore +15 -1
  4. data/.rubocop.yml +10 -2
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +6 -0
  7. data/Gemfile +32 -0
  8. data/README.md +169 -6
  9. data/Rakefile +11 -0
  10. data/Vagrantfile +1 -1
  11. data/bin/rails +25 -0
  12. data/bootstrap.sh +2 -3
  13. data/dev.yml +4 -4
  14. data/ext/enterprise_script_service/Rakefile +5 -4
  15. data/ext/enterprise_script_service/mruby_config.rb +1 -0
  16. data/lib/script_core.rb +17 -15
  17. data/lib/script_core/engine.rb +1 -0
  18. data/lib/script_core/executable.rb +1 -1
  19. data/lib/script_core/railtie.rb +8 -0
  20. data/lib/script_core/spawner.rb +1 -0
  21. data/lib/script_core/version.rb +1 -1
  22. data/lib/tasks/mruby/engine.gembox.example +19 -0
  23. data/lib/tasks/mruby/lib/.keep +0 -0
  24. data/lib/tasks/script_core.rake +111 -0
  25. data/script/regression +7 -5
  26. data/script_core.gemspec +2 -2
  27. data/spec/dummy/Rakefile +8 -0
  28. data/spec/dummy/app/assets/config/manifest.js +3 -0
  29. data/spec/dummy/app/assets/images/.keep +0 -0
  30. data/spec/dummy/app/assets/javascripts/application.es6 +56 -0
  31. data/spec/dummy/app/assets/stylesheets/application.scss +65 -0
  32. data/spec/dummy/app/controllers/application_controller.rb +4 -0
  33. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  34. data/spec/dummy/app/controllers/fields/application_controller.rb +25 -0
  35. data/spec/dummy/app/controllers/fields/options_controller.rb +26 -0
  36. data/spec/dummy/app/controllers/fields/validations_controller.rb +26 -0
  37. data/spec/dummy/app/controllers/forms/application_controller.rb +14 -0
  38. data/spec/dummy/app/controllers/forms/fields_controller.rb +56 -0
  39. data/spec/dummy/app/controllers/forms/formulas/application_controller.rb +19 -0
  40. data/spec/dummy/app/controllers/forms/formulas/playgrounds_controller.rb +29 -0
  41. data/spec/dummy/app/controllers/forms/formulas_controller.rb +56 -0
  42. data/spec/dummy/app/controllers/forms_controller.rb +58 -0
  43. data/spec/dummy/app/controllers/home_controller.rb +7 -0
  44. data/spec/dummy/app/controllers/nested_forms/application_controller.rb +12 -0
  45. data/spec/dummy/app/controllers/nested_forms/fields_controller.rb +50 -0
  46. data/spec/dummy/app/controllers/playgrounds_controller.rb +29 -0
  47. data/spec/dummy/app/decorators/.keep +0 -0
  48. data/spec/dummy/app/helpers/application_helper.rb +21 -0
  49. data/spec/dummy/app/helpers/fields_helper.rb +32 -0
  50. data/spec/dummy/app/helpers/forms_helper.rb +14 -0
  51. data/spec/dummy/app/jobs/application_job.rb +4 -0
  52. data/spec/dummy/app/lib/script_engine.rb +22 -0
  53. data/spec/dummy/app/models/application_record.rb +8 -0
  54. data/spec/dummy/app/models/concerns/.keep +0 -0
  55. data/spec/dummy/app/models/concerns/acts_as_default_value.rb +152 -0
  56. data/spec/dummy/app/models/concerns/enum_attribute_localizable.rb +32 -0
  57. data/spec/dummy/app/models/concerns/fields/validations/acceptance.rb +18 -0
  58. data/spec/dummy/app/models/concerns/fields/validations/confirmation.rb +18 -0
  59. data/spec/dummy/app/models/concerns/fields/validations/exclusion.rb +35 -0
  60. data/spec/dummy/app/models/concerns/fields/validations/format.rb +45 -0
  61. data/spec/dummy/app/models/concerns/fields/validations/inclusion.rb +35 -0
  62. data/spec/dummy/app/models/concerns/fields/validations/length.rb +59 -0
  63. data/spec/dummy/app/models/concerns/fields/validations/numericality.rb +56 -0
  64. data/spec/dummy/app/models/concerns/fields/validations/presence.rb +18 -0
  65. data/spec/dummy/app/models/concerns/form_core/acts_as_default_value.rb +143 -0
  66. data/spec/dummy/app/models/field.rb +67 -0
  67. data/spec/dummy/app/models/field_options.rb +90 -0
  68. data/spec/dummy/app/models/fields.rb +10 -0
  69. data/spec/dummy/app/models/fields/boolean_field.rb +12 -0
  70. data/spec/dummy/app/models/fields/decimal_field.rb +12 -0
  71. data/spec/dummy/app/models/fields/integer_field.rb +20 -0
  72. data/spec/dummy/app/models/fields/multiple_nested_form_field.rb +35 -0
  73. data/spec/dummy/app/models/fields/nested_form_field.rb +37 -0
  74. data/spec/dummy/app/models/fields/options/boolean_field.rb +6 -0
  75. data/spec/dummy/app/models/fields/options/decimal_field.rb +12 -0
  76. data/spec/dummy/app/models/fields/options/integer_field.rb +13 -0
  77. data/spec/dummy/app/models/fields/options/multiple_nested_form_field.rb +6 -0
  78. data/spec/dummy/app/models/fields/options/nested_form_field.rb +6 -0
  79. data/spec/dummy/app/models/fields/options/text_field.rb +7 -0
  80. data/spec/dummy/app/models/fields/text_field.rb +12 -0
  81. data/spec/dummy/app/models/fields/validations/boolean_field.rb +7 -0
  82. data/spec/dummy/app/models/fields/validations/decimal_field.rb +8 -0
  83. data/spec/dummy/app/models/fields/validations/integer_field.rb +8 -0
  84. data/spec/dummy/app/models/fields/validations/multiple_nested_form_field.rb +8 -0
  85. data/spec/dummy/app/models/fields/validations/nested_form_field.rb +7 -0
  86. data/spec/dummy/app/models/fields/validations/text_field.rb +9 -0
  87. data/spec/dummy/app/models/form.rb +8 -0
  88. data/spec/dummy/app/models/formula.rb +8 -0
  89. data/spec/dummy/app/models/metal_form.rb +9 -0
  90. data/spec/dummy/app/models/nested_form.rb +5 -0
  91. data/spec/dummy/app/models/virtual_model.rb +23 -0
  92. data/spec/dummy/app/presenters/application_presenter.rb +11 -0
  93. data/spec/dummy/app/presenters/concerns/fields/presenter_for_number_field.rb +36 -0
  94. data/spec/dummy/app/presenters/fields/boolean_field_presenter.rb +13 -0
  95. data/spec/dummy/app/presenters/fields/composite_field_presenter.rb +13 -0
  96. data/spec/dummy/app/presenters/fields/decimal_field_presenter.rb +7 -0
  97. data/spec/dummy/app/presenters/fields/field_presenter.rb +44 -0
  98. data/spec/dummy/app/presenters/fields/integer_field_presenter.rb +11 -0
  99. data/spec/dummy/app/presenters/fields/multiple_nested_form_field_presenter.rb +9 -0
  100. data/spec/dummy/app/presenters/fields/nested_form_field_presenter.rb +9 -0
  101. data/spec/dummy/app/presenters/fields/text_field_presenter.rb +10 -0
  102. data/spec/dummy/app/views/_form_core/field_options/_decimal_field.html.erb +9 -0
  103. data/spec/dummy/app/views/_form_core/field_options/_integer_field.html.erb +10 -0
  104. data/spec/dummy/app/views/_form_core/field_options/_text_field.html.erb +12 -0
  105. data/spec/dummy/app/views/_form_core/fields/_boolean_field.html.erb +11 -0
  106. data/spec/dummy/app/views/_form_core/fields/_decimal_field.html.erb +9 -0
  107. data/spec/dummy/app/views/_form_core/fields/_integer_field.html.erb +9 -0
  108. data/spec/dummy/app/views/_form_core/fields/_multiple_nested_form_field.html.erb +23 -0
  109. data/spec/dummy/app/views/_form_core/fields/_nested_form.html.erb +37 -0
  110. data/spec/dummy/app/views/_form_core/fields/_nested_form_field.html.erb +42 -0
  111. data/spec/dummy/app/views/_form_core/fields/_text_field.html.erb +13 -0
  112. data/spec/dummy/app/views/_form_core/preview/_form.html.erb +17 -0
  113. data/spec/dummy/app/views/_form_core/preview/_nested_form.html.erb +22 -0
  114. data/spec/dummy/app/views/_form_core/render/_form.html.erb +39 -0
  115. data/spec/dummy/app/views/_form_core/validations/_acceptance.html.erb +12 -0
  116. data/spec/dummy/app/views/_form_core/validations/_confirmation.html.erb +12 -0
  117. data/spec/dummy/app/views/_form_core/validations/_exclusion.html.erb +2 -0
  118. data/spec/dummy/app/views/_form_core/validations/_format.html.erb +37 -0
  119. data/spec/dummy/app/views/_form_core/validations/_inclusion.html.erb +2 -0
  120. data/spec/dummy/app/views/_form_core/validations/_length.html.erb +44 -0
  121. data/spec/dummy/app/views/_form_core/validations/_numericality.html.erb +45 -0
  122. data/spec/dummy/app/views/_form_core/validations/_presence.html.erb +12 -0
  123. data/spec/dummy/app/views/fields/options/_form.html.erb +29 -0
  124. data/spec/dummy/app/views/fields/options/edit.html.erb +6 -0
  125. data/spec/dummy/app/views/fields/validations/_form.html.erb +34 -0
  126. data/spec/dummy/app/views/fields/validations/edit.html.erb +6 -0
  127. data/spec/dummy/app/views/forms/_form.html.erb +41 -0
  128. data/spec/dummy/app/views/forms/edit.html.erb +6 -0
  129. data/spec/dummy/app/views/forms/fields/_form.html.erb +71 -0
  130. data/spec/dummy/app/views/forms/fields/edit.html.erb +6 -0
  131. data/spec/dummy/app/views/forms/fields/index.html.erb +42 -0
  132. data/spec/dummy/app/views/forms/fields/new.html.erb +6 -0
  133. data/spec/dummy/app/views/forms/formulas/_form.html.erb +41 -0
  134. data/spec/dummy/app/views/forms/formulas/edit.html.erb +6 -0
  135. data/spec/dummy/app/views/forms/formulas/index.html.erb +28 -0
  136. data/spec/dummy/app/views/forms/formulas/new.html.erb +6 -0
  137. data/spec/dummy/app/views/forms/formulas/playgrounds/create.html.erb +48 -0
  138. data/spec/dummy/app/views/forms/formulas/playgrounds/show.html.erb +14 -0
  139. data/spec/dummy/app/views/forms/index.html.erb +31 -0
  140. data/spec/dummy/app/views/forms/new.html.erb +6 -0
  141. data/spec/dummy/app/views/home/index.html.erb +5 -0
  142. data/spec/dummy/app/views/layouts/_alert.html.erb +4 -0
  143. data/spec/dummy/app/views/layouts/_footer.html.erb +13 -0
  144. data/spec/dummy/app/views/layouts/_nav.html.erb +11 -0
  145. data/spec/dummy/app/views/layouts/_notice.html.erb +4 -0
  146. data/spec/dummy/app/views/layouts/application.html.erb +25 -0
  147. data/spec/dummy/app/views/layouts/forms.html.erb +33 -0
  148. data/spec/dummy/app/views/nested_forms/fields/_form.html.erb +68 -0
  149. data/spec/dummy/app/views/nested_forms/fields/edit.html.erb +6 -0
  150. data/spec/dummy/app/views/nested_forms/fields/index.html.erb +39 -0
  151. data/spec/dummy/app/views/nested_forms/fields/new.html.erb +6 -0
  152. data/spec/dummy/app/views/playgrounds/_form.html.erb +13 -0
  153. data/spec/dummy/app/views/playgrounds/create.html.erb +51 -0
  154. data/spec/dummy/app/views/playgrounds/show.html.erb +7 -0
  155. data/spec/dummy/bin/bundle +5 -0
  156. data/spec/dummy/bin/rails +6 -0
  157. data/spec/dummy/bin/rake +6 -0
  158. data/spec/dummy/bin/setup +40 -0
  159. data/spec/dummy/bin/update +35 -0
  160. data/spec/dummy/bin/yarn +13 -0
  161. data/spec/dummy/config.ru +7 -0
  162. data/spec/dummy/config/application.rb +35 -0
  163. data/spec/dummy/config/boot.rb +7 -0
  164. data/spec/dummy/config/database.yml +25 -0
  165. data/spec/dummy/config/environment.rb +7 -0
  166. data/spec/dummy/config/environments/development.rb +58 -0
  167. data/spec/dummy/config/environments/production.rb +85 -0
  168. data/spec/dummy/config/environments/test.rb +41 -0
  169. data/spec/dummy/config/initializers/application_controller_renderer.rb +10 -0
  170. data/spec/dummy/config/initializers/assets.rb +16 -0
  171. data/spec/dummy/config/initializers/backtrace_silencers.rb +9 -0
  172. data/spec/dummy/config/initializers/content_security_policy.rb +27 -0
  173. data/spec/dummy/config/initializers/cookies_serializer.rb +7 -0
  174. data/spec/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  175. data/spec/dummy/config/initializers/form_core.rb +4 -0
  176. data/spec/dummy/config/initializers/inflections.rb +18 -0
  177. data/spec/dummy/config/initializers/mime_types.rb +6 -0
  178. data/spec/dummy/config/initializers/wrap_parameters.rb +16 -0
  179. data/spec/dummy/config/locales/en.yml +33 -0
  180. data/spec/dummy/config/puma.rb +36 -0
  181. data/spec/dummy/config/routes.rb +31 -0
  182. data/spec/dummy/config/spring.rb +8 -0
  183. data/spec/dummy/config/storage.yml +34 -0
  184. data/spec/dummy/db/migrate/20180916202025_create_forms.form_core.rb +12 -0
  185. data/spec/dummy/db/migrate/20180916202026_add_columns_to_forms.rb +10 -0
  186. data/spec/dummy/db/migrate/20180916202027_add_attachable_to_forms.rb +9 -0
  187. data/spec/dummy/db/migrate/20180916202030_create_fields.form_core.rb +17 -0
  188. data/spec/dummy/db/migrate/20180916202121_add_columns_to_fields.rb +10 -0
  189. data/spec/dummy/db/migrate/20180916202124_add_position_to_fields.rb +9 -0
  190. data/spec/dummy/db/migrate/20181111111412_create_formulas.rb +13 -0
  191. data/spec/dummy/db/schema.rb +52 -0
  192. data/spec/dummy/lib/assets/.keep +0 -0
  193. data/spec/dummy/lib/monkey_patches/active_support.rb +3 -0
  194. data/spec/dummy/lib/monkey_patches/active_support/concern+prependable.rb +28 -0
  195. data/spec/dummy/lib/monkey_patches/big_decimal.rb +8 -0
  196. data/spec/dummy/log/.keep +0 -0
  197. data/spec/dummy/mruby/engine.gembox +19 -0
  198. data/spec/dummy/mruby/lib/.keep +0 -0
  199. data/spec/dummy/mruby/lib/core_ext.rb +62 -0
  200. data/spec/dummy/mruby/lib/harden.rb +1 -0
  201. data/spec/dummy/mruby/lib/input.rb +20 -0
  202. data/spec/dummy/mruby/lib/io.rb +19 -0
  203. data/spec/dummy/mruby/lib/output.rb +35 -0
  204. data/spec/dummy/mruby/lib/script_kernel.rb +12 -0
  205. data/spec/dummy/package.json +5 -0
  206. data/spec/dummy/public/404.html +67 -0
  207. data/spec/dummy/public/422.html +67 -0
  208. data/spec/dummy/public/500.html +66 -0
  209. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  210. data/spec/dummy/public/apple-touch-icon.png +0 -0
  211. data/spec/dummy/public/favicon.ico +0 -0
  212. data/spec/dummy/storage/.keep +0 -0
  213. data/spec/dummy/test/controllers/.keep +0 -0
  214. data/spec/dummy/test/fixtures/.keep +0 -0
  215. data/spec/dummy/test/models/.keep +0 -0
  216. data/spec/script_core_spec.rb +2 -2
  217. data/spec/spec_helper.rb +2 -2
  218. metadata +199 -5
  219. data/circle.yml +0 -9
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Fields::OptionsController < Fields::ApplicationController
4
+ before_action :set_options
5
+
6
+ def edit; end
7
+
8
+ def update
9
+ @options.assign_attributes(options_params)
10
+ if @options.valid? && @field.save(validate: false)
11
+ redirect_to fields_url, notice: "Field was successfully updated."
12
+ else
13
+ render :edit
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def set_options
20
+ @options = @field.options
21
+ end
22
+
23
+ def options_params
24
+ params.fetch(:options, {}).permit!
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Fields::ValidationsController < Fields::ApplicationController
4
+ before_action :set_validations
5
+
6
+ def edit; end
7
+
8
+ def update
9
+ @validations.assign_attributes(validations_params)
10
+ if @validations.valid? && @field.save(validate: false)
11
+ redirect_to fields_url, notice: "Field was successfully updated."
12
+ else
13
+ render :edit
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def set_validations
20
+ @validations = @field.validations
21
+ end
22
+
23
+ def validations_params
24
+ params.fetch(:validations, {}).permit!
25
+ end
26
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Forms::ApplicationController < ApplicationController
4
+ layout "forms"
5
+
6
+ before_action :set_form
7
+
8
+ protected
9
+
10
+ # Use callbacks to share common setup or constraints between actions.
11
+ def set_form
12
+ @form = Form.find(params[:form_id])
13
+ end
14
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Forms::FieldsController < Forms::ApplicationController
4
+ before_action :set_field, only: %i[show edit update destroy]
5
+
6
+ # GET /forms/1/fields
7
+ def index
8
+ @fields = @form.fields.all
9
+ end
10
+
11
+ # GET /forms/fields/new
12
+ def new
13
+ @field = @form.fields.build
14
+ end
15
+
16
+ # GET /forms/1/fields/1/edit
17
+ def edit; end
18
+
19
+ # POST /forms/1/fields
20
+ def create
21
+ @field = @form.fields.build(field_params)
22
+
23
+ if @field.save
24
+ redirect_to form_fields_url(@form), notice: "Field was successfully created."
25
+ else
26
+ render :new
27
+ end
28
+ end
29
+
30
+ # PATCH/PUT /forms/1/fields/1
31
+ def update
32
+ if @field.update(field_params)
33
+ redirect_to form_fields_url(@form), notice: "Field was successfully updated."
34
+ else
35
+ render :edit
36
+ end
37
+ end
38
+
39
+ # DELETE /forms/1/fields/1
40
+ def destroy
41
+ @field.destroy
42
+ redirect_to form_fields_url(@form), notice: "Field was successfully destroyed."
43
+ end
44
+
45
+ private
46
+
47
+ # Use callbacks to share common setup or constraints between actions.
48
+ def set_field
49
+ @field = @form.fields.find(params[:id])
50
+ end
51
+
52
+ # Only allow a trusted parameter "white list" through.
53
+ def field_params
54
+ params.fetch(:field, {}).permit(:name, :label, :hint, :accessibility, :type)
55
+ end
56
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Forms
4
+ class Formulas::ApplicationController < ApplicationController
5
+ before_action :set_form
6
+ before_action :set_formula
7
+
8
+ protected
9
+
10
+ # Use callbacks to share common setup or constraints between actions.
11
+ def set_form
12
+ @form = Form.find(params[:form_id])
13
+ end
14
+
15
+ def set_formula
16
+ @formula = @form.formulas.find(params[:formula_id])
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Forms
4
+ class Formulas::PlaygroundsController < Forms::Formulas::ApplicationController
5
+ before_action :set_virtual_model
6
+
7
+ def show
8
+ @form_record = @virtual_model.new
9
+ end
10
+
11
+ def create
12
+ @form_record = @virtual_model.new form_record_params
13
+ return render :show unless @form_record.valid?
14
+
15
+ @input = @form_record.serializable_hash
16
+ @result = ScriptEngine.eval @formula.body, input: @input
17
+ end
18
+
19
+ private
20
+
21
+ def set_virtual_model
22
+ @virtual_model = @form.to_virtual_model
23
+ end
24
+
25
+ def form_record_params
26
+ params.fetch(:form_record, {}).permit!
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Forms::FormulasController < Forms::ApplicationController
4
+ before_action :set_formula, only: %i[show edit update destroy]
5
+
6
+ # GET /forms/1/formulas
7
+ def index
8
+ @formulas = @form.formulas.all
9
+ end
10
+
11
+ # GET /forms/formulas/new
12
+ def new
13
+ @formula = @form.formulas.build
14
+ end
15
+
16
+ # GET /forms/1/formulas/1/edit
17
+ def edit; end
18
+
19
+ # POST /forms/1/formulas
20
+ def create
21
+ @formula = @form.formulas.build(formula_params)
22
+
23
+ if @formula.save
24
+ redirect_to form_formulas_url(@form), notice: "formula was successfully created."
25
+ else
26
+ render :new
27
+ end
28
+ end
29
+
30
+ # PATCH/PUT /forms/1/formulas/1
31
+ def update
32
+ if @formula.update(formula_params)
33
+ redirect_to form_formulas_url(@form), notice: "formula was successfully updated."
34
+ else
35
+ render :edit
36
+ end
37
+ end
38
+
39
+ # DELETE /forms/1/formulas/1
40
+ def destroy
41
+ @formula.destroy
42
+ redirect_to form_formulas_url(@form), notice: "formula was successfully destroyed."
43
+ end
44
+
45
+ private
46
+
47
+ # Use callbacks to share common setup or constraints between actions.
48
+ def set_formula
49
+ @formula = @form.formulas.find(params[:id])
50
+ end
51
+
52
+ # Only allow a trusted parameter "white list" through.
53
+ def formula_params
54
+ params.fetch(:formula, {}).permit(:name, :body)
55
+ end
56
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ class FormsController < ApplicationController
4
+ layout "application"
5
+
6
+ before_action :set_form, only: %i[edit update destroy]
7
+
8
+ # GET /forms
9
+ def index
10
+ @forms = Form.all
11
+ end
12
+
13
+ # GET /forms/new
14
+ def new
15
+ @form = Form.new
16
+ end
17
+
18
+ # GET /forms/1/edit
19
+ def edit; end
20
+
21
+ # POST /forms
22
+ def create
23
+ @form = Form.new(form_params)
24
+
25
+ if @form.save
26
+ redirect_to form_fields_url(@form), notice: "Form was successfully created."
27
+ else
28
+ render :new
29
+ end
30
+ end
31
+
32
+ # PATCH/PUT /forms/1
33
+ def update
34
+ if @form.update(form_params)
35
+ redirect_to form_fields_url(@form), notice: "Form was successfully updated."
36
+ else
37
+ render :edit
38
+ end
39
+ end
40
+
41
+ # DELETE /forms/1
42
+ def destroy
43
+ @form.destroy
44
+ redirect_to forms_url, notice: "Form was successfully destroyed."
45
+ end
46
+
47
+ private
48
+
49
+ # Use callbacks to share common setup or constraints between actions.
50
+ def set_form
51
+ @form = Form.find(params[:id])
52
+ end
53
+
54
+ # Only allow a trusted parameter "white list" through.
55
+ def form_params
56
+ params.fetch(:form, {}).permit(:title, :description)
57
+ end
58
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class HomeController < ApplicationController
4
+ def index
5
+ redirect_to playground_url
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class NestedForms::ApplicationController < ApplicationController
4
+ before_action :set_nested_form
5
+
6
+ protected
7
+
8
+ # Use callbacks to share common setup or constraints between actions.
9
+ def set_nested_form
10
+ @nested_form = NestedForm.find(params[:nested_form_id])
11
+ end
12
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ class NestedForms::FieldsController < NestedForms::ApplicationController
4
+ before_action :set_field, only: %i[show edit update destroy]
5
+
6
+ def index
7
+ @fields = @nested_form.fields.all
8
+ end
9
+
10
+ def new
11
+ @field = @nested_form.fields.build
12
+ end
13
+
14
+ def edit; end
15
+
16
+ def create
17
+ @field = @nested_form.fields.build(field_params)
18
+
19
+ if @field.save
20
+ redirect_to nested_form_fields_url(@nested_form), notice: "Field was successfully created."
21
+ else
22
+ render :new
23
+ end
24
+ end
25
+
26
+ def update
27
+ if @field.update(field_params)
28
+ redirect_to nested_form_fields_url(@nested_form), notice: "Field was successfully updated."
29
+ else
30
+ render :edit
31
+ end
32
+ end
33
+
34
+ def destroy
35
+ @field.destroy
36
+ redirect_to nested_form_fields_url(@nested_form), notice: "Field was successfully destroyed."
37
+ end
38
+
39
+ private
40
+
41
+ # Use callbacks to share common setup or constraints between actions.
42
+ def set_field
43
+ @field = @nested_form.fields.find(params[:id])
44
+ end
45
+
46
+ # Only allow a trusted parameter "white list" through.
47
+ def field_params
48
+ params.fetch(:field, {}).permit(:name, :label, :hint, :accessibility, :type)
49
+ end
50
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PlaygroundsController < ApplicationController
4
+ before_action :set_source
5
+
6
+ def show
7
+ @source = <<~CODE
8
+ puts "You can use `puts` to output strings to (fake) stdout for logging..."
9
+ puts "Call multiple absolutely OK!"
10
+
11
+ str = ""
12
+ (1..3).each do |i|
13
+ str += "Hello world!!! x\#{i}; "
14
+ end
15
+
16
+ set_output str
17
+ CODE
18
+ end
19
+
20
+ def create
21
+ @result = ScriptEngine.eval @source
22
+ end
23
+
24
+ private
25
+
26
+ def set_source
27
+ @source = params.fetch(:source, "")
28
+ end
29
+ end
File without changes
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApplicationHelper
4
+ def options_for_enum_select(klass, attribute, selected = nil)
5
+ container = klass.public_send(attribute.to_s.pluralize).map do |k, v|
6
+ v ||= k
7
+ [klass.human_enum_value(attribute, k), v]
8
+ end
9
+
10
+ options_for_select(container, selected)
11
+ end
12
+
13
+ def present(model, options = {})
14
+ klass = options.delete(:presenter_class) || "#{model.class}Presenter".constantize
15
+ presenter = klass.new(model, self, options)
16
+
17
+ yield(presenter) if block_given?
18
+
19
+ presenter
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FieldsHelper
4
+ def options_for_field_types(selected: nil)
5
+ options_for_select(Field.descendants.map { |klass| [klass.model_name.human, klass.to_s] }, selected)
6
+ end
7
+
8
+ def nested_form_attached_field?(field)
9
+ field.respond_to?(:nested_form)
10
+ end
11
+
12
+ def field_label(form, field_name:)
13
+ field_name = field_name.to_s.split(".").first.to_sym
14
+
15
+ form.fields.select do |field|
16
+ field.name == field_name
17
+ end.first&.label
18
+ end
19
+
20
+ def fields_path
21
+ form = @field.form
22
+
23
+ case form
24
+ when Form
25
+ form_fields_path(form)
26
+ when NestedForm
27
+ nested_form_fields_path(form)
28
+ else
29
+ raise "Unknown form: #{form.class}"
30
+ end
31
+ end
32
+ end