pg_rails 7.0.2 → 7.0.4

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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/pg_associable/app/assets/js/asociable_controller.js +3 -4
  3. data/pg_associable/app/assets/js/asociable_inline_controller.js +28 -27
  4. data/pg_associable/app/assets/js/modal_controller.js +31 -44
  5. data/pg_associable/app/helpers/pg_associable/helpers.rb +2 -2
  6. data/pg_associable/app/views/pg_engine/base/_pg_associable_modal.html.slim +4 -2
  7. data/pg_associable/spec/pg_associable/helpers_spec.rb +24 -0
  8. data/pg_engine/app/controllers/pg_engine/base_controller.rb +0 -283
  9. data/pg_engine/app/controllers/pg_engine/require_sign_in.rb +9 -0
  10. data/pg_engine/app/controllers/pg_engine/resource_helper.rb +289 -0
  11. data/pg_engine/app/helpers/pg_engine/flash_helper.rb +3 -1
  12. data/pg_engine/app/helpers/pg_engine/route_helper.rb +2 -0
  13. data/pg_engine/app/views/pg_engine/base/index.html.slim +1 -1
  14. data/pg_engine/lib/pg_engine/engine.rb +5 -1
  15. data/pg_engine/lib/pg_engine/route_helpers.rb +12 -0
  16. data/pg_engine/lib/pg_engine/utils/pg_logger.rb +44 -0
  17. data/pg_engine/lib/pg_engine.rb +2 -12
  18. data/pg_layout/app/assets/stylesheets/sidebar.scss +4 -0
  19. data/pg_layout/app/views/layouts/pg_layout/devise.html.slim +2 -2
  20. data/pg_layout/app/views/layouts/pg_layout/layout.html.slim +2 -1
  21. data/pg_layout/app/views/pg_layout/_navbar.html.erb +0 -8
  22. data/pg_layout/index.js +3 -2
  23. data/pg_rails/lib/version.rb +1 -1
  24. data/pg_scaffold/lib/generators/pg_active_record/model/templates/admin.rb +1 -1
  25. data/pg_scaffold/lib/generators/pg_active_record/model/templates/model.rb +0 -1
  26. data/pg_scaffold/lib/generators/pg_resource_route/pg_resource_route_generator.rb +1 -1
  27. data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/controller_spec.rb +7 -0
  28. data/pg_scaffold/lib/generators/pg_scaffold/pg_scaffold_generator.rb +5 -9
  29. data/pg_scaffold/lib/generators/pg_scaffold/templates/controller.rb +6 -4
  30. data/pg_scaffold/spec/generators_spec.rb +55 -0
  31. metadata +8 -4
  32. data/pg_engine/app/controllers/pg_engine/signed_in_controller.rb +0 -7
  33. data/pg_engine/lib/pg_engine/utils/logueador.rb +0 -46
