pg_scaffold 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []