scaffold_pico 0.3.1 → 1.0.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.
- checksums.yaml +4 -4
- data/README.md +23 -47
- data/lib/scaffold/cli.rb +16 -4
- data/lib/scaffold/erb_context.rb +11 -0
- data/lib/scaffold/generators/base_generator.rb +74 -0
- data/lib/scaffold/generators/controller_generator.rb +27 -0
- data/lib/scaffold/generators/fabricator_generator.rb +26 -0
- data/lib/scaffold/generators/locales_generator.rb +42 -0
- data/lib/scaffold/generators/models_generator.rb +53 -0
- data/lib/scaffold/generators/routes_generator.rb +48 -0
- data/lib/scaffold/generators/views_generator.rb +57 -0
- data/lib/scaffold/main.rb +15 -6
- data/lib/scaffold/models/resource.rb +66 -0
- data/lib/scaffold/rails.rb +54 -0
- data/lib/scaffold/services/controller.rb +112 -0
- data/lib/scaffold/services/nested_in_resources.rb +42 -0
- data/lib/scaffold/services/path.rb +72 -0
- data/lib/scaffold/services/resource.rb +73 -0
- data/lib/scaffold/services/route.rb +20 -0
- data/lib/scaffold/services/view.rb +14 -0
- data/lib/scaffold_pico.rb +6 -7
- data/lib/templates/pico/controller.rb.erb +34 -26
- data/lib/templates/pico/fabricators/fabrication.rb.erb +4 -4
- data/lib/templates/pico/locales/bg.scaffold_pico.yml.erb +35 -0
- data/lib/templates/pico/locales/en.scaffold_pico.yml.erb +35 -0
- data/lib/templates/pico/model.rb.erb +2 -2
- data/lib/templates/pico/search.rb.erb +12 -12
- data/lib/templates/pico/views/materialize/slim/_form.html.slim.erb +1 -4
- data/lib/templates/pico/views/materialize/slim/edit.html.slim.erb +9 -7
- data/lib/templates/pico/views/materialize/slim/index.html.slim.erb +15 -15
- data/lib/templates/pico/views/materialize/slim/new.html.slim.erb +7 -5
- data/lib/templates/pico/views/materialize/slim/show.html.slim.erb +10 -10
- data/lib/templates/pico/views/zurb/slim/_form.html.slim.erb +2 -5
- data/lib/templates/pico/views/zurb/slim/edit.html.slim.erb +8 -6
- data/lib/templates/pico/views/zurb/slim/index.html.slim.erb +14 -14
- data/lib/templates/pico/views/zurb/slim/new.html.slim.erb +6 -4
- data/lib/templates/pico/views/zurb/slim/show.html.slim.erb +7 -7
- metadata +22 -10
- data/lib/scaffold/base_generator.rb +0 -60
- data/lib/scaffold/controller_generator.rb +0 -24
- data/lib/scaffold/fabricator_generator.rb +0 -25
- data/lib/scaffold/models_generator.rb +0 -51
- data/lib/scaffold/params.rb +0 -174
- data/lib/scaffold/routes_generator.rb +0 -29
- data/lib/scaffold/views_generator.rb +0 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51f562ce19e922d879648cf3db894dea6a96a9c6
|
4
|
+
data.tar.gz: 1321074674bc39be2a893ff9bbcd4dda70259d5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8bfcbd09575b717f2720f3ffdf1f1c45e7c40f904ff8607d333f4f7859a2a7bc5cc862b5a9ea40b002f4ea8ed694829abbf40e1d659f989a1ee0c72ffc37ed09
|
7
|
+
data.tar.gz: 220ba11acff7b3cd7a610eef5edaaf1add7e2b94530ee2e5fddaef3dc8b9403261db18c2c96b5381e39c4cd82771f3079df0f10eba7e44fc58caa21e6c55e3f8
|
data/README.md
CHANGED
@@ -15,9 +15,14 @@ No need to learn DSLs or support 3rd party gems.
|
|
15
15
|
* You can specify includes/joins for the #index action
|
16
16
|
* Includes search
|
17
17
|
|
18
|
+