@@ -0,0 +1,289 @@
1
+ module PgEngine
2
+ module ResourceHelper
3
+ def self.included(clazz)
4
+ clazz.before_action :authenticate_user!
5
+ clazz.helper_method :atributos_para_listar
6
+ clazz.helper_method :atributos_para_mostrar
7
+ clazz.helper_method :current_page_size
8
+ clazz.helper_method :any_filter?
9
+ end
10
+
11
+ # Public endpoints
12
+ def abrir_modal
13
+ pg_respond_abrir_modal
14
+ end
15
+
16
+ def buscar
17
+ pg_respond_buscar
18
+ end
19
+
20
+ def index
21
+ @collection = filtros_y_policy atributos_para_buscar
22
+ @collection = sort_collection(@collection)
23
+ pg_respond_index
24
+ end
25
+
26
+ def show
27
+ add_breadcrumb instancia_modelo, instancia_modelo.target_object
28
+
29
+ pg_respond_show
30
+ end
31
+
32
+ def new
33
+ add_breadcrumb "Crear #{@clase_modelo.nombre_singular.downcase}"
34
+ end
35
+
36
+ def edit
37
+ add_breadcrumb instancia_modelo, instancia_modelo.target_object
38
+ add_breadcrumb 'Editando'
39
+ end
40
+
41
+ def create
42
+ pg_respond_create
43
+ end
44
+
45
+ def update
46
+ pg_respond_update
47
+ end
48
+
49
+ def destroy
50
+ url = namespaced_path(@clase_modelo)
51
+ pg_respond_destroy(instancia_modelo, url)
52
+ end
53
+ # End public endpoints
54
+
55
+ protected
56
+
57
+ def any_filter?
58
+ params.keys.reject { |a| a.in? %w[controller action page page_size order_by order_direction] }.any?
59
+ end
60
+
61
+ def current_page_size
62
+ if params[:page_size].present?
63
+ session[:page_size] = params[:page_size]
64
+ params[:page_size].to_i
65
+ else
66
+ default_page_size
67
+ end
68
+ end
69
+
70
+ def default_page_size
71
+ session[:page_size].present? ? session[:page_size].to_i : 10
72
+ end
73
+
74
+ def pg_respond_update(object: nil)
75
+ object ||= instancia_modelo
76
+ respond_to do |format|
77
+ if (@saved = object.save)
78
+ format.html { redirect_to object.decorate.target_object }
79
+ format.json { render json: object.decorate }
80
+ else
81
+ format.html { render :edit, status: :unprocessable_entity }
82
+ format.json { render json: object.errors, status: :unprocessable_entity }
83
+ end
84
+ end
85
+ end
86
+
87
+ def pg_respond_create(object: nil)
88
+ object ||= instancia_modelo
89
+ respond_to do |format|
90
+ if (@saved = object.save)
91
+ if params[:asociable]
92
+ format.turbo_stream do
93
+ render turbo_stream:
94
+ turbo_stream.update('pg-associable-form', <<~HTML
95
+ <div data-modal-target="response" data-response='#{object.decorate.to_json}'></div>
96
+ HTML
97
+ )
98
+ end
99
+ end
100
+ format.html do
101
+ if params[:save_and_next] == 'true'
102
+ new_path = "#{url_for(@clase_modelo)}/new"
103
+ redirect_to new_path, notice: "#{@clase_modelo.nombre_singular} creado."
104
+ else
105
+ redirect_to object.decorate.target_object
106
+ end
107
+ end
108
+ format.json { render json: object.decorate }
109
+ else
110
+ if params[:asociable]
111
+ format.turbo_stream do
112
+ render turbo_stream:
113
+ turbo_stream.update('pg-associable-form', partial: 'form', locals: { asociable: true })
114
+ end
115
+ end
116
+ format.html { render :new, status: :unprocessable_entity }
117
+ format.json { render json: object.errors.full_messages, status: :unprocessable_entity }
118
+ end
119
+ end
120
+ end
121
+
122
+ def pg_respond_index
123
+ respond_to do |format|
124
+ format.json { render json: @collection }
125
+ format.html { render_listing }
126
+ format.xlsx do
127
+ render xlsx: 'download',
128
+ filename: "#{@clase_modelo.nombre_plural.gsub(' ', '-').downcase}" \
129
+ "-#{Time.zone.now.strftime('%Y-%m-%d-%H.%M.%S')}.xlsx"
130
+ end
131
+ end
132
+ end
133
+
134
+ def pg_respond_show(object = nil)
135
+ respond_to do |format|
136
+ format.json { render json: object || instancia_modelo }
137
+ format.html
138
+ end
139
+ end
140
+
141
+ def pg_respond_destroy(model, redirect_url = nil)
142
+ if destroy_model(model)
143
+ respond_to do |format|
144
+ format.html do
145
+ if redirect_url.present?
146
+ redirect_to redirect_url, notice: 'Elemento borrado.', status: :see_other
147
+ else
148
+ redirect_back(fallback_location: root_path, notice: 'Elemento borrado.', status: 303)
149
+ end
150
+ end
151
+ format.json { head :no_content }
152
+ end
153
+ else
154
+ respond_to do |format|
155
+ format.html do
156
+ if model.respond_to?(:associated_elements) && model.associated_elements.present?
157
+ @model = model
158
+ render destroy_error_details_view
159
+ else
160
+ flash[:alert] = @error_message
161
+ # if redirect_url.present?
162
+ # redirect_to redirect_url
163
+ # else
164
+ redirect_back(fallback_location: root_path, status: 303)
165
+ # end
166
+ end
167
+ end
168
+ format.json { render json: { error: @error_message }, status: :unprocessable_entity }
169
+ end
170
+ end
171
+ end
172
+
173
+ # TODO: crear esta vista en pg_rails
174
+ def destroy_error_details_view
175
+ 'destroy_error_details'
176
+ end
177
+
178
+ def destroy_model(model)
179
+ @error_message = 'No se pudo eliminar el registro'
180
+ begin
181
+ destroy_method = model.respond_to?(:discard) ? :discard : :destroy
182
+ return true if model.send(destroy_method)
183
+
184
+ @error_message = model.errors.full_messages.join(', ')
185
+ false
186
+ rescue ActiveRecord::InvalidForeignKey => e
187
+ # class_name = /from table \"(?<table_name>[\p{L}_]*)\"/.match(e.message)[:table_name].singularize.camelcase
188
+ # # pk_id = /from table \"(?<pk_id>[\p{L}_]*)\"/.match(e.message)[:pk_id].singularize.camelcase
189
+ # clazz = Object.const_get class_name
190
+ # objects = clazz.where(model.class.table_name.singularize => model)
191
+ model_name = t("activerecord.models.#{model.class.name.underscore}")
192
+ @error_message = "#{model_name} no se pudo borrar porque tiene elementos asociados."
193
+ logger.debug e.message
194
+ end
195
+ false
196
+ end
197
+
198
+ def render_listing
199
+ @collection = @collection.page(params[:page]).per(current_page_size)
200
+ end
201
+
202
+ def buscar_instancia
203
+ if Object.const_defined?('FriendlyId') && @clase_modelo.is_a?(FriendlyId)
204
+ @clase_modelo.friendly.find(params[:id])
205
+ else
206
+ @clase_modelo.find(params[:id])
207
+ end
208
+ end
209
+
210
+ def set_instancia_modelo
211
+ if action_name.in? %w[new create]
212
+ self.instancia_modelo = @clase_modelo.new(modelo_params)
213
+ else
214
+ self.instancia_modelo = buscar_instancia
215
+
216
+ instancia_modelo.assign_attributes(modelo_params) if action_name.in? %w[update]
217
+ end
218
+
219
+ instancia_modelo.current_user = send(PgEngine.configuracion.current_user_method)
220
+
221
+ authorize instancia_modelo
222
+
223
+ # TODO: problema en create y update cuando falla la validacion
224
+ self.instancia_modelo = instancia_modelo.decorate if action_name.in? %w[show edit new]
225
+ end
226
+
227
+ def instancia_modelo=(val)
228
+ instance_variable_set(:"@#{nombre_modelo}", val)
229
+ end
230
+
231
+ def instancia_modelo
232
+ instance_variable_get(:"@#{nombre_modelo}")
233
+ end
234
+
235
+ def modelo_params
236
+ if action_name == 'new'
237
+ params.permit(atributos_permitidos)
238
+ else
239
+ params.require(nombre_modelo).permit(atributos_permitidos)
240
+ end
241
+ end
242
+
243
+ def nombre_modelo
244
+ @clase_modelo.name.underscore
245
+ end
246
+
247
+ def clase_modelo
248
+ # agarro la variable o intento con el nombre del controller
249
+ @clase_modelo ||= self.class.name.singularize.gsub('Controller', '').constantize
250
+ end
251
+
252
+ def filtros_y_policy(campos)
253
+ @filtros = PgEngine::FiltrosBuilder.new(
254
+ self, clase_modelo, campos
255
+ )
256
+ scope = policy_scope(clase_modelo)
257
+
258
+ @filtros.filtrar(scope)
259
+ end
260
+
261
+ def do_sort(scope, field, direction)
262
+ unless scope.model.column_names.include? field.to_s
263
+ PgLogger.warning("No existe el campo \"#{field}\"")
264
+ return scope
265
+ end
266
+ scope = scope.order(field => direction)
267
+ instance_variable_set(:@field, field)
268
+ instance_variable_set(:@direction, direction)
269
+ scope
270
+ rescue ArgumentError => e
271
+ PgLogger.warning(e.to_s)
272
+ scope
273
+ end
274
+
275
+ def sort_collection(scope, options = {})
276
+ if params[:order_by].present?
277
+ field = params[:order_by]
278
+ direction = params[:order_direction]
279
+ do_sort(scope, field, direction)
280
+ elsif options[:default].present?
281
+ field = options[:default].first[0]
282
+ direction = options[:default].first[1]
283
+ do_sort(scope, field, direction)
284
+ else
285
+ scope
286
+ end
287
+ end
288
+ end
289
+ end
@@ -5,7 +5,9 @@ module PgEngine
5
5
  end
