foldscaf 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.md +15 -0
- data/Rakefile +1 -0
- data/foldscaf.gemspec +24 -0
- data/lib/foldscaf.rb +5 -0
- data/lib/generators/fold/USAGE +18 -0
- data/lib/generators/fold/atributo.rb +68 -0
- data/lib/generators/fold/fold_generator.rb +80 -0
- data/lib/generators/fold/templates/cargar.erb +8 -0
- data/lib/generators/fold/templates/controller.erb +52 -0
- data/lib/generators/fold/templates/helper.erb +3 -0
- data/lib/generators/fold/templates/migration.erb +19 -0
- data/lib/generators/fold/templates/model.erb +26 -0
- data/lib/generators/fold/templates/views/_form.erb +6 -0
- data/lib/generators/fold/templates/views/_mini_form.erb +4 -0
- data/lib/generators/fold/templates/views/edit.erb +5 -0
- data/lib/generators/fold/templates/views/index.erb +19 -0
- data/lib/generators/fold/templates/views/new.erb +5 -0
- data/lib/generators/fold/templates/views/nombre.erb +7 -0
- data/lib/generators/mini_form/USAGE +8 -0
- data/lib/generators/mini_form/mini_form_generator.rb +11 -0
- data/lib/generators/mini_form/templates/mini_form.rb +25 -0
- data/lib/version.rb +3 -0
- metadata +69 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# foldscaf
|
2
|
+
|
3
|
+
Incluye varios generadores adaptados a las necesidades de Xaver.
|
4
|
+
Debe usarse en conjunto con el template de Xaver.
|
5
|
+
|
6
|
+
|
7
|
+
## Instalación
|
8
|
+
|
9
|
+
Agrega al Gemfile y ejecuta el comando `bundle` para instalarlo.
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem "foldscaf"
|
13
|
+
```
|
14
|
+
|
15
|
+
**Requiere Ruby 1.9.2 o superior.**
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/foldscaf.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "foldscaf"
|
7
|
+
s.version = Foldscaf::VERSION
|
8
|
+
s.authors = ["Nicanor Perera"]
|
9
|
+
s.email = ["nicanorperera@gmail.com"]
|
10
|
+
s.homepage = "http://github.com/nicanorperera/foldscaf"
|
11
|
+
s.summary = %q{Generadores adaptados a las necesidades de Xaver}
|
12
|
+
s.description = %q{Generadores adaptados a las necesidades de Xaver}
|
13
|
+
|
14
|
+
s.rubyforge_project = "foldscaf"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
24
|
+
end
|
data/lib/foldscaf.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Description:
|
2
|
+
Generador Scaffold-Like adaptado a las necesidades de Xaver.
|
3
|
+
|
4
|
+
Example:
|
5
|
+
rails generate fold Thing
|
6
|
+
|
7
|
+
This will create:
|
8
|
+
app/controllers/admin/things_controller.rb
|
9
|
+
app/models/thing.rb
|
10
|
+
app/helpers/thing_helper.rb
|
11
|
+
|
12
|
+
app/views/admin/_form.rb
|
13
|
+
app/views/admin/_mini_form.rb
|
14
|
+
app/views/admin/_thing.rb
|
15
|
+
app/views/admin/edit.rb
|
16
|
+
app/views/admin/index.rb
|
17
|
+
app/views/admin/show.rb
|
18
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
class Atributo
|
3
|
+
CLASES = [:string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean, :references]
|
4
|
+
VALORES = [:true, :false, :nil]
|
5
|
+
OPCIONES = [:unique, :index, :polymorphic]
|
6
|
+
ANCHO = 15
|
7
|
+
attr_accessor :nombre, :clase, :default, :opciones
|
8
|
+
|
9
|
+
def initialize(s)
|
10
|
+
parametros = s.split(':')
|
11
|
+
|
12
|
+
@nombre = parametros.shift
|
13
|
+
@clase = :string if parametros.empty?
|
14
|
+
@opciones = []
|
15
|
+
|
16
|
+
parametros.each do |parametro|
|
17
|
+
incluir parametro.to_sym
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def incluir(parametro)
|
23
|
+
if CLASES.include? parametro
|
24
|
+
@clase = parametro
|
25
|
+
end
|
26
|
+
|
27
|
+
if VALORES.include? parametro
|
28
|
+
@clase ||= :boolean
|
29
|
+
@default = parametro
|
30
|
+
end
|
31
|
+
|
32
|
+
if OPCIONES.include? parametro
|
33
|
+
@opciones << parametro
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def es?(opcion)
|
38
|
+
@opciones.include? opcion
|
39
|
+
end
|
40
|
+
|
41
|
+
def tiene_opciones?
|
42
|
+
! @opciones.empty?
|
43
|
+
end
|
44
|
+
|
45
|
+
def ejemplo
|
46
|
+
case @clase
|
47
|
+
when :string then "'Lorem Ipsum'"
|
48
|
+
when :integer then rand(50)
|
49
|
+
when :boolean then 'true'
|
50
|
+
else false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Este metodo es usado solo para testear.
|
55
|
+
# TODO: Eliminar metodo.
|
56
|
+
def show
|
57
|
+
|
58
|
+
n1 = ANCHO - @nombre.size
|
59
|
+
n2 = ANCHO - @clase.size
|
60
|
+
n3 = @default ? ANCHO - @default.size : ANCHO
|
61
|
+
|
62
|
+
s1 = ' ' * n1
|
63
|
+
s2 = ' ' * n2
|
64
|
+
s3 = ' ' * n3
|
65
|
+
|
66
|
+
"#{@nombre}#{s1}#{@clase}#{s2}#{@default}#{s3}#{@opciones}\n"
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require 'generators/fold/atributo'
|
4
|
+
|
5
|
+
class FoldGenerator < Rails::Generators::Base
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
7
|
+
|
8
|
+
argument :name, :type => :string, :required => true, :banner => 'Nombre'
|
9
|
+
argument :args, :type => :array , :default => [] , :banner => 'Atributos'
|
10
|
+
|
11
|
+
class_option :orden , :desc => 'Soporte para Ordenable.' , :type => :boolean, :aliases => "-o", :default => false
|
12
|
+
class_option :slug , :desc => 'Soporte pare FriendlyId.' , :type => :boolean, :aliases => "-i", :default => false
|
13
|
+
|
14
|
+
def initialize(*arguments, &block)
|
15
|
+
super
|
16
|
+
|
17
|
+
@con_orden = options.orden?
|
18
|
+
@con_slug = options.slug?
|
19
|
+
|
20
|
+
@singular = @name.downcase
|
21
|
+
@plural = @singular.pluralize
|
22
|
+
@class = @name.camelize
|
23
|
+
@classes = @plural.camelize
|
24
|
+
|
25
|
+
@singular_path = "admin_#{@singular}_path"
|
26
|
+
@plural_path = "admin_#{@plural}_path"
|
27
|
+
@new_path = "new_admin_#{@singular}_path"
|
28
|
+
@edit_path = "edit_admin_#{@singular}_path"
|
29
|
+
@reordenar_path = "reordenar_admin_#{@plural}_path"
|
30
|
+
|
31
|
+
@atributos = []
|
32
|
+
|
33
|
+
args.each do |arg|
|
34
|
+
@atributos << Atributo.new(arg)
|
35
|
+
end
|
36
|
+
@identificador = @atributos.first.nombre
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
def body
|
41
|
+
template 'model.erb' , "app/models/#{@singular}.rb"
|
42
|
+
template 'migration.erb' , "db/migrate/#{fecha}_create_#{@plural}.rb"
|
43
|
+
template 'controller.erb', "app/controllers/admin/#{@plural}_controller.rb"
|
44
|
+
template 'helper.erb', "app/helpers/#{@plural}_helper.rb"
|
45
|
+
|
46
|
+
%w[_form _mini_form edit index new].each do |action|
|
47
|
+
template "views/#{action}.erb", "app/views/admin/#{@plural}/#{action}.html.erb"
|
48
|
+
end
|
49
|
+
template "views/nombre.erb", "app/views/admin/#{@plural}/_#{@singular}.html.erb"
|
50
|
+
|
51
|
+
resources_route = @con_orden ? "\n resources :#{@plural} do\n post :reordenar, :on => :collection\n end" : "\n resources :#{@plural}"
|
52
|
+
add_admin_route resources_route
|
53
|
+
|
54
|
+
template 'cargar.erb', "lib/tasks/cargar_#{@plural}.rake"
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
# Agrega Ruta en namespace :admin
|
60
|
+
def add_admin_route(ruta)
|
61
|
+
inject_into_file 'config/routes.rb', ruta , :after => /namespace :admin do/
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.next_migration_number(dirname) #:nodoc:
|
65
|
+
if ActiveRecord::Base.timestamped_migrations
|
66
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
67
|
+
else
|
68
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def fecha
|
73
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
74
|
+
end
|
75
|
+
|
76
|
+
def atributos_con_referencia
|
77
|
+
@atributos.select {|a| a.clase == :references}
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
class Admin::<%= @classes %>Controller < Admin::AdminController
|
2
|
+
<%= "include Sortable" if @con_orden %>
|
3
|
+
load_and_authorize_resource
|
4
|
+
|
5
|
+
def index
|
6
|
+
@<%= @singular %> = <%= @class %>.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def new
|
10
|
+
end
|
11
|
+
|
12
|
+
def create
|
13
|
+
@<%= @singular %> = <%= @class %>.new params[:<%= @singular %>]
|
14
|
+
@<%= @singular %>.save!
|
15
|
+
notice = mensaje
|
16
|
+
respond_to do |format|
|
17
|
+
format.html { redirect_to <%= @plural_path %>, notice: mensaje }
|
18
|
+
format.js { @elemento = @<%= @singular %> }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def edit
|
23
|
+
end
|
24
|
+
|
25
|
+
def update
|
26
|
+
@<%= @singular %>.update_attributes! params[:<%= @singular %>]
|
27
|
+
redirect_to <%= @edit_path %>(@<%= @singular %>), notice: mensaje
|
28
|
+
end
|
29
|
+
|
30
|
+
def destroy
|
31
|
+
@id = @<%= @singular %>.id
|
32
|
+
@<%= @singular %>.eliminar!
|
33
|
+
notice = mensaje
|
34
|
+
respond_to do |format|
|
35
|
+
format.html { redirect_to <%= @plural_path %>, notice: mensaje }
|
36
|
+
format.js
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def mensaje
|
43
|
+
flash.now.notice = t("notice.#{action_name}")
|
44
|
+
end
|
45
|
+
|
46
|
+
<%- if @con_orden -%>
|
47
|
+
def sort_coleccion
|
48
|
+
<%= @class %>.all
|
49
|
+
end
|
50
|
+
<%- end -%>
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Create<%= @classes %> < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :<%= @plural %> do |t|
|
4
|
+
<%- @atributos.each do |a| -%>
|
5
|
+
t.<%= a.clase %> :<%= a.nombre %> <%= ", :default => #{a.default}" if (a.default && a.ejemplo) %>
|
6
|
+
<%- end -%>
|
7
|
+
|
8
|
+
<%- if @con_slug -%>
|
9
|
+
t.string :slug
|
10
|
+
<%- end -%>
|
11
|
+
<%- if @con_orden -%>
|
12
|
+
t.integer :orden
|
13
|
+
<%- end -%>
|
14
|
+
t.boolean :es_activo, :default => true
|
15
|
+
|
16
|
+
t.timestamps
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class <%= @class %> < ActiveRecord::Base
|
2
|
+
<%= 'before_create :set_orden' if @con_orden %>
|
3
|
+
<%- if @con_slug -%>
|
4
|
+
extend FriendlyId
|
5
|
+
friendly_id :<%= @identificador %>, use: :slugged
|
6
|
+
<%- end -%>
|
7
|
+
|
8
|
+
<%- atributos_con_referencia.each do |a| -%>
|
9
|
+
belongs_to :<%= a.nombre %>
|
10
|
+
<%- end -%>
|
11
|
+
|
12
|
+
default_scope where(:es_activo => true)<%= ".order('#{@plural}.orden')" if @con_orden %>
|
13
|
+
|
14
|
+
def eliminar!
|
15
|
+
update_attributes :es_activo => false
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_attribute :to_s, :<%= @identificador %>
|
19
|
+
|
20
|
+
private
|
21
|
+
<%- if @con_orden -%>
|
22
|
+
def set_orden
|
23
|
+
self.orden = self.id
|
24
|
+
end
|
25
|
+
<%- end -%>
|
26
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<%%= simple_form_for <%= @singular %>, :url => url, :html => { :class => 'form-vertical' } do |f| %>
|
2
|
+
<%- @atributos.each do |a| -%>
|
3
|
+
<%%= f.<%= a.clase == :references ? :association : :input %> :<%= a.nombre %> %>
|
4
|
+
<%- end -%>
|
5
|
+
<div class="controls"><%%= f.button :submit, :name => nil, :disable_with => t("espere") %></div>
|
6
|
+
<%%- end -%>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<div class="page-header">
|
2
|
+
<h1><%= @classes %></h1>
|
3
|
+
</div>
|
4
|
+
|
5
|
+
<nav class="well">
|
6
|
+
<button class="btn" data-toggle="collapse" data-target="#mini"><%%= icono('zoom-in') %> Mostrar formulario</button>
|
7
|
+
<%%= link_to icono('plus', :blanco)+" Agregar <%= @singular %> ", <%= @new_path %>, :class => 'btn btn-primary' %>
|
8
|
+
</nav>
|
9
|
+
|
10
|
+
<%%= render "mini_form", :<%= @singular %> => @<%= @singular %>, :url => <%= @plural_path %> %>
|
11
|
+
|
12
|
+
<table id="ordenable" class="table table-striped ordenable">
|
13
|
+
<%%= thead(:<%= @identificador %>) %>
|
14
|
+
<tbody>
|
15
|
+
<%%= render @<%= @plural %> %>
|
16
|
+
</tbody>
|
17
|
+
</table>
|
18
|
+
|
19
|
+
<%= "<%= hidden_field_tag :url, #{@reordenar_path} , :class => :url %\>" if @con_orden %>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<%%- clase ||= 'elemento' -%>
|
2
|
+
<%%= content_tag :tr, :class => clase, :id => "elementos_#{<%= @singular %>.id}" do %>
|
3
|
+
<td><%%= <%= @singular %>.<%= @identificador %> %></td>
|
4
|
+
<td><%%= content_tag :i, '',:class => "handle icon-move", :title => "Mantenga click y arrastre para reordenar" %></td>
|
5
|
+
<td><%%= link_to 'Editar' , <%= @edit_path %>(<%= @singular %>), :class => 'btn btn-mini' if can? :editar, <%= @singular %> %></td>
|
6
|
+
<td><%%= link_to "Eliminar", <%= @singular_path %>(<%= @singular %>), :method => :delete, :confirm => t("confirmacion"), :remote => true, :class => 'btn btn-mini btn-danger' %></td>
|
7
|
+
<%% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
class MiniFormGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
|
5
|
+
def initialize(*arguments, &block)
|
6
|
+
super
|
7
|
+
end
|
8
|
+
def body
|
9
|
+
copy_file 'mini_form.rb', 'lib/mini_form.rb'
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module MiniForm
|
2
|
+
def mini_form_for(object, *args, &block)
|
3
|
+
args ||= []
|
4
|
+
options = args.extract_options!.merge!({:wrapper => :mini, :html => {:id => :mini, :class => 'collapse form-inline'}})
|
5
|
+
simple_form_for(object, *(args << options.merge(:builder => MiniFormBuilder)), &block)
|
6
|
+
end
|
7
|
+
|
8
|
+
class MiniFormBuilder < SimpleForm::FormBuilder
|
9
|
+
def input(attribute_name, options = {}, &block)
|
10
|
+
options[:input_html] = { :class => 'input-medium'}
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Wrapper para Mini Formularios
|
16
|
+
# TODO: encontrar la manera de cambiar la clase de todos los input por 'input-medium'
|
17
|
+
SimpleForm.setup do |config|
|
18
|
+
config.wrappers :mini, :tag => 'span' , :class => 'controls', :error_class => 'error' do |b|
|
19
|
+
b.use :html5
|
20
|
+
b.use :placeholder
|
21
|
+
b.use :input
|
22
|
+
b.use :error, :wrap_with => { :tag => 'span', :class => 'help-inline' }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: foldscaf
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Nicanor Perera
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-09 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Generadores adaptados a las necesidades de Xaver
|
15
|
+
email:
|
16
|
+
- nicanorperera@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- README.md
|
24
|
+
- Rakefile
|
25
|
+
- foldscaf.gemspec
|
26
|
+
- lib/foldscaf.rb
|
27
|
+
- lib/generators/fold/USAGE
|
28
|
+
- lib/generators/fold/atributo.rb
|
29
|
+
- lib/generators/fold/fold_generator.rb
|
30
|
+
- lib/generators/fold/templates/cargar.erb
|
31
|
+
- lib/generators/fold/templates/controller.erb
|
32
|
+
- lib/generators/fold/templates/helper.erb
|
33
|
+
- lib/generators/fold/templates/migration.erb
|
34
|
+
- lib/generators/fold/templates/model.erb
|
35
|
+
- lib/generators/fold/templates/views/_form.erb
|
36
|
+
- lib/generators/fold/templates/views/_mini_form.erb
|
37
|
+
- lib/generators/fold/templates/views/edit.erb
|
38
|
+
- lib/generators/fold/templates/views/index.erb
|
39
|
+
- lib/generators/fold/templates/views/new.erb
|
40
|
+
- lib/generators/fold/templates/views/nombre.erb
|
41
|
+
- lib/generators/mini_form/USAGE
|
42
|
+
- lib/generators/mini_form/mini_form_generator.rb
|
43
|
+
- lib/generators/mini_form/templates/mini_form.rb
|
44
|
+
- lib/version.rb
|
45
|
+
homepage: http://github.com/nicanorperera/foldscaf
|
46
|
+
licenses: []
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubyforge_project: foldscaf
|
65
|
+
rubygems_version: 1.8.15
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: Generadores adaptados a las necesidades de Xaver
|
69
|
+
test_files: []
|