|
19
|
+
|
20
|
+
|
18
21
|
# SYNOPSIS
|
19
22
|
|
20
|
-
scaffold_pico.rb
|
23
|
+
scaffold_pico.rb \
|
24
|
+
-m Admin::Vector -n administration -b AdminController \
|
25
|
+
--nested_in_resources Assets::VectorFrame \
|
21
26
|
--fields name: description:text featured:boolean license:belongs_to group_id:integer svg:file \
|
22
27
|
--index-fields id name imported featured \
|
23
28
|
--search-fields name aspect_ratio license created_at \
|
@@ -25,54 +30,27 @@ No need to learn DSLs or support 3rd party gems.
|
|
25
30
|
--services_folder=services \
|
26
31
|
--debug --css_framework=materialize
|
27
32
|
|
33
|
+
|
28
34
|
# Install
|
35
|
+
The gem assume you have already in your Gemfile
|
36
|
+
|
37
|
+
gem 'kaminari'
|
38
|
+
gem 'slim-rails'
|
39
|
+
gem 'simple_form'
|
40
|
+
|
41
|
+
# And one of those
|
42
|
+
#
|
43
|
+
# gem 'materialize-sass'
|
44
|
+
# gem 'foundation-rails'
|
29
45
|
|
30
46
|
There is no need to have it in your gem file.
|
31
47
|
|
32
48
|
gem install scaffold_pico
|
33
49
|
|
34
|
-
Set some default I18n options
|
35
|
-
|
36
|
-
en.yml:
|
37
|
-
|
38
|
-
scaffold:
|
39
|
-
confirm: 'Are you sure?'
|
40
|
-
notices:
|
41
|
-
success:
|
42
|
-
create: Was successfully created %{model}
|
43
|
-
update: Was successfully updated %{model}
|
44
|
-
destroy: Was successfully destroyed %{model}
|
45
|
-
failed:
|
46
|
-
create: Fail creating %{model}
|
47
|
-
update: Fail updating %{model}
|
48
|
-
destroy: Fail destroing %{model}
|
49
|
-
new:
|
50
|
-
title: "New %{model}"
|
51
|
-
show:
|
52
|
-
title: "%{model}"
|
53
|
-
edit:
|
54
|
-
title: "Edit %{model}"
|
55
|
-
index:
|
56
|
-
title: "%{model}"
|
57
|
-
edit: Edit
|
58
|
-
show: Show
|
59
|
-
destroy: Delete
|
60
|
-
actions: Action
|
61
|
-
search:
|
62
|
-
header: Search
|
63
|
-
button: Search
|
64
|
-
reset: New
|
65
|
-
|
66
|
-
actions:
|
67
|
-
index: List %{model}
|
68
|
-
actions: 'Actions'
|
69
|
-
new: New %{model}
|
70
|
-
edit: Edit %{model}
|
71
|
-
|
72
50
|
# Overriding
|
73
|
-
If you want to change something you can
|
74
|
-
|
51
|
+
If you want to change something you can override/change
|
75
52
|
|
53
|
+
RAILS_ROOT/config/locales/en.scaffold_pico.yml
|
76
54
|
RAILS_ROOT/lib/templates/pico
|
77
55
|
/controller.rb
|
78
56
|
/search.rb
|
@@ -104,17 +82,15 @@ Clone the repo in ~/scaffold_pico or whatever, then in some rails project run th
|
|
104
82
|
--fields name:string
|
105
83
|
|
106
84
|
# Known Issues
|
107
|
-
|
85
|
+
If you can't start scaffold_pico you might need to update your bundler
|
108
86
|
|
109
|
-
|
87
|
+
gem update bundler
|
110
88
|
|
111
|
-
|
89
|
+
Help please: For some of the generated models/views there are extra blank links. It would be great if someone knows how to parse the erb and skip the new lines
|
112
90
|
|
113
91
|
You can't generate scaffolds for a mounted named engines. I don't know if we need this feature.
|
114
92
|
|
115
|
-
The Param class has become very messy because of all those variables, so it should be split in small helpers.
|
116
|
-
|
117
93
|
|
118
94
|
## Copyright
|
119
95
|
|
120
|
-
Copyright (c)
|
96
|
+
Copyright (c) 2017 gudata. See LICENSE.txt for further details.
|
data/lib/scaffold/cli.rb
CHANGED
@@ -16,16 +16,28 @@ module Scaffold
|
|
16
16
|
desc 'print some debug info'
|
17
17
|
end
|
18
18
|
|
19
|
+
option :force do
|
20
|
+
long '--force'
|
21
|
+
desc 'Overwrite without asking questions'
|
22
|
+
end
|
23
|
+
|
19
24
|
option :fabrication do
|
20
25
|
long '--fabrication'
|
21
26
|
desc 'Generate fabrication fabricator https://github.com/paulelliott/fabrication'
|
22
27
|
end
|
23
28
|
|
24
|
-
option :
|
29
|
+
option :controller_namespaces do
|
25
30
|
short '-n'
|
26
|
-
long '--
|
31
|
+
long '--controller_namespaces=namespace1/namespace2'
|
27
32
|
validate /\A(\w+(?:\/\w+)*)\z/
|
28
|
-
desc 'Optional
|
33
|
+
desc 'Optional namespaces for the controllers. Example: -n admin/secret_area. '
|
34
|
+
end
|
35
|
+
|
36
|
+
option :nested_in_resources do
|
37
|
+
short '-nr'
|
38
|
+
long '--nested_in_resources=Reports::Client/Building'
|
39
|
+
validate /\A(?:::)?(?:(?:[A-Z]\w*(?:::[A-Z]\w*)*)\/?)*\z/
|
40
|
+
desc 'Optional nest resource in other resources. Example: -nr Reports::Client/Building -m Room'
|
29
41
|
end
|
30
42
|
|
31
43
|
option :base_controller do
|
@@ -57,7 +69,7 @@ module Scaffold
|
|
57
69
|
option :fields do
|
58
70
|
long '-f'
|
59
71
|
long '--fields *FIELDS'
|
60
|
-
desc 'title:string body:text published:boolean amount:decimal attachment:file tracking_id:integer:uniq '
|
72
|
+
desc 'title:string library:belongs_to body:text published:boolean amount:decimal attachment:file tracking_id:integer:uniq '
|
61
73
|
end
|
62
74
|
|
63
75
|
option :index_fields do
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'readline'
|
2
|
+
|
3
|
+
module Scaffold
|
4
|
+
module Generators
|
5
|
+
class BaseGenerator
|
6
|
+
@@aways_ovewrite = false
|
7
|
+
|
8
|
+
def initialize rails
|
9
|
+
@rails = rails
|
10
|
+
end
|
11
|
+
|
12
|
+
def objectify
|
13
|
+
OpenStruct.new(vars).instance_eval { binding }
|
14
|
+
end
|
15
|
+
|
16
|
+
# where is the root of the gem
|
17
|
+
def root
|
18
|
+
Scaffold.root
|
19
|
+
end
|
20
|
+
|
21
|
+
def project_root
|
22
|
+
Dir.pwd
|
23
|
+
end
|
24
|
+
|
25
|
+
# Check to see if it is overridden and use it
|
26
|
+
def find_root *segments
|
27
|
+
original = File.join(root, segments)
|
28
|
+
overridden = File.join(project_root, segments)
|
29
|
+
File.exists?(overridden) ? overridden : original
|
30
|
+
end
|
31
|
+
|
32
|
+
# the root of the templates
|
33
|
+
def templates
|
34
|
+
'lib/templates/pico/'
|
35
|
+
end
|
36
|
+
|
37
|
+
def ask(prompt="", newline=false)
|
38
|
+
prompt += "\n" if newline
|
39
|
+
Readline.readline(prompt, true).squeeze(" ").strip
|
40
|
+
end
|
41
|
+
|
42
|
+
def write_with_confirmation(target_file_path, content)
|
43
|
+
unless File.exists?(target_file_path)
|
44
|
+
IO.write(target_file_path, content)
|
45
|
+
return
|
46
|
+
end
|
47
|
+
|
48
|
+
@@aways_ovewrite = 'a' if @rails.choice[:force].present?
|
49
|
+
|
50
|
+
answer = if @@aways_ovewrite
|
51
|
+
if @rails.choice[:force].blank?
|
52
|
+
puts "#{target_file_path} exists, overwrite? [yaN] y"
|
53
|
+
end
|
54
|
+
'y'
|
55
|
+
else
|
56
|
+
ask("#{target_file_path} exists, overwrite? [yaN]").downcase
|
57
|
+
end
|
58
|
+
|
59
|
+
@@aways_ovewrite = true if answer == 'a'
|
60
|
+
|
61
|
+
IO.write(target_file_path, content) if answer == 'y'
|
62
|
+
end
|
63
|
+
|
64
|
+
def parse_template(content, context_hash)
|
65
|
+
# http://www.stuartellis.eu/articles/erb/
|
66
|
+
# content = ::ERB.new(content, nil, '-').result(@params.instance_eval{ binding })#.gsub(/\s+\n$/, "")
|
67
|
+
|
68
|
+
# content = ::ERB.new(content, 0, '>').result(ErbContext.new(context_hash).get_binding)
|
69
|
+
content = ::ERB.new(content, 0, '-').result(ErbContext.new(context_hash).get_binding)
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Scaffold
|
2
|
+
module Generators
|
3
|
+
class ControllerGenerator < Scaffold::Generators::BaseGenerator
|
4
|
+
|
5
|
+
def generate
|
6
|
+
controller_file_path = create_path(@rails.controller.file_name)
|
7
|
+
|
8
|
+
# puts "Creating #{controller_file_path}"
|
9
|
+
|
10
|
+
filepath = find_root(templates, 'controller.rb.erb')
|
11
|
+
content = File.read(filepath)
|
12
|
+
|
13
|
+
content = parse_template(content, {rails: @rails})
|
14
|
+
|
15
|
+
# puts content
|
16
|
+
write_with_confirmation(controller_file_path, content)
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_path file_name
|
20
|
+
controller_path = File.join(Dir.pwd, 'app', 'controllers', @rails.controller.namespaces_as_path)
|
21
|
+
controller_file_path = File.join(controller_path, file_name)
|
22
|
+
FileUtils.mkpath(controller_path)
|
23
|
+
controller_file_path
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Scaffold
|
2
|
+
module Generators
|
3
|
+
class FabricatorGenerator < Scaffold::Generators::BaseGenerator
|
4
|
+
def generate
|
5
|
+
fabricators_path = create_fabricators_path
|
6
|
+
source_file_name = "fabrication.rb.erb"
|
7
|
+
target_file_name = "#{@rails.resource.name}_fabricator.rb"
|
8
|
+
source_file_path = find_root(templates, 'fabricators', source_file_name)
|
9
|
+
content = File.read(source_file_path)
|
10
|
+
|
11
|
+
content = parse_template(content, {rails: @rails})
|
12
|
+
|
13
|
+
target_file_path = File.join(fabricators_path, target_file_name)
|
14
|
+
|
15
|
+
write_with_confirmation(target_file_path, content)
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_fabricators_path
|
19
|
+
fabricators_path = File.join(Dir.pwd, 'spec', 'fabricators')
|
20
|
+
FileUtils.mkpath(fabricators_path)
|
21
|
+
fabricators_path
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Scaffold
|
2
|
+
module Generators
|
3
|
+
class LocalesGenerator < Scaffold::Generators::BaseGenerator
|
4
|
+
def generate
|
5
|
+
return if existing_locale?
|
6
|
+
generate_locale('en')
|
7
|
+
generate_locale('bg')
|
8
|
+
end
|
9
|
+
|
10
|
+
def existing_locale?
|
11
|
+
Dir.glob(File.join(locales_path, '**')).each do |name|
|
12
|
+
return true if File.basename(name) =~ /scaffold_pico.yml/
|
13
|
+
end
|
14
|
+
return false
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate_locale(locale)
|
18
|
+
locales_path = create_locales_path
|
19
|
+
source_file_name = "#{locale}.scaffold_pico.yml.erb"
|
20
|
+
target_file_name = "#{locale}.scaffold_pico.yml"
|
21
|
+
source_file_path = find_root(templates, 'locales', source_file_name)
|
22
|
+
content = File.read(source_file_path)
|
23
|
+
|
24
|
+
content = parse_template(content, {rails: @rails})
|
25
|
+
|
26
|
+
target_file_path = File.join(locales_path, target_file_name)
|
27
|
+
|
28
|
+
write_with_confirmation(target_file_path, content)
|
29
|
+
end
|
30
|
+
|
31
|
+
def locales_path
|
32
|
+
locales_path = File.join(Dir.pwd, 'config', 'locales')
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_locales_path
|
36
|
+
FileUtils.mkpath(locales_path)
|
37
|
+
locales_path
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Scaffold
|
2
|
+
module Generators
|
3
|
+
class ModelsGenerator < Scaffold::Generators::BaseGenerator
|
4
|
+
def generate
|
5
|
+
searches_path = create_searches_path
|
6
|
+
puts "Add '#{@rails.resource.services_folder}' folder in your autoload_paths (application.rb)"
|
7
|
+
create_search_object searches_path
|
8
|
+
create_model
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_model
|
12
|
+
source_file_name = "model.rb.erb"
|
13
|
+
target_file_name = @rails.resource.file_name
|
14
|
+
|
15
|
+
source_file_path = find_root(templates, source_file_name)
|
16
|
+
content = File.read(source_file_path)
|
17
|
+
|
18
|
+
content = parse_template(content, {rails: @rails})
|
19
|
+
|
20
|
+
if @rails.resource.modules?
|
21
|
+
model_path = File.join(Dir.pwd, 'app', 'models')
|
22
|
+
else
|
23
|
+
model_path = File.join(Dir.pwd, 'app', 'models', @rails.resource.modules.map(&:underscore))
|
24
|
+
FileUtils.mkdir_p model_path
|
25
|
+
end
|
26
|
+
|
27
|
+
target_file_path = File.join(model_path, target_file_name)
|
28
|
+
|
29
|
+
write_with_confirmation(target_file_path, content)
|
30
|
+
end
|
31
|
+
|
32
|
+
def create_search_object searches_path
|
33
|
+
source_file_name = "search.rb.erb"
|
34
|
+
target_file_name = "#{@rails.resource.name.pluralize}_search.rb"
|
35
|
+
|
36
|
+
source_file_path = find_root(templates, source_file_name)
|
37
|
+
content = File.read(source_file_path)
|
38
|
+
|
39
|
+
content = parse_template(content, {rails: @rails})
|
40
|
+
|
41
|
+
target_file_path = File.join(searches_path, target_file_name)
|
42
|
+
write_with_confirmation(target_file_path, content)
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_searches_path
|
46
|
+
searches_path = File.join(Dir.pwd, 'app', @rails.resource.services_folder, 'search', @rails.controller.namespaces_as_path)
|
47
|
+
FileUtils.mkpath(searches_path)
|
48
|
+
searches_path
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Scaffold
|
2
|
+
module Generators
|
3
|
+
class RoutesGenerator < Scaffold::Generators::BaseGenerator
|
4
|
+
|
5
|
+
def generate
|
6
|
+
puts "Insert something like this in routes.rb"
|
7
|
+
|
8
|
+
nested_resources = @rails.nested_in_resources.resources
|
9
|
+
nested_resources_count = nested_resources.count
|
10
|
+
|
11
|
+
namespaces_count = @rails.controller.namespaces_as_path.count
|
12
|
+
|
13
|
+
route_string = "#{spaces(nested_resources_count + namespaces_count + 2)}resources :#{@rails.route.resource_name}"
|
14
|
+
|
15
|
+
nested_resources.reverse.each_with_index do |resource, index|
|
16
|
+
route_string = resources_block(resource.name, namespaces_count + nested_resources_count - index, route_string)
|
17
|
+
end
|
18
|
+
|
19
|
+
@rails.controller.namespaces_as_path.reverse.each_with_index do |namespace, index|
|
20
|
+
index
|
21
|
+
route_string = namespace_block(namespace, namespaces_count - index, route_string)
|
22
|
+
end
|
23
|
+
puts route_string
|
24
|
+
end
|
25
|
+
|
26
|
+
def spaces(count)
|
27
|
+
" "*2*(count)
|
28
|
+
end
|
29
|
+
|
30
|
+
def resources_block resource_name, index, route_string
|
31
|
+
ident = spaces(index+1)
|
32
|
+
|
33
|
+
begin_resource_name_line = "#{ident}resources :#{resource_name.pluralize} do"
|
34
|
+
end_resource_name_line = "#{ident}end"
|
35
|
+
"#{begin_resource_name_line}\n#{route_string}\n#{end_resource_name_line}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def namespace_block namespace, index, route_string
|
39
|
+
ident = spaces(index+1)
|
40
|
+
|
41
|
+
begin_namespace_line = "#{ident}namespace :#{namespace} do"
|
42
|
+
end_namespace_line = "#{ident}end"
|
43
|
+
"#{begin_namespace_line}\n#{route_string}\n#{end_namespace_line}"
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|