6
6
 
7
7
  def render_turbo_stream_title
8
- turbo_stream.update 'title', "#{breadcrumbs.last&.name} - #{Rails.application.class.module_parent_name}"
8
+ # rubocop:disable Rails/SkipsModelValidations
9
+ turbo_stream.update_all 'title', "#{breadcrumbs.last&.name} - #{Rails.application.class.module_parent_name}"
10
+ # rubocop:enable Rails/SkipsModelValidations
9
11
  end
10
12
 
11
13
  def flash_type_to_class(flash_type)
@@ -23,6 +23,8 @@ module PgEngine
23
23
  return unless parts.length > 1
24
24
 
25
25
  parts.first.to_sym
26
+ rescue ActionController::RoutingError
27
+ nil
26
28
  end
27
29
  end
28
30
 
@@ -39,7 +39,7 @@ div
39
39
  - object = object.decorate
40
40
  tr id="#{dom_id(object)}"
41
41
  - atributos_para_listar.each do |att|
42
- th = object.send(att)
42
+ td = object.send(att)
43
43
  td.text-nowrap.text-end.ps-5
44
44
  = object.show_link
45
45
  = object.edit_link
@@ -31,11 +31,15 @@ module PgEngine
31
31
  end
32
32
 
33
33
  initializer 'byebug_bullet' do
