webamm_to_rails 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +3 -0
  3. data/lib/webamm_to_rails/features/definitions.rb +19 -0
  4. data/lib/webamm_to_rails/features/devise_onlineable/definition.rb +44 -0
  5. data/lib/webamm_to_rails/features/devise_onlineable/definitions/connection/presenter.rb +29 -0
  6. data/lib/webamm_to_rails/features/devise_onlineable/definitions/connection/template.erb +17 -0
  7. data/lib/webamm_to_rails/features/devise_onlineable/templates/app/channels/online_channel.rb.erb +13 -0
  8. data/lib/webamm_to_rails/features/devise_onlineable/templates/app/javascript/channels/consumer.js.erb +6 -0
  9. data/lib/webamm_to_rails/features/devise_onlineable/templates/app/javascript/channels/index.js.erb +5 -0
  10. data/lib/webamm_to_rails/features/devise_onlineable/templates/app/javascript/channels/online_channel.js.erb +48 -0
  11. data/lib/webamm_to_rails/features/devise_onlineable/templates/app/models/concerns/devise_onlineable.rb.erb +39 -0
  12. data/lib/webamm_to_rails/rails_boilerplate/builder.rb +318 -0
  13. data/lib/webamm_to_rails/rails_boilerplate/templates/Dockerfile.erb +83 -0
  14. data/lib/webamm_to_rails/rails_boilerplate/templates/Procfile.dev.erb +3 -0
  15. data/lib/webamm_to_rails/rails_boilerplate/templates/README.md.erb +24 -0
  16. data/lib/webamm_to_rails/rails_boilerplate/templates/Rakefile.erb +6 -0
  17. data/lib/webamm_to_rails/rails_boilerplate/templates/app/assets/config/manifest.js.erb +2 -0
  18. data/lib/webamm_to_rails/rails_boilerplate/templates/app/assets/stylesheets/application.tailwind.css.erb +3 -0
  19. data/lib/webamm_to_rails/rails_boilerplate/templates/app/channels/application_cable/channel.rb.erb +4 -0
  20. data/lib/webamm_to_rails/rails_boilerplate/templates/app/channels/application_cable/connection.rb.erb +4 -0
  21. data/lib/webamm_to_rails/rails_boilerplate/templates/app/helpers/application_helper.rb.erb +2 -0
  22. data/lib/webamm_to_rails/rails_boilerplate/templates/app/javascript/application.js.erb +3 -0
  23. data/lib/webamm_to_rails/rails_boilerplate/templates/app/javascript/controllers/application.js.erb +9 -0
  24. data/lib/webamm_to_rails/rails_boilerplate/templates/app/javascript/controllers/hello_controller.js.erb +7 -0
  25. data/lib/webamm_to_rails/rails_boilerplate/templates/app/javascript/controllers/index.js.erb +8 -0
  26. data/lib/webamm_to_rails/rails_boilerplate/templates/app/jobs/application_job.rb.erb +7 -0
  27. data/lib/webamm_to_rails/rails_boilerplate/templates/app/mailers/application_mailer.rb.erb +4 -0
  28. data/lib/webamm_to_rails/rails_boilerplate/templates/app/models/application_record.rb.erb +3 -0
  29. data/lib/webamm_to_rails/rails_boilerplate/templates/app/views/layouts/application.html.erb +44 -0
  30. data/lib/webamm_to_rails/rails_boilerplate/templates/app/views/layouts/mailer.html.erb +13 -0
  31. data/lib/webamm_to_rails/rails_boilerplate/templates/app/views/layouts/mailer.text.erb +1 -0
  32. data/lib/webamm_to_rails/rails_boilerplate/templates/app/views/pwa/manifest.json.erb +22 -0
  33. data/lib/webamm_to_rails/rails_boilerplate/templates/app/views/pwa/service-worker.js.erb +26 -0
  34. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/brakeman.erb +7 -0
  35. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/bundle.erb +109 -0
  36. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/dev.erb +11 -0
  37. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/docker-entrypoint.erb +13 -0
  38. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/rails.erb +4 -0
  39. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/rake.erb +4 -0
  40. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/rubocop.erb +8 -0
  41. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/setup.erb +40 -0
  42. data/lib/webamm_to_rails/rails_boilerplate/templates/config/application.rb.erb +42 -0
  43. data/lib/webamm_to_rails/rails_boilerplate/templates/config/boot.rb.erb +4 -0
  44. data/lib/webamm_to_rails/rails_boilerplate/templates/config/cable.yml.erb +11 -0
  45. data/lib/webamm_to_rails/rails_boilerplate/templates/config/credentials.yml.enc.erb +1 -0
  46. data/lib/webamm_to_rails/rails_boilerplate/templates/config/database.yml.erb +85 -0
  47. data/lib/webamm_to_rails/rails_boilerplate/templates/config/environment.rb.erb +5 -0
  48. data/lib/webamm_to_rails/rails_boilerplate/templates/config/environments/development.rb.erb +84 -0
  49. data/lib/webamm_to_rails/rails_boilerplate/templates/config/environments/production.rb.erb +102 -0
  50. data/lib/webamm_to_rails/rails_boilerplate/templates/config/environments/test.rb.erb +67 -0
  51. data/lib/webamm_to_rails/rails_boilerplate/templates/config/initializers/assets.rb.erb +12 -0
  52. data/lib/webamm_to_rails/rails_boilerplate/templates/config/initializers/content_security_policy.rb.erb +25 -0
  53. data/lib/webamm_to_rails/rails_boilerplate/templates/config/initializers/filter_parameter_logging.rb.erb +8 -0
  54. data/lib/webamm_to_rails/rails_boilerplate/templates/config/initializers/inflections.rb.erb +16 -0
  55. data/lib/webamm_to_rails/rails_boilerplate/templates/config/initializers/permissions_policy.rb.erb +13 -0
  56. data/lib/webamm_to_rails/rails_boilerplate/templates/config/locales/en.yml.erb +31 -0
  57. data/lib/webamm_to_rails/rails_boilerplate/templates/config/master.key.erb +1 -0
  58. data/lib/webamm_to_rails/rails_boilerplate/templates/config/puma.rb.erb +33 -0
  59. data/lib/webamm_to_rails/rails_boilerplate/templates/config/storage.yml.erb +34 -0
  60. data/lib/webamm_to_rails/rails_boilerplate/templates/config.ru.erb +6 -0
  61. data/lib/webamm_to_rails/rails_boilerplate/templates/db/seeds.rb.erb +9 -0
  62. data/lib/webamm_to_rails/rails_boilerplate/templates/dockerignore.erb +48 -0
  63. data/lib/webamm_to_rails/rails_boilerplate/templates/gitattributes.erb +9 -0
  64. data/lib/webamm_to_rails/rails_boilerplate/templates/github/dependabot.yml.erb +0 -0
  65. data/lib/webamm_to_rails/rails_boilerplate/templates/github/workflows/ci.yml.erb +38 -0
  66. data/lib/webamm_to_rails/rails_boilerplate/templates/gitignore.erb +40 -0
  67. data/lib/webamm_to_rails/rails_boilerplate/templates/node-version.erb +1 -0
  68. data/lib/webamm_to_rails/rails_boilerplate/templates/public/404.html.erb +67 -0
  69. data/lib/webamm_to_rails/rails_boilerplate/templates/public/406-unsupported-browser.html.erb +66 -0
  70. data/lib/webamm_to_rails/rails_boilerplate/templates/public/422.html.erb +67 -0
  71. data/lib/webamm_to_rails/rails_boilerplate/templates/public/500.html.erb +66 -0
  72. data/lib/webamm_to_rails/rails_boilerplate/templates/public/icon.png.erb +0 -0
  73. data/lib/webamm_to_rails/rails_boilerplate/templates/public/icon.svg.erb +3 -0
  74. data/lib/webamm_to_rails/rails_boilerplate/templates/public/robots.txt.erb +1 -0
  75. data/lib/webamm_to_rails/rails_boilerplate/templates/rubocop.yml.erb +8 -0
  76. data/lib/webamm_to_rails/rails_boilerplate/templates/ruby-version.erb +1 -0
  77. data/lib/webamm_to_rails/rails_boilerplate/templates/tailwind.config.js.erb +8 -0
  78. data/lib/webamm_to_rails/sources/controllers/actions/create_definition/presenter.rb +50 -0
  79. data/lib/webamm_to_rails/sources/controllers/actions/create_definition/template.erb +9 -0
  80. data/lib/webamm_to_rails/sources/controllers/actions/definition.rb +66 -0
  81. data/lib/webamm_to_rails/sources/controllers/actions/destroy_definition/presenter.rb +52 -0
  82. data/lib/webamm_to_rails/sources/controllers/actions/destroy_definition/template.erb +6 -0
  83. data/lib/webamm_to_rails/sources/controllers/actions/edit_definition/presenter.rb +40 -0
  84. data/lib/webamm_to_rails/sources/controllers/actions/edit_definition/template.erb +3 -0
  85. data/lib/webamm_to_rails/sources/controllers/actions/index_definition/presenter.rb +40 -0
  86. data/lib/webamm_to_rails/sources/controllers/actions/index_definition/template.erb +3 -0
  87. data/lib/webamm_to_rails/sources/controllers/actions/new_definition/presenter.rb +40 -0
  88. data/lib/webamm_to_rails/sources/controllers/actions/new_definition/template.erb +3 -0
  89. data/lib/webamm_to_rails/sources/controllers/actions/show_definition/presenter.rb +40 -0
  90. data/lib/webamm_to_rails/sources/controllers/actions/show_definition/template.erb +3 -0
  91. data/lib/webamm_to_rails/sources/controllers/actions/strong_parameters_definition/presenter.rb +50 -0
  92. data/lib/webamm_to_rails/sources/controllers/actions/strong_parameters_definition/template.erb +3 -0
  93. data/lib/webamm_to_rails/sources/controllers/actions/update_definition/presenter.rb +54 -0
  94. data/lib/webamm_to_rails/sources/controllers/actions/update_definition/template.erb +9 -0
  95. data/lib/webamm_to_rails/sources/controllers/application_controller/authentication/devise_groups/presenter.rb +49 -0
  96. data/lib/webamm_to_rails/sources/controllers/application_controller/authentication/devise_groups_definition/presenter.rb +30 -0
  97. data/lib/webamm_to_rails/sources/controllers/application_controller/definition.rb +36 -0
  98. data/lib/webamm_to_rails/sources/controllers/application_controller/template.erb +5 -0
  99. data/lib/webamm_to_rails/sources/controllers/class_definition/presenter.rb +17 -0
  100. data/lib/webamm_to_rails/sources/controllers/definition.rb +44 -0
  101. data/lib/webamm_to_rails/sources/controllers/filters/definition.rb +32 -0
  102. data/lib/webamm_to_rails/sources/controllers/filters/devise_definition/presenter.rb +55 -0
  103. data/lib/webamm_to_rails/sources/controllers/template.erb +17 -0
  104. data/lib/webamm_to_rails/sources/gemfile/default_set.rb +27 -0
  105. data/lib/webamm_to_rails/sources/gemfile/definition.rb +31 -0
  106. data/lib/webamm_to_rails/sources/gemfile/gem.rb +8 -0
  107. data/lib/webamm_to_rails/sources/gemfile/gem_definition/presenter.rb +22 -0
  108. data/lib/webamm_to_rails/sources/gemfile/project_set.rb +21 -0
  109. data/lib/webamm_to_rails/sources/gemfile/sets/authentication.rb +34 -0
  110. data/lib/webamm_to_rails/sources/gemfile/template.erb +17 -0
  111. data/lib/webamm_to_rails/sources/helpers/definitions.rb +21 -0
  112. data/lib/webamm_to_rails/sources/helpers/devise/presenter.rb +27 -0
  113. data/lib/webamm_to_rails/sources/helpers/devise/qr_code_helper/presenter.rb +19 -0
  114. data/lib/webamm_to_rails/sources/helpers/devise/qr_code_helper/template.erb +22 -0
  115. data/lib/webamm_to_rails/sources/initializers/definitions.rb +26 -0
  116. data/lib/webamm_to_rails/sources/initializers/devise_definition/presenter.rb +27 -0
  117. data/lib/webamm_to_rails/sources/initializers/devise_definition/template.erb +397 -0
  118. data/lib/webamm_to_rails/sources/migrations/active_storage_definition/presenter.rb +29 -0
  119. data/lib/webamm_to_rails/sources/migrations/active_storage_definition/template.erb +57 -0
  120. data/lib/webamm_to_rails/sources/migrations/associations.rb +49 -0
  121. data/lib/webamm_to_rails/sources/migrations/class_definition/presenter.rb +17 -0
  122. data/lib/webamm_to_rails/sources/migrations/column_definition/presenter.rb +38 -0
  123. data/lib/webamm_to_rails/sources/migrations/columns.rb +33 -0
  124. data/lib/webamm_to_rails/sources/migrations/definition.rb +52 -0
  125. data/lib/webamm_to_rails/sources/migrations/devise/definition.rb +278 -0
  126. data/lib/webamm_to_rails/sources/migrations/files_list.rb +98 -0
  127. data/lib/webamm_to_rails/sources/migrations/index_definition/presenter.rb +34 -0
  128. data/lib/webamm_to_rails/sources/migrations/indices.rb +33 -0
  129. data/lib/webamm_to_rails/sources/migrations/table_definition/presenter.rb +21 -0
  130. data/lib/webamm_to_rails/sources/migrations/template.erb +12 -0
  131. data/lib/webamm_to_rails/sources/migrations/uuid_definition/presenter.rb +29 -0
  132. data/lib/webamm_to_rails/sources/migrations/uuid_definition/template.erb +5 -0
  133. data/lib/webamm_to_rails/sources/models/association_definition/presenter.rb +49 -0
  134. data/lib/webamm_to_rails/sources/models/associations.rb +113 -0
  135. data/lib/webamm_to_rails/sources/models/attachment_definition/presenter.rb +21 -0
  136. data/lib/webamm_to_rails/sources/models/attachments.rb +25 -0
  137. data/lib/webamm_to_rails/sources/models/class_definition/presenter.rb +17 -0
  138. data/lib/webamm_to_rails/sources/models/concerns.rb +27 -0
  139. data/lib/webamm_to_rails/sources/models/definition.rb +57 -0
  140. data/lib/webamm_to_rails/sources/models/devise_definition/presenter.rb +49 -0
  141. data/lib/webamm_to_rails/sources/models/enum_definition/presenter.rb +19 -0
  142. data/lib/webamm_to_rails/sources/models/enums.rb +25 -0
  143. data/lib/webamm_to_rails/sources/models/template.erb +7 -0
  144. data/lib/webamm_to_rails/sources/package_json/definition.rb +27 -0
  145. data/lib/webamm_to_rails/sources/package_json/template.erb +21 -0
  146. data/lib/webamm_to_rails/sources/routes/authentication_definition/presenter.rb +21 -0
  147. data/lib/webamm_to_rails/sources/routes/definition.rb +38 -0
  148. data/lib/webamm_to_rails/sources/routes/resource_definition/presenter.rb +25 -0
  149. data/lib/webamm_to_rails/sources/routes/template.erb +14 -0
  150. data/lib/webamm_to_rails/sources/views/definition.rb +28 -0
  151. data/lib/webamm_to_rails/sources/views/devise/invitable/presenter.rb +31 -0
  152. data/lib/webamm_to_rails/sources/views/devise/invitable/templates/invitations/edit.html.erb +38 -0
  153. data/lib/webamm_to_rails/sources/views/devise/invitable/templates/invitations/new.html.erb +31 -0
  154. data/lib/webamm_to_rails/sources/views/devise/invitable/templates/mailer/invitation_instructions.html.erb +23 -0
  155. data/lib/webamm_to_rails/sources/views/devise/otp/presenter.rb +32 -0
  156. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_credentials/refresh.html.erb +19 -0
  157. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_credentials/show.html.erb +70 -0
  158. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/_token_secret.html.erb +21 -0
  159. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/_trusted_devices.html.erb +12 -0
  160. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/edit.html.erb +48 -0
  161. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/recovery.html.erb +21 -0
  162. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/recovery_codes.html.erb +3 -0
  163. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/show.html.erb +21 -0
  164. data/lib/webamm_to_rails/sources/views/devise/presenter.rb +37 -0
  165. data/lib/webamm_to_rails/sources/views/devise/standard/presenter.rb +39 -0
  166. data/lib/webamm_to_rails/sources/views/devise/standard/templates/confirmations/new.html.erb +31 -0
  167. data/lib/webamm_to_rails/sources/views/devise/standard/templates/mailer/confirmation_instructions.html.erb +17 -0
  168. data/lib/webamm_to_rails/sources/views/devise/standard/templates/mailer/email_changed.html.erb +7 -0
  169. data/lib/webamm_to_rails/sources/views/devise/standard/templates/mailer/password_change.html.erb +3 -0
  170. data/lib/webamm_to_rails/sources/views/devise/standard/templates/mailer/reset_password_instructions.html.erb +22 -0
  171. data/lib/webamm_to_rails/sources/views/devise/standard/templates/passwords/edit.html.erb +36 -0
  172. data/lib/webamm_to_rails/sources/views/devise/standard/templates/passwords/new.html.erb +31 -0
  173. data/lib/webamm_to_rails/sources/views/devise/standard/templates/registrations/edit.html.erb +43 -0
  174. data/lib/webamm_to_rails/sources/views/devise/standard/templates/registrations/new.html.erb +39 -0
  175. data/lib/webamm_to_rails/sources/views/devise/standard/templates/sessions/new.html.erb +23 -0
  176. data/lib/webamm_to_rails/sources/views/devise/standard/templates/shared/_links.html.erb +27 -0
  177. data/lib/webamm_to_rails/sources/views/resource/edit_definition/presenter.rb +41 -0
  178. data/lib/webamm_to_rails/sources/views/resource/edit_definition/template.erb +1 -0
  179. data/lib/webamm_to_rails/sources/views/resource/form_definition/presenter.rb +50 -0
  180. data/lib/webamm_to_rails/sources/views/resource/form_definition/template.erb +82 -0
  181. data/lib/webamm_to_rails/sources/views/resource/index_definition/presenter.rb +69 -0
  182. data/lib/webamm_to_rails/sources/views/resource/index_definition/template.erb +78 -0
  183. data/lib/webamm_to_rails/sources/views/resource/new_definition/presenter.rb +41 -0
  184. data/lib/webamm_to_rails/sources/views/resource/new_definition/template.erb +1 -0
  185. data/lib/webamm_to_rails/sources/views/resource/presenter.rb +41 -0
  186. data/lib/webamm_to_rails/sources/views/resource/show_definition/presenter.rb +61 -0
  187. data/lib/webamm_to_rails/sources/views/resource/show_definition/template.erb +34 -0
  188. data/lib/webamm_to_rails/utils/format_code.rb +11 -0
  189. data/lib/webamm_to_rails/utils/format_template.rb +11 -0
  190. data/lib/webamm_to_rails/version.rb +5 -0
  191. data/lib/webamm_to_rails.rb +112 -0
  192. data/webamm_to_rails.gemspec +28 -0
  193. metadata +332 -0
