pg_scaffold 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 (49) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +3 -0
  5. data/lib/generators/pg_active_record/model/model_generator.rb +23 -0
  6. data/lib/generators/pg_active_record/model/templates/create_table_migration.rb.tt +46 -0
  7. data/lib/generators/pg_active_record/model/templates/migration.rb.tt +48 -0
  8. data/lib/generators/pg_active_record/model/templates/model.rb +46 -0
  9. data/lib/generators/pg_active_record/model/templates/module.rb +9 -0
  10. data/lib/generators/pg_decorator/USAGE +8 -0
  11. data/lib/generators/pg_decorator/pg_decorator_generator.rb +30 -0
  12. data/lib/generators/pg_decorator/templates/decorator.rb +28 -0
  13. data/lib/generators/pg_factory_bot/model/model_generator.rb +93 -0
  14. data/lib/generators/pg_factory_bot/model/templates/factories.erb +14 -0
  15. data/lib/generators/pg_pundit/USAGE +8 -0
  16. data/lib/generators/pg_pundit/pg_pundit_generator.rb +18 -0
  17. data/lib/generators/pg_pundit/templates/policy.rb +37 -0
  18. data/lib/generators/pg_rails/instalar/USAGE +8 -0
  19. data/lib/generators/pg_rails/instalar/instalar_generator.rb +17 -0
  20. data/lib/generators/pg_rails/instalar/templates/pg_rails.rb +10 -0
  21. data/lib/generators/pg_rspec/model/model_generator.rb +27 -0
  22. data/lib/generators/pg_rspec/model/templates/model_spec.rb +15 -0
  23. data/lib/generators/pg_rspec/scaffold/scaffold_generator.rb +43 -0
  24. data/lib/generators/pg_rspec/scaffold/templates/api_controller_spec.rb +167 -0
  25. data/lib/generators/pg_rspec/scaffold/templates/controller_spec.rb +248 -0
  26. data/lib/generators/pg_rspec/scaffold/templates/edit_spec.rb +34 -0
  27. data/lib/generators/pg_rspec/scaffold/templates/index_spec.rb +28 -0
  28. data/lib/generators/pg_rspec/scaffold/templates/new_spec.rb +34 -0
  29. data/lib/generators/pg_rspec/scaffold/templates/routing_spec.rb +50 -0
  30. data/lib/generators/pg_rspec/scaffold/templates/show_spec.rb +26 -0
  31. data/lib/generators/pg_scaffold/USAGE +8 -0
  32. data/lib/generators/pg_scaffold/pg_scaffold_generator.rb +63 -0
  33. data/lib/generators/pg_scaffold/templates/controller.rb +62 -0
  34. data/lib/generators/pg_slim/USAGE +8 -0
  35. data/lib/generators/pg_slim/pg_slim_generator.rb +23 -0
  36. data/lib/generators/pg_slim/templates/_form.html.slim +8 -0
  37. data/lib/generators/pg_slim/templates/download.xlsx.axlsx +14 -0
  38. data/lib/generators/pg_slim/templates/edit.html.slim +5 -0
  39. data/lib/generators/pg_slim/templates/index.html.slim +50 -0
  40. data/lib/generators/pg_slim/templates/new.html.slim +5 -0
  41. data/lib/generators/pg_slim/templates/partial.html.slim +1 -0
  42. data/lib/generators/pg_slim/templates/show.html.slim +39 -0
  43. data/lib/pg_scaffold/monkey_patches/mejoras_a_named_base.rb +37 -0
  44. data/lib/pg_scaffold/monkey_patches/mejoras_de_atributos.rb +116 -0
  45. data/lib/pg_scaffold/railtie.rb +18 -0
  46. data/lib/pg_scaffold/version.rb +3 -0
  47. data/lib/pg_scaffold.rb +6 -0
  48. data/lib/tasks/pg_scaffold_tasks.rake +4 -0
  49. metadata +110 -0
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ # generado con pg_rails
4
+
5
+ <% if namespaced? -%>
6
+ require_dependency "<%= namespaced_path %>/application_controller"
7
+
8
+ <% end -%>
9
+ <% module_namespacing_2 do -%>
10
+ class <%= controller_class_name.split('::').last %>Controller < ApplicationController
11
+ before_action { @clase_modelo = <%= class_name %> }
12
+
13
+ before_action(only: :index) { authorize <%= class_name %> }
14
+
15
+ before_action :set_instancia_modelo, only: %i[new create show edit update destroy]
16
+
17
+ add_breadcrumb <%= class_name %>.nombre_plural, :<%= plural_route_name %>_path
18
+
19
+ def index
20
+ @<%= plural_name %> = filtros_y_policy %i[<%= atributos_a_filtrar.map(&:name).join(' ') %>]
21
+ @<%= plural_name %> = sort_collection(@<%= plural_name %>)
22
+ pg_respond_index(@<%= plural_name %>)
23
+ end
24
+
25
+ def show
26
+ add_breadcrumb @<%= singular_name %>, @<%= singular_name %>.target_object
27
+
28
+ pg_respond_show
29
+ end
30
+
31
+ def new
32
+ add_breadcrumb "Crear #{<%= class_name %>.nombre_singular.downcase}"
33
+ end
34
+
35
+ def edit
36
+ add_breadcrumb @<%= singular_name %>, @<%= singular_name %>.target_object
37
+ add_breadcrumb 'Editando'
38
+ end
39
+
40
+ def create
41
+ pg_respond_create
42
+ end
43
+
44
+ def update
45
+ pg_respond_update
46
+ end
47
+
48
+ def destroy
49
+ pg_respond_destroy(@<%= singular_name %>, <%= index_helper %>_url)
50
+ end
51
+
52
+ private
53
+
54
+ def render_smart_listing
55
+ @<%= plural_name %> = @<%= plural_name %>.page(params[:page]).per(current_page_size)
56
+ end
57
+
58
+ def atributos_permitidos
59
+ %i[<%= attributes_names.join(' ') %>]
60
+ end
61
+ end
62
+ <% end -%>
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate pg_slim Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'generators/slim/scaffold/scaffold_generator'
4
+
5
+ class PgSlimGenerator < Slim::Generators::ScaffoldGenerator
6
+ source_root File.expand_path('templates', __dir__)
7
+
8
+ class_option :paranoia, type: :boolean, default: false, desc: 'Paranoid y deleted_at.'
9
+ class_option :discard, type: :boolean, default: false, desc: 'Discard y discarded_at.'
10
+ class_option :trackeo_de_usuarios, type: :boolean, default: true,
11
+ desc: 'Genera campos creado_por y actualizado_por.'
12
+
13
+ def copiar_download
14
+ template 'download.xlsx.axlsx',
15
+ File.join('app', 'views', controller_file_path, 'download.xlsx.axlsx')
16
+ end
17
+
18
+ protected
19
+
20
+ def available_views
21
+ %w[index edit show new _form]
22
+ end
23
+ end
@@ -0,0 +1,8 @@
1
+ = pg_form_for(@<%= singular_name %>.target_object) do |f|
2
+ = f.mensajes_de_error
3
+
4
+ <%- attributes.each do |attribute| -%>
5
+ = f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %>
6
+ <%- end -%>
7
+ .mt-2
8
+ = f.button :submit
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ wb = xlsx_package.workbook
4
+ wb.add_worksheet(name: '<%= human_name %>') do |sheet|
5
+ sheet.add_row [
6
+ <%= attributes.map {|attribute| "@clase_modelo.human_attribute_name(:#{ attribute.name })" }.join(",\n ") %>
7
+ ]
8
+
9
+ @<%= plural_name %>.decorate.each do |<%= singular_name %>|
10
+ sheet.add_row [
11
+ <%= attributes.map {|attribute| "#{ singular_name }.#{ attribute.name }" }.join(",\n ") %>
12
+ ]
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ - content_for :title do
2
+ | Modificar #{@clase_modelo.nombre_singular.downcase}
3
+
4
+ .p-3
5
+ = render 'form'
@@ -0,0 +1,50 @@
1
+ - content_for(:title, @clase_modelo.nombre_plural)
2
+ - content_for :actions do
3
+ button.btn.btn-sm.btn-primary type="button" data-bs-toggle="collapse" data-bs-target="#filtros" aria-expanded="false" aria-controls="filtros"
4
+ span.bi.bi-funnel-fill
5
+ span.d-none.d-sm-inline Filtrar
6
+ .ms-1
7
+ = @clase_modelo.new.decorate.new_link
8
+ .ms-1
9
+ = @clase_modelo.new.decorate.export_link(request.url)
10
+ .collapse.p-2.border-bottom#filtros class="#{ 'show' if any_filter? }"
11
+ .d-flex.align-items-center
12
+ .px-2.d-none.d-sm-inline-block
13
+ span.bi.bi-funnel-fill
14
+ = form_tag nil, class: '', method: :get do
15
+ .row.g-1
16
+ = @filtros.filtros_html
17
+ .col-auto
18
+ = button_tag class: 'btn btn-sm btn-primary col-auto' do
19
+ span.bi.bi-search
20
+ .col-auto
21
+ = link_to <%= plural_route_name %>_path(clean: true), class: 'btn btn-sm btn-secondary col-auto' do
22
+ | Limpiar
23
+
24
+ div
25
+ - if @<%= plural_name %>.any?
26
+ .table-responsive
27
+ table.table.table-sm.listado.xpg-revert-width.xborder-end
28
+ caption.ps-3 = page_entries_info @<%= plural_name %>
29
+ thead.table-light
30
+ tr
31
+ <%- for attribute in attributes -%>
32
+ th = encabezado :<%= attribute.name %>, ordenable: true
33
+ <%- end -%>
34
+ th
35
+ tbody
36
+ - @<%= plural_name %>.each do |<%= singular_name %>|
37
+ - <%= singular_name %> = <%= singular_name %>.decorate
38
+ tr id="#{dom_id(<%= singular_name %>)}"
39
+ <%- for attribute in attributes -%>
40
+ td = <%= singular_name %>.<%= attribute.name %>
41
+ <%- end -%>
42
+ td.text-nowrap.text-end.ps-5
43
+ = <%= singular_name %>.show_link
44
+ = <%= singular_name %>.edit_link
45
+ = <%= singular_name %>.destroy_link
46
+
47
+ .ps-3.justify-content-center
48
+ = paginate(@<%= plural_name %>)
49
+ - else
50
+ p.m-3 No hay #{@clase_modelo.nombre_plural.downcase} que mostrar
@@ -0,0 +1,5 @@
1
+ - content_for :title do
2
+ | Crear #{@clase_modelo.nombre_singular.downcase}
3
+
4
+ .p-3
5
+ = render 'form'
@@ -0,0 +1 @@
1
+ h1 el partiaaal
@@ -0,0 +1,39 @@
1
+ - content_for :title do
2
+ = @<%= singular_name %>.to_s
3
+ - content_for :actions do
4
+ = @<%= singular_name %>.destroy_link
5
+ .ms-1
6
+ = @<%= singular_name %>.edit_link
7
+
8
+ table.table.table-borderless.table-sm.w-auto.mb-0.m-3
9
+ <%- for attribute in attributes -%>
10
+ tr
11
+ th = @clase_modelo.human_attribute_name(:<%= attribute.name %>)
12
+ td = @<%= singular_name %>.<%= attribute.name %>
13
+ <%- end -%>
14
+ <%- if options[:trackeo_de_usuarios] -%>
15
+ tr
16
+ th = t(:creado_por)
17
+ td = @<%= singular_name %>.creado_por
18
+ <%- end -%>
19
+ tr
20
+ th = I18n.t(:created_at)
21
+ td = dmy_time @<%= singular_name %>.created_at
22
+ <%- if options[:trackeo_de_usuarios] -%>
23
+ tr
24
+ th = t(:actualizado_por)
25
+ td = @<%= singular_name %>.actualizado_por
26
+ <%- end -%>
27
+ tr
28
+ th = I18n.t(:updated_at)
29
+ td = dmy_time @<%= singular_name %>.updated_at
30
+ <%- if options[:paranoia] -%>
31
+ tr
32
+ th = t(:deleted_at)
33
+ td = dmy_time @<%= singular_name %>.deleted_at
34
+ <%- end -%>
35
+ <%- if options[:discard] -%>
36
+ tr
37
+ th = t(:discarded_at)
38
+ td = dmy_time @<%= singular_name %>.discarded_at
39
+ <%- end -%>
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/named_base'
4
+
5
+ module Rails
6
+ module Generators
7
+ class NamedBase < Base
8
+ def nombre_clase_completo
9
+ # if namespaced?
10
+ # (namespaced_class_path + [file_name]).map!(&:camelize).join('::')
11
+ # else
12
+ # (regular_class_path + [file_name]).map!(&:camelize).join('::')
13
+ # end
14
+ file_name.camelize
15
+ end
16
+
17
+ def nombre_tabla_completo_singular
18
+ if namespaced?
19
+ (namespaced_class_path + [singular_name]).join('_')
20
+ else
21
+ (regular_class_path + [singular_name]).join('_')
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ # Deprecado?
28
+ def ruta_vistas
29
+ if namespaced?
30
+ namespaced_class_path.dup.push(plural_name).join('/')
31
+ else
32
+ regular_class_path.dup.push(plural_name).join('/')
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators'
4
+ require 'rails/generators/generated_attribute'
5
+ require 'generators/rspec'
6
+
7
+ module Rails
8
+ module Generators
9
+ class GeneratedAttribute # :nodoc:
10
+ class << self
11
+ private
12
+
13
+ def parse_type_and_options(type)
14
+ case type
15
+ when /(string|text|binary|integer)\{(\d+)\}/
16
+ [Regexp.last_match(1), { limit: Regexp.last_match(2).to_i }]
17
+ when /(string|text|binary|float|integer|date|datetime)\{(.+)\}/
18
+ type = Regexp.last_match(1)
19
+ provided_options = Regexp.last_match(2).split(/[,.-]/)
20
+ options = provided_options.map { |opt| [opt.to_sym, true] }.to_h
21
+ [type, options]
22
+ when /decimal\{(\d+)[,.-](\d+)\}/
23
+ [:decimal, { precision: Regexp.last_match(1).to_i, scale: Regexp.last_match(2).to_i }]
24
+ when /(references|belongs_to)\{(.+)\}/
25
+ type = Regexp.last_match(1)
26
+ provided_options = Regexp.last_match(2).split(/[,.-]/)
27
+ options = provided_options.map { |opt| parsear_opcion(opt) }.to_h
28
+
29
+ # si es referencia le mando índice siempre
30
+ options[:index] = true
31
+ [type, options]
32
+ else
33
+ [type, {}]
34
+ end
35
+ end
36
+
37
+ def parsear_opcion(opcion)
38
+ partes = opcion.split('=')
39
+ if partes.count == 2
40
+ [partes[0].to_sym, partes[1]]
41
+ else
42
+ [opcion.to_sym, true]
43
+ end
44
+ end
45
+ end
46
+
47
+ def clase_con_modulo
48
+ return name.camelize unless tiene_nombre_de_clase_explicito?
49
+
50
+ @attr_options[:clase].gsub('/', '::')
51
+ end
52
+
53
+ # def tiene_modulo?
54
+ # @attr_options[:modulo].present?
55
+ # end
56
+
57
+ def tiene_nombre_de_clase_explicito?
58
+ @attr_options[:clase].present?
59
+ end
60
+
61
+ # def tiene_tabla?
62
+ # @attr_options[:tabla].present?
63
+ # end
64
+
65
+ def es_enum?
66
+ @attr_options[:enum].present?
67
+ end
68
+
69
+ def tabla_referenciada_singular
70
+ return singular_name unless tiene_nombre_de_clase_explicito?
71
+
72
+ @attr_options[:clase].gsub('/', '').underscore
73
+ end
74
+
75
+ def tabla_referenciada
76
+ return plural_name unless tiene_nombre_de_clase_explicito?
77
+
78
+ @attr_options[:clase].gsub('/', '').underscore.pluralize
79
+ end
80
+
81
+ # pisa geneators/rspec
82
+ def input_type
83
+ @input_type ||= if type == :text
84
+ 'textarea'
85
+ elsif es_enum? || type == :references
86
+ 'select'
87
+ else
88
+ 'input'
89
+ end
90
+ end
91
+
92
+ def required?
93
+ attr_options[:required]
94
+ end
95
+
96
+ private
97
+
98
+ def options_for_migration
99
+ @attr_options.dup.tap do |options|
100
+ if required?
101
+ options.delete(:required)
102
+ options[:null] = false
103
+ end
104
+
105
+ if reference? && !polymorphic? && !tiene_nombre_de_clase_explicito?
106
+ options[:foreign_key] =
107
+ true
108
+ end
109
+ # options.delete(:modulo)
110
+ # options.delete(:tabla)
111
+ options.delete(:clase)
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,18 @@
1
+ module PgScaffold
2
+ class Railtie < ::Rails::Railtie
3
+
4
+ initializer 'configurar_generators', after: 'factory_bot.set_fixture_replacement' do
5
+ require 'pg_scaffold/monkey_patches/mejoras_de_atributos'
6
+ require 'pg_scaffold/monkey_patches/mejoras_a_named_base'
7
+
8
+ config.app_generators do |g|
9
+ g.test_framework :pg_rspec
10
+ g.orm :pg_active_record
11
+
12
+ g.fallbacks[:pg_rspec] = :rspec
13
+ g.fallbacks[:pg_active_record] = :active_record
14
+ end
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module PgScaffold
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,6 @@
1
+ require "pg_scaffold/version"
2
+ require "pg_scaffold/railtie"
3
+
4
+ module PgScaffold
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :pg_scaffold do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pg_scaffold
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Martín Rosso
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-01-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '7.1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 7.1.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '7.1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 7.1.3
33
+ description: Scaffolding for rails.
34
+ email:
35
+ - mrosso10@gmail.com
36
+ executables: []
37
+ extensions: []
38
+ extra_rdoc_files: []
39
+ files:
40
+ - MIT-LICENSE
41
+ - README.md
42
+ - Rakefile
43
+ - lib/generators/pg_active_record/model/model_generator.rb
44
+ - lib/generators/pg_active_record/model/templates/create_table_migration.rb.tt
45
+ - lib/generators/pg_active_record/model/templates/migration.rb.tt
46
+ - lib/generators/pg_active_record/model/templates/model.rb
47
+ - lib/generators/pg_active_record/model/templates/module.rb
48
+ - lib/generators/pg_decorator/USAGE
49
+ - lib/generators/pg_decorator/pg_decorator_generator.rb
50
+ - lib/generators/pg_decorator/templates/decorator.rb
51
+ - lib/generators/pg_factory_bot/model/model_generator.rb
52
+ - lib/generators/pg_factory_bot/model/templates/factories.erb
53
+ - lib/generators/pg_pundit/USAGE
54
+ - lib/generators/pg_pundit/pg_pundit_generator.rb
55
+ - lib/generators/pg_pundit/templates/policy.rb
56
+ - lib/generators/pg_rails/instalar/USAGE
57
+ - lib/generators/pg_rails/instalar/instalar_generator.rb
58
+ - lib/generators/pg_rails/instalar/templates/pg_rails.rb
59
+ - lib/generators/pg_rspec/model/model_generator.rb
60
+ - lib/generators/pg_rspec/model/templates/model_spec.rb
61
+ - lib/generators/pg_rspec/scaffold/scaffold_generator.rb
62
+ - lib/generators/pg_rspec/scaffold/templates/api_controller_spec.rb
63
+ - lib/generators/pg_rspec/scaffold/templates/controller_spec.rb
64
+ - lib/generators/pg_rspec/scaffold/templates/edit_spec.rb
65
+ - lib/generators/pg_rspec/scaffold/templates/index_spec.rb
66
+ - lib/generators/pg_rspec/scaffold/templates/new_spec.rb
67
+ - lib/generators/pg_rspec/scaffold/templates/routing_spec.rb
68
+ - lib/generators/pg_rspec/scaffold/templates/show_spec.rb
69
+ - lib/generators/pg_scaffold/USAGE
70
+ - lib/generators/pg_scaffold/pg_scaffold_generator.rb
71
+ - lib/generators/pg_scaffold/templates/controller.rb
72
+ - lib/generators/pg_slim/USAGE
73
+ - lib/generators/pg_slim/pg_slim_generator.rb
74
+ - lib/generators/pg_slim/templates/_form.html.slim
75
+ - lib/generators/pg_slim/templates/download.xlsx.axlsx
76
+ - lib/generators/pg_slim/templates/edit.html.slim
77
+ - lib/generators/pg_slim/templates/index.html.slim
78
+ - lib/generators/pg_slim/templates/new.html.slim
79
+ - lib/generators/pg_slim/templates/partial.html.slim
80
+ - lib/generators/pg_slim/templates/show.html.slim
81
+ - lib/pg_scaffold.rb
82
+ - lib/pg_scaffold/monkey_patches/mejoras_a_named_base.rb
83
+ - lib/pg_scaffold/monkey_patches/mejoras_de_atributos.rb
84
+ - lib/pg_scaffold/railtie.rb
85
+ - lib/pg_scaffold/version.rb
86
+ - lib/tasks/pg_scaffold_tasks.rake
87
+ homepage: https://github.com/martin-rosso/pg_scaffold
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubygems_version: 3.3.22
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: Scaffolding for rails
110
+ test_files: []