34
- if Rails.env.development?
34
+ if Rails.env.local?
35
35
  # Byebug
36
36
  require 'byebug/core'
37
37
  begin
38
38
  Byebug.start_server 'localhost', ENV.fetch('BYEBUG_SERVER_PORT', 8989).to_i
39
+ if ENV.fetch('SLEEP_AFTER_BYEBUG', false)
40
+ puts 'waiting 3 secs after starting byebug server for connections'
41
+ sleep 3
42
+ end
39
43
  rescue Errno::EADDRINUSE
40
44
  Rails.logger.debug 'Byebug server already running'
41
45
  end
@@ -0,0 +1,12 @@
1
+ module PgEngine
2
+ module RouteHelpers
3
+ def pg_resource(key)
4
+ resources(key) do
5
+ collection do
6
+ get :abrir_modal
7
+ post :buscar
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rainbow'
4
+
5
+ module PgEngine
6
+ class PgLogger
7
+ class << self
8
+ def deprecated(mensaje)
9
+ titulo = Rainbow(" WARNING en #{caller[1]}").yellow.bold
10
+ detalles = Rainbow(" #{mensaje}").yellow
11
+ Rails.logger.warn("#{titulo}\n#{detalles}")
12
+ Rollbar.warning("#{mensaje}\n\n#{caller.join("\n")}")
13
+ end
14
+
15
+ def excepcion(exception)
16
+ titulo = Rainbow(" EXCEPCION #{exception.class} en #{caller.first}").red.bold
17
+ detalles = Rainbow(" #{exception.message}").red
18
+ Rails.logger.error("#{titulo}\n#{detalles}")
19
+ Rollbar.error(exception)
20
+ end
21
+
22
+ def error(mensaje)
23
+ titulo = Rainbow(" ERROR en #{caller.first}").red.bold
24
+ detalles = Rainbow(" #{mensaje}").red
25
+ Rails.logger.error("#{titulo}\n#{detalles}")
26
+ Rollbar.error("#{mensaje}\n\n#{caller.join("\n")}")
27
+ end
28
+
29
+ def warning(mensaje)
30
+ titulo = Rainbow(" WARNING en #{caller.first}").yellow.bold
31
+ detalles = Rainbow(" #{mensaje}").yellow
32
+ Rails.logger.warn("#{titulo}\n#{detalles}")
33
+ Rollbar.warning("#{mensaje}\n\n#{caller.join("\n")}")
34
+ end
35
+
36
+ def info(mensaje)
37
+ titulo = Rainbow(" INFO en #{caller.first}").blue.bold
38
+ detalles = Rainbow(" #{mensaje}").blue
39
+ Rails.logger.info("#{titulo}\n#{detalles}")
40
+ Rollbar.info("#{mensaje}\n\n#{caller.join("\n")}")
41
+ end
42
+ end
43
+ end
44
+ end
@@ -3,7 +3,8 @@
3
3
  require_relative 'pg_engine/engine'
4
4
  require_relative 'pg_engine/core_ext'
5
5
  require_relative 'pg_engine/configuracion'
6
- require_relative 'pg_engine/utils/logueador'
6
+ require_relative 'pg_engine/route_helpers'
7
+ require_relative 'pg_engine/utils/pg_logger'
7
8
 
8
9
  module PgEngine
9
10
  class << self
@@ -20,16 +21,5 @@ module PgEngine
20
21
  def configurar
21
22
  yield(configuracion)
22
23
  end