@@ -0,0 +1 @@
1
+ <%%= render "form", <%= single_record_name %>: @<%= single_record_name %> %>
@@ -0,0 +1,50 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Views
4
+ module Resource
5
+ module FormDefinition
6
+ class Presenter
7
+ def initialize(crud_definition:, waml_definition:)
8
+ @crud_definition = crud_definition
9
+ @waml_definition = waml_definition
10
+ end
11
+
12
+ def render?
13
+ @crud_definition.actions.find { |action| action.name == 'create' || action.name == 'update' }.present?
14
+ end
15
+
16
+ def render
17
+ template_path = File.expand_path('template.erb', __dir__)
18
+ template_content = File.read(template_path)
19
+ raw_content = ERB.new(template_content, trim_mode: '-').result(instance_eval { binding })
20
+
21
+ ::WebammToRails::Utils::FormatTemplate.call(raw_content)
22
+ end
23
+
24
+ def path_name
25
+ "app/views/#{resource_name}/_form.html.erb"
26
+ end
27
+
28
+ private
29
+
30
+ def singular_resource_name
31
+ resource_name.singularize
32
+ end
33
+
34
+ def resource_name
35
+ @crud_definition.table
36
+ end
37
+
38
+ def columns
39
+ @waml_definition.database.schema.find { |schema| schema.table == @crud_definition.table }.columns
40
+ end
41
+
42
+ def class_name
43
+ resource_name.classify
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,82 @@
1
+ <div class="max-w-4xl px-4 py-10 sm:px-6 lg:px-8 lg:py-14 mx-auto">
2
+ <%%= form_with(model: <%= singular_resource_name %>) do |form| %>
3
+ <div class="bg-white rounded-xl shadow dark:bg-neutral-900">
4
+ <div class="pt-0 p-4 sm:pt-0 sm:p-7">
5
+ <div class="space-y-4 sm:space-y-6">
6
+ <%% if <%= singular_resource_name %>.errors.any? %>
7
+ <div class="rounded-md bg-red-50 p-4 mb-4">
8
+ <div class="flex">
9
+ <div class="flex-shrink-0">
10
+ <svg class="h-5 w-5 text-red-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
11
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z" clip-rule="evenodd" />
12
+ </svg>
13
+ </div>
14
+ <div class="ml-3">
15
+ <h3 class="text-sm font-medium text-red-800"><%%= pluralize(<%= singular_resource_name %>.errors.count, "error") %> prohibited this plan from being saved:</h3>
16
+ <div class="mt-2 text-sm text-red-700">
17
+ <ul role="list" class="list-disc space-y-1 pl-5">
18
+ <%% <%= singular_resource_name %>.errors.each do |error| %>
19
+ <li><%%= error.full_message %></li>
20
+ <%% end %>
21
+ </ul>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ <%% end %>
27
+ <% columns.each do |column| %>
28
+ <% if column.type == 'string' %>
29
+ <div class="space-y-2">
30
+ <label class="inline-block text-sm font-medium text-gray-800 mt-2.5 dark:text-neutral-200"><%= column.name.humanize %>:</label>
31
+ <%%= form.text_field :<%= column.name %>, class: 'py-2 px-3 pe-11 block w-full border-2 border-gray-200 shadow-sm text-sm rounded-lg' %>
32
+ </div>
33
+ <% elsif column.type == 'integer' || column.type == 'float' %>
34
+ <div class="space-y-2">
35
+ <label class="inline-block text-sm font-medium text-gray-800 mt-2.5 dark:text-neutral-200"><%= column.name.humanize %>:</label>
36
+ <%%= form.number_field :<%= column.name %>, class: 'py-2 px-3 pe-11 block w-full border-2 border-gray-200 shadow-sm text-sm rounded-lg' %>
37
+ </div>
38
+ <% elsif column.type == 'boolean' %>
39
+ <div class="space-y-2">
40
+ <label class="inline-block text-sm font-medium text-gray-800 mt-2.5 dark:text-neutral-200"><%= column.name.humanize %>:</label>
41
+ <%%= form.select :<%= column.name %>, options_for_select([['Yes', true], ['No', false]], <%= singular_resource_name %>.<%= column.name %>), {}, class: 'py-2 px-3 pe-9 block w-full border-gray-200 shadow-sm rounded-lg text-sm' %>
42
+ </div>
43
+ <% elsif column.type == 'text' %>
44
+ <div class="space-y-2">
45
+ <label class="inline-block text-sm font-medium text-gray-800 mt-2.5 dark:text-neutral-200"><%= column.name.humanize %>:</label>
46
+ <%%= form.text_area :<%= column.name %>, class: 'py-2 px-3 block w-full border-2 border-gray-200 rounded-lg text-sm' %>
47
+ </div>
48
+ <% elsif column.type == 'datetime' %>
49
+ <div class="space-y-2">
50
+ <label class="inline-block text-sm font-medium text-gray-800 mt-2.5 dark:text-neutral-200"><%= column.name.humanize %>:</label>
51
+ <%%= form.datetime_field :<%= column.name %>, class: 'py-2 px-3 pe-11 block w-full border-2 border-gray-200 shadow-sm text-sm rounded-lg' %>
52
+ </div>
53
+ <% elsif column.type == 'time' %>
54
+ <div class="space-y-2">
55
+ <label class="inline-block text-sm font-medium text-gray-800 mt-2.5 dark:text-neutral-200"><%= column.name.humanize %>:</label>
56
+ <%%= form.time_field :<%= column.name %>, class: 'py-2 px-3 pe-11 block w-full border-2 border-gray-200 shadow-sm text-sm rounded-lg' %>
57
+ </div>
58
+ <% elsif column.type == 'date' %>
59
+ <div class="space-y-2">
60
+ <label class="inline-block text-sm font-medium text-gray-800 mt-2.5 dark:text-neutral-200"><%= column.name.humanize %>:</label>
61
+ <%%= form.date_field :<%= column.name %>, class: 'py-2 px-3 pe-11 block w-full border-2 border-gray-200 shadow-sm text-sm rounded-lg' %>
62
+ </div>
63
+ <% elsif column.type == 'enum_column' %>
64
+ <div class="space-y-2">
65
+ <label class="inline-block text-sm font-medium text-gray-800 mt-2.5 dark:text-neutral-200"><%= column.name.humanize %>:</label>
66
+ <%%= form.select :<%= column.name %>, options_for_select(<%= class_name %>.<%= column.name.pluralize %>.keys, <%= singular_resource_name %>.<%= column.name %>), {}, class: 'py-2 px-3 pe-9 block w-full border-gray-200 shadow-sm rounded-lg text-sm' %>
67
+ </div>
68
+ <% elsif column.type == 'file' && column.name.singularize == column.name %>
69
+ <div class="space-y-2">
70
+ <label class="inline-block text-sm font-medium text-gray-800 mt-2.5 dark:text-neutral-200"><%= column.name.humanize %>:</label>
71
+ <%%= form.file_field :<%= column.name %>, class: 'block w-full text-sm text-gray-500 file:me-4 file:py-2 file:px-4 file:rounded-lg file:border-0 file:text-sm file:font-semibold file:bg-blue-600 file:text-white' %>
72
+ </div>
73
+ <% end %>
74
+ <% end %>
75
+ </div>
76
+ <div class="mt-5 flex justify-center gap-x-2">
77
+ <%%= form.submit 'Submit', class: 'py-3 px-4 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-blue-600 text-white hover:bg-blue-700 focus:outline-none focus:bg-blue-700 disabled:opacity-50 disabled:pointer-events-none' %>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ <%% end %>
82
+ </div>
@@ -0,0 +1,69 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Views
4
+ module Resource
5
+ module IndexDefinition
6
+ class Presenter
7
+ def initialize(crud_definition:)
8
+ @crud_definition = crud_definition
9
+ end
10
+
11
+ def render?
12
+ @crud_definition.actions.find { |action| action.name == 'index' }.present?
13
+ end
14
+
15
+ def render
16
+ template_path = File.expand_path('template.erb', __dir__)
17
+ template_content = File.read(template_path)
18
+ raw_content = ERB.new(template_content, trim_mode: '-').result(instance_eval { binding })
19
+
20
+ ::WebammToRails::Utils::FormatTemplate.call(raw_content)
21
+ end
22
+
23
+ def path_name
24
+ "app/views/#{resource_name}/index.html.erb"
25
+ end
26
+
27
+ private
28
+
29
+ def resource_name
30
+ @crud_definition.table
31
+ end
32
+
33
+ def title
34
+ @crud_definition.table.humanize
35
+ end
36
+
37
+ def enabled?(view_action)
38
+ @crud_definition.actions.find { |action| action.name == view_action }.present?
39
+ end
40
+
41
+ def new_resource_path
42
+ "new_#{resource_name.singularize}_path"
43
+ end
44
+
45
+ def edit_resource_path
46
+ "edit_#{resource_name.singularize}_path(#{resource_name.singularize})"
47
+ end
48
+
49
+ def resource_path
50
+ "#{resource_name.singularize}_path(#{resource_name.singularize})"
51
+ end
52
+
53
+ def singular_variable
54
+ resource_name.singularize
55
+ end
56
+
57
+ def plural_variable
58
+ resource_name
59
+ end
60
+
61
+ def model_attributes
62
+ @crud_definition.actions.find { |action| action.name == 'index' }.options.model_attributes
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,78 @@
1
+ <div class="mb-5 pb-5 flex justify-between items-center border-b border-gray-200 dark:border-neutral-700">
2
+ <div>
3
+ <h2 class="text-2xl font-semibold text-gray-800 dark:text-neutral-200"><%= title %></h2>
4
+ </div>
5
+ <% if enabled?('create') %>
6
+ <div class="inline-flex gap-x-2">
7
+ <%%= link_to('+ Add', <%= new_resource_path %>, class: 'py-2 px-3 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-gray-200 bg-white text-gray-800 shadow-sm hover:bg-gray-50 disabled:opacity-50 disabled:pointer-events-none focus:outline-none focus:bg-gray-50 dark:bg-transparent dark:border-neutral-700 dark:text-neutral-300 dark:hover:bg-neutral-800 dark:focus:bg-neutral-800') %>
8
+ </div>
9
+ <% end %>
10
+ </div>
11
+ <div class="max-w-[85rem] px-4 py-10 sm:px-6 lg:px-8 lg:py-14 mx-auto">
12
+ <div class="flex flex-col">
13
+ <div class="-m-1.5 overflow-x-auto">
14
+ <div class="p-1.5 min-w-full inline-block align-middle">
15
+ <div class="bg-white border border-gray-200 rounded-xl shadow-sm overflow-hidden dark:bg-neutral-800 dark:border-neutral-700">
16
+ <table class="min-w-full divide-y divide-gray-200 dark:divide-neutral-700">
17
+ <thead class="bg-gray-50 dark:bg-neutral-800">
18
+ <tr>
19
+ <% model_attributes.each do |attribute| %>
20
+ <th scope="col" class="px-6 py-3 text-start">
21
+ <div class="flex items-center gap-x-2">
22
+ <span class="text-xs font-semibold uppercase tracking-wide text-gray-800 dark:text-neutral-200">
23
+ <%= attribute.capitalize %>
24
+ </span>
25
+ </div>
26
+ </th>
27
+ <% end %>
28
+ <% if enabled?('show') %>
29
+ <th scope="col" class="px-6 py-3 text-end"></th>
30
+ <% end %>
31
+ <% if enabled?('update') %>
32
+ <th scope="col" class="px-6 py-3 text-end"></th>
33
+ <% end %>
34
+ <% if enabled?('destroy') %>
35
+ <th scope="col" class="px-6 py-3 text-end"></th>
36
+ <% end %>
37
+ </tr>
38
+ </thead>
39
+ <tbody class="divide-y divide-gray-200 dark:divide-neutral-700">
40
+ <%% @<%= plural_variable %>.each do |<%= singular_variable %>| %>
41
+ <tr>
42
+ <% model_attributes.each do |attribute| %>
43
+ <td class="size-px whitespace-nowrap">
44
+ <div class="px-6 py-3">
45
+ <span class="text-sm text-gray-500"><%%= <%= singular_variable %>.<%= attribute %> %></span>
46
+ </div>
47
+ </td>
48
+ <% end %>
49
+ <% if enabled?('show') %>
50
+ <td class="size-px whitespace-nowrap">
51
+ <div class="px-6 py-1.5">
52
+ <%%= link_to('Show', <%= resource_path %>, class: 'inline-flex items-center gap-x-1 text-sm text-blue-600 decoration-2 hover:underline focus:outline-none focus:underline font-medium dark:text-blue-500') %>
53
+ </div>
54
+ </td>
55
+ <% end %>
56
+ <% if enabled?('update') %>
57
+ <td class="size-px whitespace-nowrap">
58
+ <div class="px-6 py-1.5">
59
+ <%%= link_to('Edit', <%= edit_resource_path %>, class: 'inline-flex items-center gap-x-1 text-sm text-blue-600 decoration-2 hover:underline focus:outline-none focus:underline font-medium dark:text-blue-500') %>
60
+ </div>
61
+ </td>
62
+ <% end %>
63
+ <% if enabled?('destroy') %>
64
+ <td class="size-px whitespace-nowrap">
65
+ <div class="px-6 py-1.5">
66
+ <%%= button_to('Delete', <%= resource_path %>, method: :delete, data: { turbo: false },class: 'inline-flex items-center gap-x-1 text-sm text-blue-600 decoration-2 hover:underline focus:outline-none focus:underline font-medium dark:text-blue-500') %>
67
+ </div>
68
+ </td>
69
+ <% end %>
70
+ </tr>
71
+ <%% end %>
72
+ </tbody>
73
+ </table>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </div>
@@ -0,0 +1,41 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Views
4
+ module Resource
5
+ module NewDefinition
6
+ class Presenter
7
+ def initialize(crud_definition:)
8
+ @crud_definition = crud_definition
9
+ end
10
+
11
+ def render?
12
+ @crud_definition.actions.find { |action| action.name == 'create' }.present?
13
+ end
14
+
15
+ def render
16
+ template_path = File.expand_path('template.erb', __dir__)
17
+ template_content = File.read(template_path)
18
+ raw_content = ERB.new(template_content, trim_mode: '-').result(instance_eval { binding })
19
+
20
+ ::WebammToRails::Utils::FormatTemplate.call(raw_content)
21
+ end
22
+
23
+ def path_name
24
+ "app/views/#{resource_name}/new.html.erb"
25
+ end
26
+
27
+ private
28
+
29
+ def resource_name
30
+ @crud_definition.table
31
+ end
32
+
33
+ def single_record_name
34
+ @crud_definition.table.singularize
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1 @@
1
+ <%%= render "form", <%= single_record_name %>: @<%= single_record_name %> %>
@@ -0,0 +1,41 @@
1
+ require_relative 'index_definition/presenter'
2
+ require_relative 'edit_definition/presenter'
3
+ require_relative 'new_definition/presenter'
4
+ require_relative 'show_definition/presenter'
5
+ require_relative 'form_definition/presenter'
6
+
7
+ module WebammToRails
8
+ module Sources
9
+ module Views
10
+ module Resource
11
+ class Presenter
12
+ def initialize(crud_definition:, waml_definition:)
13
+ @crud_definition = crud_definition
14
+ @waml_definition = waml_definition
15
+ end
16
+
17
+ def collection
18
+ views.select(&:render?).map do |view|
19
+ {
20
+ path: view.path_name,
21
+ content: view.render
22
+ }
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def views
29
+ [
30
+ ::WebammToRails::Sources::Views::Resource::IndexDefinition::Presenter.new(crud_definition: @crud_definition),
31
+ ::WebammToRails::Sources::Views::Resource::EditDefinition::Presenter.new(crud_definition: @crud_definition),
32
+ ::WebammToRails::Sources::Views::Resource::NewDefinition::Presenter.new(crud_definition: @crud_definition),
33
+ ::WebammToRails::Sources::Views::Resource::ShowDefinition::Presenter.new(crud_definition: @crud_definition),
34
+ ::WebammToRails::Sources::Views::Resource::FormDefinition::Presenter.new(crud_definition: @crud_definition, waml_definition: @waml_definition),
35
+ ]
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,61 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Views
4
+ module Resource
5
+ module ShowDefinition
6
+ class Presenter
7
+ def initialize(crud_definition:)
8
+ @crud_definition = crud_definition
9
+ end
10
+
11
+ def render?
12
+ @crud_definition.actions.find { |action| action.name == 'show' }.present?
13
+ end
14
+
15
+ def render
16
+ template_path = File.expand_path('template.erb', __dir__)
17
+ template_content = File.read(template_path)
18
+ raw_content = ERB.new(template_content, trim_mode: '-').result(instance_eval { binding })
19
+
20
+ ::WebammToRails::Utils::FormatTemplate.call(raw_content)
21
+ end
22
+
23
+ def path_name
24
+ "app/views/#{resource_name}/show.html.erb"
25
+ end
26
+
27
+ private
28
+
29
+ def resource_name
30
+ @crud_definition.table
31
+ end
32
+
33
+ def title
34
+ @crud_definition.table.singularize.humanize
35
+ end
36
+
37
+ def enabled?(view_action)
38
+ @crud_definition.actions.find { |action| action.name == view_action }.present?
39
+ end
40
+
41
+ def resource_singular_name
42
+ @crud_definition.table.singularize
43
+ end
44
+
45
+ def edit_resource_path
46
+ "edit_#{resource_name.singularize}_path(@#{resource_name.singularize})"
47
+ end
48
+
49
+ def index_resource_path
50
+ "#{@crud_definition.table}_path"
51
+ end
52
+
53
+ def model_attributes
54
+ @crud_definition.actions.find { |action| action.name == 'show' }.options.model_attributes
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,34 @@
1
+ <div class="p-4 sm:p-7 overflow-y-auto">
2
+ <div class="text-center">
3
+ <h3 id="hs-ai-modal-label" class="text-lg font-semibold text-gray-800 dark:text-neutral-200">
4
+ <%= title %>
5
+ </h3>
6
+ <p class="text-sm text-gray-500 dark:text-neutral-500">
7
+ ID: <%%= @<%= resource_singular_name %>.id %>
8
+ </p>
9
+ </div>
10
+ <div class="mt-5 sm:mt-10">
11
+ <h4 class="text-xs font-semibold uppercase text-gray-800 dark:text-neutral-200">Details</h4>
12
+ <ul class="mt-3 flex flex-col">
13
+ <% model_attributes.each do |attribute| %>
14
+ <li class="inline-flex items-center gap-x-2 py-3 px-4 text-sm border text-gray-800 -mt-px first:rounded-t-lg first:mt-0 last:rounded-b-lg dark:border-neutral-700 dark:text-neutral-200">
15
+ <div class="flex items-center justify-between w-full">
16
+ <span><%= attribute.capitalize %></span>
17
+ <span><%%= @<%= resource_singular_name %>.<%= attribute %> %></span>
18
+ </div>
19
+ </li>
20
+ <% end %>
21
+ </ul>
22
+ </div>
23
+ <div class="mt-5 flex justify-end gap-x-2">
24
+ <% if enabled?('index') %>
25
+ <%%= link_to "Back to list", <%= index_resource_path %>, class: "py-2 px-3 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-gray-200 bg-white text-gray-800 shadow-sm hover:bg-gray-50 disabled:opacity-50 disabled:pointer-events-none focus:outline-none focus:bg-gray-50 dark:bg-transparent dark:border-neutral-700 dark:text-neutral-300 dark:hover:bg-neutral-800 dark:focus:bg-neutral-800" %>
26
+ <% end %>
27
+ <% if enabled?('update') %>
28
+ <%%= link_to "Edit", <%= edit_resource_path %>, class: "py-2 px-3 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-gray-200 bg-white text-gray-800 shadow-sm hover:bg-gray-50 disabled:opacity-50 disabled:pointer-events-none focus:outline-none focus:bg-gray-50 dark:bg-transparent dark:border-neutral-700 dark:text-neutral-300 dark:hover:bg-neutral-800 dark:focus:bg-neutral-800" %>
29
+ <% end %>
30
+ <% if enabled?('destroy') %>
31
+ <%%= button_to "Remove", @<%= resource_singular_name %>, method: :delete, data: { turbo: false },class: "py-2 px-3 inline-flex items-center gap-x-2 text-sm font-medium rounded-lg border border-transparent bg-red-600 text-white focus:outline-none focus:bg-blue-700 disabled:opacity-50 disabled:pointer-events-none" %>
32
+ <% end %>
33
+ </div>
34
+ </div>
@@ -0,0 +1,11 @@
1
+ require 'rufo'
2
+
3
+ module WebammToRails
4
+ module Utils
5
+ class FormatCode
6
+ def self.call(code)
7
+ Rufo.format(code)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'htmlbeautifier'
2
+
3
+ module WebammToRails
4
+ module Utils
5
+ class FormatTemplate
6
+ def self.call(raw_content)
7
+ HtmlBeautifier.beautify(raw_content)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WebammToRails
4
+ VERSION = '7.0.0'
5
+ end
@@ -0,0 +1,112 @@
1
+ require 'webamm'
2
+ require 'active_support/all'
3
+
4
+ require 'webamm_to_rails/utils/format_code'
5
+ require 'webamm_to_rails/utils/format_template'
6
+
7
+ require 'webamm_to_rails/version'
8
+ require 'webamm_to_rails/sources/models/definition'
9
+ require 'webamm_to_rails/sources/migrations/files_list'
10
+ require 'webamm_to_rails/sources/gemfile/definition'
11
+ require 'webamm_to_rails/sources/routes/definition'
12
+ require 'webamm_to_rails/sources/initializers/definitions'
13
+ require 'webamm_to_rails/sources/views/definition'
14
+ require 'webamm_to_rails/sources/helpers/definitions'
15
+ require 'webamm_to_rails/sources/package_json/definition'
16
+ require 'webamm_to_rails/features/definitions'
17
+ require 'webamm_to_rails/sources/controllers/definition'
18
+ require 'webamm_to_rails/sources/controllers/application_controller/definition'
19
+
20
+ require 'webamm_to_rails/rails_boilerplate/builder'
21
+
22
+ module WebammToRails
23
+ class << self
24
+ def generate(waml_json)
25
+ files = ::WebammToRails::RailsBoilerplate::Builder.call
26
+
27
+ waml_definition = ::Webamm::Definition.new(waml_json.deep_symbolize_keys)
28
+
29
+ # Models
30
+ waml_definition.database.schema.each do |table_schema|
31
+ model_code = ::WebammToRails::Sources::Models::Definition.new(
32
+ table_definition: table_schema, waml_definition: waml_definition
33
+ ).render
34
+
35
+ files << {
36
+ path: "app/models/#{table_schema.table.singularize}.rb",
37
+ content: model_code
38
+ }
39
+ end
40
+
41
+ # Controllers
42
+ waml_definition.database.crud.each do |crud_definition|
43
+ controller_code = ::WebammToRails::Sources::Controllers::Definition.new(
44
+ crud_definition: crud_definition, waml_definition: waml_definition
45
+ ).render
46
+
47
+ files << {
48
+ path: "app/controllers/#{crud_definition.table.pluralize}_controller.rb",
49
+ content: controller_code
50
+ }
51
+ end
52
+
53
+ files << {
54
+ path: 'app/controllers/application_controller.rb',
55
+ content: ::WebammToRails::Sources::Controllers::ApplicationController::Definition.new(
56
+ waml_definition: waml_definition
57
+ ).render
58
+ }
59
+
60
+ # package.json
61
+ files << {
62
+ path: 'package.json',
63
+ content: ::WebammToRails::Sources::PackageJson::Definition.new(
64
+ waml_definition: waml_definition
65
+ ).render
66
+ }
67
+
68
+ # Gemfile
69
+ files << {
70
+ path: 'Gemfile',
71
+ content: ::WebammToRails::Sources::Gemfile::Definition.new(
72
+ waml_definition: waml_definition
73
+ ).render
74
+ }
75
+
76
+ # Routes
77
+ files << {
78
+ path: 'config/routes.rb',
79
+ content: ::WebammToRails::Sources::Routes::Definition.new(
80
+ waml_definition: waml_definition
81
+ ).render
82
+ }
83
+
84
+ # Initializers
85
+ files |= ::WebammToRails::Sources::Initializers::Definitions.new(
86
+ waml_definition: waml_definition
87
+ ).collection
88
+
89
+ # Migrations
90
+ files |= ::WebammToRails::Sources::Migrations::FilesList.new(
91
+ waml_definition: waml_definition, database_tables: waml_definition.database.schema
92
+ ).collection
93
+
94
+ # Views
95
+ files |= ::WebammToRails::Sources::Views::Definition.new(
96
+ waml_definition: waml_definition
97
+ ).collection
98
+
99
+ # Helpers
100
+ files |= ::WebammToRails::Sources::Helpers::Definitions.new(
101
+ waml_definition: waml_definition
102
+ ).collection
103
+
104
+ # Features
105
+ files |= ::WebammToRails::Features::Definitions.new(
106
+ waml_definition: waml_definition
107
+ ).collection
108
+
109
+ files
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'webamm_to_rails/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'webamm_to_rails'
9
+ spec.authors = ['Paweł Dąbrowski']
10
+ spec.email = ['contact@paweldabrowski.com']
11
+ spec.license = 'MIT'
12
+ spec.version = WebammToRails::VERSION.dup
13
+ spec.summary = 'Library to convert WEBAMM definition to Ruby on Rails code'
14
+ spec.description = spec.summary
15
+ spec.files = Dir['README.md', 'webamm_to_rails.gemspec', 'lib/**/*']
16
+ spec.require_paths = ['lib']
17
+
18
+ spec.add_runtime_dependency 'activesupport', '7.2'
19
+ spec.add_runtime_dependency 'rufo', '0.18.0'
20
+ spec.add_runtime_dependency 'dry-struct', '1.6.0'
21
+ spec.add_runtime_dependency 'webamm', '0.0.1'
22
+ spec.add_runtime_dependency 'htmlbeautifier', '1.4.3'
23
+
24
+ spec.add_development_dependency 'rspec'
25
+ spec.add_development_dependency 'pry'
26
+
27
+ spec.required_ruby_version = '>= 3.2.2'
28
+ end