23
-
24
- def resource_route(rails_router, key)
25
- rails_router.instance_eval do
26
- resources(key) do
27
- collection do
28
- get :abrir_modal
29
- post :buscar
30
- end
31
- end
32
- end
33
- end
34
24
  end
35
25
  end
@@ -1,3 +1,7 @@
1
+ html, body {
2
+ height: 100%;
3
+ }
4
+
1
5
  .navbar {
2
6
  --#{$prefix}navbar-toggler-border-color: #{$primary};
3
7
  }
@@ -1,14 +1,13 @@
1
1
  doctype html
2
2
  html
3
3
  head
4
- title#title PgRails
4
+ title = Rails.application.class.module_parent_name
5
5
  meta name="viewport" content="width=device-width,initial-scale=1"
6
6
  = csrf_meta_tags
7
7
  = csp_meta_tag
8
8
 
9
9
  = stylesheet_link_tag 'application', 'data-turbo-track': 'reload'
10
10
  = javascript_include_tag 'application', 'data-turbo-track': 'reload', type: 'module'
11
-
12
11
  body
13
12
  div
14
13
  .text-center
@@ -17,6 +16,7 @@ html
17
16
  .container.text-center
18
17
  = yield
19
18
  = render_turbo_stream_title
19
+
20
20
  css:
21
21
  .pg-form {
22
22
  max-width: 300px;
@@ -1,7 +1,7 @@
1
1
  doctype html
2
2
  html
3
3
  head
4
- title PgRails
4
+ title = Rails.application.class.module_parent_name
5
5
  meta name="viewport" content="width=device-width,initial-scale=1"
6
6
  = csrf_meta_tags
7
7
  = csp_meta_tag
@@ -28,3 +28,4 @@ html
28
28
  = yield(:actions)
29
29
  hr.my-0
30
30
  = yield
31
+ = render_turbo_stream_title
@@ -33,11 +33,3 @@
33
33
  </div>
34
34
  </div>
35
35
  </nav>
36
- <!-- <nav>
37
- <ul>
38
- <li>
39
-
40
- </li>
41
- </ul>
42
- </nav>
43
- -->
data/pg_layout/index.js CHANGED
@@ -1,9 +1,10 @@
1
1
  // Controllers
2
2
  import NavbarController from './app/javascript/navbar_controller'
3
- window.Stimulus.register('navbar', NavbarController)
4
-
5
3
  // Bootstrap's toasts
6
4
  import * as bootstrap from 'bootstrap'
5
+
6
+ window.Stimulus.register('navbar', NavbarController)
7
+
7
8
  document.addEventListener('turbo:load', function () {
8
9
  const toastElList = document.querySelectorAll('.toast:not(.hide):not(.show)')
9
10
  Array.from(toastElList).map(toastEl => new bootstrap.Toast(toastEl).show())
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgRails
4
- VERSION = '7.0.2'
4
+ VERSION = '7.0.4'
5
5
  end
@@ -1,5 +1,5 @@
1
1
  ActiveAdmin.register <%= class_name %> do
2
- permit_params <%= attributes.map { |a| ":#{a.name}" }.join(', ') %>
2
+ permit_params <%= attributes_names.map { |a| ":#{a}" }.join(', ') %>
3
3
 
4
4
  index do
5
5
  selectable_column
@@ -32,7 +32,6 @@ class <%= class_name %> < <%= parent_class_name.classify %>
32
32
  enumerize :<%= attribute.name %>, in: { completar: 0, los: 1, valores: 2 }
33
33
  <%- end -%>
34
34
  <%- end -%>
35
-
36
35
  <%- if attributes.any?(&:required?) -%>
37
36
 
38
37
  validates <%= attributes.select(&:required?).map { |at| ":#{at.name}" }.join(', ') %>, presence: true
@@ -20,7 +20,7 @@ class PgResourceRouteGenerator < Rails::Generators::NamedBase
20
20
  return if options[:actions].present?
21
21
 
22
22
  route_s = <<~RUBY
23
- PgEngine.resource_route(self, :#{file_name.pluralize})
23
+ pg_resource(:#{file_name.pluralize})
24
24
  RUBY
25
25
  route route_s, namespace: regular_class_path
26
26
  end
@@ -60,6 +60,13 @@ RSpec.describe <%= controller_class_name %>Controller do
60
60
  sign_in user if user.present?
61
61
  end
62
62
 
63
+ describe 'routing' do
64
+ it 'routes GET index correctly' do
65
+ route = { get: '/<%= controller_file_path %>' }
66
+ expect(route).to route_to(controller: '<%= controller_file_path %>', action: 'index')
67
+ end
68
+ end
69
+
63
70
  <% unless options[:singleton] -%>
64
71
  describe 'GET #index' do
65
72
  subject do
@@ -57,15 +57,11 @@ class PgScaffoldGenerator < Rails::Generators::NamedBase
57
57
 
58
58
  def parent_controller
59
59
  parts = controller_class_name.split('::')
60
- if parts.length > 1
61
- if get_class "#{parts.first}Controller"
62
- "#{parts.first}Controller"
63
- else
64
- 'PgEngine::SignedInController'
65
- end
66
- else
67
- 'PgEngine::SignedInController'
68
- end
60
+ namesp = namespace.present? ? "#{namespace}::" : ''
61
+ cont_name = "#{namesp}#{parts.first}Controller"
62
+ return cont_name if parts.length > 1 && get_class(cont_name)
63
+
64
+ raise "#{cont_name} not exists"
69
65
  end
70
66
 
71
67
  def atributos_a_filtrar
@@ -2,19 +2,20 @@
2
2
 
3
3
  # generado con pg_rails
4
4
 
5
- <% if namespaced? -%>
5
+ <% if false && namespaced? -%>
6
6
  require_dependency "<%= namespaced_path %>/application_controller"
7
7
 
8
8
  <% end -%>
9
+ <% module_namespacing do -%>
9
10
  <% module_namespacing_2 do -%>
10
11
  class <%= controller_class_name.split('::').last %>Controller < <%= parent_controller %>
11
- before_action { @clase_modelo = <%= class_name %> }
12
+ before_action { @clase_modelo = <%= class_name.split('::').last %> }
12
13
 
13
- before_action(only: :index) { authorize <%= class_name %> }
14
+ before_action(only: :index) { authorize <%= class_name.split('::').last %> }
14
15
 
15
16
  before_action :set_instancia_modelo, only: %i[new create show edit update destroy]
16
17
 
17
- add_breadcrumb <%= class_name %>.nombre_plural, :<%= plural_route_name %>_path
18
+ add_breadcrumb <%= class_name.split('::').last %>.nombre_plural, :<%= plural_route_name %>_path
18
19
 
19
20
  private
20
21
 
@@ -35,3 +36,4 @@ class <%= controller_class_name.split('::').last %>Controller < <%= parent_contr
35
36
  end
36
37
  end
37
38
  <% end -%>
39
+ <% end -%>
@@ -0,0 +1,55 @@
1
+ require 'rails_helper'
2
+
3
+ require 'generators/pg_rspec/scaffold/scaffold_generator'
4
+ require 'generators/pg_decorator/pg_decorator_generator'
5
+ require 'generators/pg_active_record/model/model_generator'
6
+
7
+ DESTINATION_PATH = File.expand_path('./../../tmp/generator_testing', __dir__)
8
+
9
+ describe 'Generators' do
10
+ describe 'PgDecoratorGenerator' do
11
+ destination DESTINATION_PATH
12
+ tests PgDecoratorGenerator
13
+
14
+ before { prepare_destination }
15
+
16
+ it do
17
+ run_generator(['Frontend/Modelo', 'bla:integer'])
18
+
19
+ my_assert_file 'app/decorators/modelo_decorator.rb' do |content|
20
+ assert_match(/delegate_all/, content)
21
+ end
22
+ end
23
+ end
24
+
25
+ describe 'ScaffoldGenerator' do
26
+ destination DESTINATION_PATH
27
+ tests PgRspec::Generators::ScaffoldGenerator
28
+
29
+ before { prepare_destination }
30
+
31
+ it do
32
+ run_generator(['Frontend/Modelo', 'bla:integer'])
33
+
34
+ my_assert_file 'spec/controllers/frontend/modelos_controller_spec.rb' do |content|
35
+ assert_match(/routing/, content)
36
+ assert_match(/sign_in user/, content)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe PgActiveRecord::ModelGenerator do
42
+ destination DESTINATION_PATH
43
+ tests described_class
44
+
45
+ before { prepare_destination }
46
+
47
+ it do
48
+ run_generator(['Frontend/Modelo', 'bla:integer', 'cosa:references', '--activeadmin'])
49
+
50
+ my_assert_file 'app/admin/modelos.rb' do |content|
51
+ assert_match(/permit_params.*cosa_id/, content)
52
+ end
53
+ end
54
+ end
55
+ end