effective_developer 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/effective/code_writer.rb +16 -1
- data/lib/effective_developer/version.rb +1 -1
- data/lib/generators/effective/datatable_generator.rb +2 -2
- data/lib/generators/effective/helpers.rb +14 -7
- data/lib/generators/effective/menu_generator.rb +1 -1
- data/lib/generators/effective/migration_generator.rb +49 -4
- data/lib/generators/effective/scaffold_controller_generator.rb +11 -3
- data/lib/generators/effective/scaffold_generator.rb +8 -0
- data/lib/scaffolds/controllers/controller.rb +19 -13
- data/lib/scaffolds/datatables/datatable.rb +8 -12
- data/lib/scaffolds/forms/_form.html.haml +4 -0
- data/lib/scaffolds/models/model.rb +2 -0
- data/lib/scaffolds/views/edit.html.haml +1 -1
- data/lib/scaffolds/views/new.html.haml +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c9d245ef9985403865d0ff86827272eddb8451a
|
4
|
+
data.tar.gz: 3da5a891679cd2c3abbc30a4feb9a9a3e68f080d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 960474bc91e9b1ffcfed1daae6db4a2ff64fb54ded9e35574155e9c3e92ab22df7b6e6a8469d622410f71f9a385c102cbfa68d565f1531c57cd536d27df406c9
|
7
|
+
data.tar.gz: cd513a9ee141d261824b2cd536c230cc795f3286d4b1348484c3ed076acb130dd5f05e2bcaed3f9f9ddbd8f3341e57c24c922eb4338a93575c20442bc78661b5
|
@@ -149,7 +149,7 @@ module Effective
|
|
149
149
|
retval
|
150
150
|
end
|
151
151
|
|
152
|
-
# Returns an array of indexes for each line where the passed block
|
152
|
+
# Returns an array of indexes for each line where the passed block returns true
|
153
153
|
def all(from: @from.last, to: @to.last, &block)
|
154
154
|
retval = []
|
155
155
|
|
@@ -163,6 +163,21 @@ module Effective
|
|
163
163
|
end
|
164
164
|
alias_method :select, :all
|
165
165
|
|
166
|
+
# Yields each line to a block and returns an array of the results
|
167
|
+
def map(from: @from.last, to: @to.last, indexes: [], &block)
|
168
|
+
retval = []
|
169
|
+
|
170
|
+
each_with_depth do |line, depth, index|
|
171
|
+
next if index < (from || 0)
|
172
|
+
next unless indexes.blank? || indexes.include?(index)
|
173
|
+
|
174
|
+
retval << block.call(line, depth, index)
|
175
|
+
break if to == index
|
176
|
+
end
|
177
|
+
|
178
|
+
retval
|
179
|
+
end
|
180
|
+
|
166
181
|
def depth_at(line_index)
|
167
182
|
if filename.end_with?('.haml')
|
168
183
|
return (lines[line_index].length - lines[line_index].lstrip.length) / indent.length
|
@@ -13,7 +13,7 @@ module Effective
|
|
13
13
|
|
14
14
|
source_root File.expand_path(('../' * 4) + 'lib/scaffolds', __FILE__)
|
15
15
|
|
16
|
-
desc 'Creates an Effective::Datatable in your app/
|
16
|
+
desc 'Creates an Effective::Datatable in your app/datatables folder.'
|
17
17
|
|
18
18
|
argument :attributes, type: :array, default: [], banner: 'field[:type] field[:type]'
|
19
19
|
|
@@ -30,7 +30,7 @@ module Effective
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def create_datatable
|
33
|
-
template 'datatables/datatable.rb', File.join('app/
|
33
|
+
template 'datatables/datatable.rb', File.join('app/datatables', namespace_path, "#{plural_name}_datatable.rb")
|
34
34
|
end
|
35
35
|
|
36
36
|
end
|
@@ -36,7 +36,7 @@ module Effective
|
|
36
36
|
invoked_attributes.present? ? (['--attributes'] + invoked_attributes) : []
|
37
37
|
end
|
38
38
|
|
39
|
-
def klass_attributes
|
39
|
+
def klass_attributes(verbose: true)
|
40
40
|
klass = class_name.safe_constantize
|
41
41
|
return [] unless klass
|
42
42
|
|
@@ -54,12 +54,19 @@ module Effective
|
|
54
54
|
begin
|
55
55
|
attributes = klass.new().attributes
|
56
56
|
rescue => e
|
57
|
-
puts "Unable to call #{class_name}.new().attributes. Continuing with empty attributes."
|
57
|
+
puts "Unable to call #{class_name}.new().attributes. Continuing with empty attributes." if verbose
|
58
58
|
return []
|
59
59
|
end
|
60
60
|
|
61
|
-
|
62
|
-
|
61
|
+
attribute_names = attributes.keys - [klass.primary_key, 'created_at', 'updated_at']
|
62
|
+
attribute_names -= ['site_id'] if klass.respond_to?(:is_site_specific)
|
63
|
+
|
64
|
+
attribute_names.map do |attr|
|
65
|
+
if klass.respond_to?(:column_for_attribute) # Rails 4+
|
66
|
+
"#{attr}:#{klass.column_for_attribute(attr).try(:type) || 'string'}"
|
67
|
+
else
|
68
|
+
"#{attr}:#{klass.columns_hash[attr].try(:type) || 'string'}"
|
69
|
+
end
|
63
70
|
end
|
64
71
|
end
|
65
72
|
|
@@ -94,11 +101,11 @@ module Effective
|
|
94
101
|
end
|
95
102
|
|
96
103
|
def index_path
|
97
|
-
[namespace_path.underscore.presence, plural_name].compact.join('_')
|
104
|
+
[namespace_path.underscore.presence, plural_name, 'path'].compact.join('_')
|
98
105
|
end
|
99
106
|
|
100
107
|
def new_path
|
101
|
-
['new', namespace_path.underscore.presence, singular_name].compact.join('_')
|
108
|
+
['new', namespace_path.underscore.presence, singular_name, 'path'].compact.join('_')
|
102
109
|
end
|
103
110
|
|
104
111
|
def edit_path
|
@@ -106,7 +113,7 @@ module Effective
|
|
106
113
|
end
|
107
114
|
|
108
115
|
def show_path
|
109
|
-
[namespace_path.underscore.presence, singular_name
|
116
|
+
[namespace_path.underscore.presence, singular_name, 'path', "(@#{singular_name})"].compact.join('_')
|
110
117
|
end
|
111
118
|
|
112
119
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# rails generate effective:migration NAME [field[:type] field[:type]] [options]
|
2
2
|
|
3
|
-
# TODO -
|
3
|
+
# TODO - add default options
|
4
4
|
|
5
5
|
# Generates a create_* migration
|
6
6
|
# rails generate effective:migration Thing
|
@@ -22,11 +22,56 @@ module Effective
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def create_migration
|
25
|
-
|
25
|
+
if invoked_attributes.present?
|
26
|
+
Rails::Generators.invoke('migration', ["create_#{plural_name}"] + (invoked_attributes | timestamps))
|
27
|
+
elsif klass_attributes(verbose: false).present?
|
28
|
+
raise 'klass_attributes already exist. We cant migrate (yet). Exiting.'
|
29
|
+
elsif written_attributes.present?
|
30
|
+
Rails::Generators.invoke('migration', ["create_#{plural_name}"] + (written_attributes | timestamps))
|
31
|
+
else
|
32
|
+
raise 'You need to specify some attributes or have a model file present'
|
33
|
+
end
|
26
34
|
end
|
27
35
|
|
28
|
-
|
29
|
-
|
36
|
+
protected
|
37
|
+
|
38
|
+
# Written attributes include all belong_tos, as well as
|
39
|
+
# any Attributes comments as per our custom 'Attributes' comment block contained in the model file
|
40
|
+
|
41
|
+
# Attributes
|
42
|
+
# name :string
|
43
|
+
# description :text
|
44
|
+
#
|
45
|
+
# another :string
|
46
|
+
|
47
|
+
def written_attributes
|
48
|
+
@written_attributes ||= (
|
49
|
+
attributes = []
|
50
|
+
|
51
|
+
Effective::CodeWriter.new(File.join('app/models', class_path, "#{file_name}.rb")) do |w|
|
52
|
+
# belong_tos
|
53
|
+
references = w.select { |line| line.start_with?('belongs_to '.freeze) }
|
54
|
+
|
55
|
+
if references.present?
|
56
|
+
attributes += w.map(indexes: references) { |line| [[line.scan(/belongs_to\s+:(\w+)/).flatten.first, 'references']] }
|
57
|
+
end
|
58
|
+
|
59
|
+
# Attributes
|
60
|
+
first = w.find { |line| line == '# Attributes' }
|
61
|
+
break unless first
|
62
|
+
|
63
|
+
last = w.find(from: first) { |line| line.start_with?('#') == false && line.length > 0 }
|
64
|
+
break unless last
|
65
|
+
|
66
|
+
attributes += w.map(from: first+1, to: last-1) { |line| line.scan(/^\W+(\w+)\W+:(\w+)/).presence }
|
67
|
+
end
|
68
|
+
|
69
|
+
attributes.flatten(1).compact.map { |attribute| attribute.join(':') }
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
def timestamps
|
74
|
+
['created_at:datetime', 'updated_at:datetime']
|
30
75
|
end
|
31
76
|
|
32
77
|
end
|
@@ -13,10 +13,10 @@ module Effective
|
|
13
13
|
|
14
14
|
source_root File.expand_path(('../' * 4) + 'lib/scaffolds', __FILE__)
|
15
15
|
|
16
|
-
desc 'Creates an Effective Scaffold'
|
16
|
+
desc 'Creates an Effective Scaffold based on an existing model'
|
17
17
|
|
18
|
-
argument :
|
19
|
-
class_option :
|
18
|
+
argument :actions, type: :array, default: ['crud'], banner: 'action action'
|
19
|
+
class_option :attributes, type: :array, default: [], desc: 'Included permitted params, otherwise read from model'
|
20
20
|
|
21
21
|
def invoke_controller
|
22
22
|
Rails::Generators.invoke('effective:controller', [name] + invoked_actions + invoked_attributes_args)
|
@@ -35,6 +35,10 @@ module Effective
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def invoke_datatable
|
38
|
+
unless invoked_actions.include?('index')
|
39
|
+
say_status(:skipped, :datatable, :yellow) and return
|
40
|
+
end
|
41
|
+
|
38
42
|
Rails::Generators.invoke('effective:datatable', [name] + invoked_attributes)
|
39
43
|
end
|
40
44
|
|
@@ -43,6 +47,10 @@ module Effective
|
|
43
47
|
end
|
44
48
|
|
45
49
|
def invoke_form
|
50
|
+
unless invoked_actions.include?('new') || invoked_actions.include?('edit')
|
51
|
+
say_status(:skipped, :form, :yellow) and return
|
52
|
+
end
|
53
|
+
|
46
54
|
Rails::Generators.invoke('effective:form', [name] + invoked_attributes)
|
47
55
|
end
|
48
56
|
|
@@ -42,6 +42,10 @@ module Effective
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def invoke_datatable
|
45
|
+
unless invoked_actions.include?('index')
|
46
|
+
say_status(:skipped, :datatable, :yellow) and return
|
47
|
+
end
|
48
|
+
|
45
49
|
Rails::Generators.invoke('effective:datatable', [name] + invoked_attributes)
|
46
50
|
end
|
47
51
|
|
@@ -50,6 +54,10 @@ module Effective
|
|
50
54
|
end
|
51
55
|
|
52
56
|
def invoke_form
|
57
|
+
unless invoked_actions.include?('new') || invoked_actions.include?('edit')
|
58
|
+
say_status(:skipped, :form, :yellow) and return
|
59
|
+
end
|
60
|
+
|
53
61
|
Rails::Generators.invoke('effective:form', [name] + invoked_attributes)
|
54
62
|
end
|
55
63
|
|
@@ -6,16 +6,20 @@ require_dependency '<%= namespaced_path %>/application_controller'
|
|
6
6
|
class <%= namespaced_class_name %>Controller < <%= [namespace_path.classify.presence, ApplicationController].compact.join('::') %>
|
7
7
|
before_action :authenticate_user! # Devise enforce user is present
|
8
8
|
|
9
|
-
<% if
|
9
|
+
<% if defined?(EffectiveResources) -%>
|
10
|
+
include Effective::CrudController
|
11
|
+
|
12
|
+
<% end -%>
|
13
|
+
<% if actions.delete('index') && !defined?(EffectiveResources) -%>
|
10
14
|
def index
|
11
15
|
@page_title = '<%= plural_name.titleize %>'
|
12
16
|
authorize! :index, <%= class_name %>
|
13
17
|
|
14
|
-
@datatable =
|
18
|
+
@datatable = <%= namespaced_class_name %>Datatable.new(params[:scopes])
|
15
19
|
end
|
16
20
|
|
17
21
|
<% end -%>
|
18
|
-
<% if actions.delete('new') -%>
|
22
|
+
<% if actions.delete('new') && !defined?(EffectiveResources) -%>
|
19
23
|
def new
|
20
24
|
@<%= singular_name %> = <%= class_name %>.new
|
21
25
|
|
@@ -24,9 +28,9 @@ class <%= namespaced_class_name %>Controller < <%= [namespace_path.classify.pres
|
|
24
28
|
end
|
25
29
|
|
26
30
|
<% end -%>
|
27
|
-
<% if actions.delete('create') -%>
|
31
|
+
<% if actions.delete('create') && !defined?(EffectiveResources) -%>
|
28
32
|
def create
|
29
|
-
@<%= singular_name %> = <%= class_name %>.new(
|
33
|
+
@<%= singular_name %> = <%= class_name %>.new(<%= singular_name %>_params)
|
30
34
|
|
31
35
|
@page_title = 'New <%= human_name %>'
|
32
36
|
authorize! :create, @<%= singular_name %>
|
@@ -41,7 +45,7 @@ class <%= namespaced_class_name %>Controller < <%= [namespace_path.classify.pres
|
|
41
45
|
end
|
42
46
|
|
43
47
|
<% end -%>
|
44
|
-
<% if actions.delete('show') -%>
|
48
|
+
<% if actions.delete('show') && !defined?(EffectiveResources) -%>
|
45
49
|
def show
|
46
50
|
@<%= singular_name %> = <%= class_name %>.find(params[:id])
|
47
51
|
|
@@ -50,7 +54,7 @@ class <%= namespaced_class_name %>Controller < <%= [namespace_path.classify.pres
|
|
50
54
|
end
|
51
55
|
|
52
56
|
<% end -%>
|
53
|
-
<% if actions.delete('edit') -%>
|
57
|
+
<% if actions.delete('edit') && !defined?(EffectiveResources) -%>
|
54
58
|
def edit
|
55
59
|
@<%= singular_name %> = <%= class_name %>.find(params[:id])
|
56
60
|
|
@@ -59,14 +63,14 @@ class <%= namespaced_class_name %>Controller < <%= [namespace_path.classify.pres
|
|
59
63
|
end
|
60
64
|
|
61
65
|
<% end -%>
|
62
|
-
<% if actions.delete('update') -%>
|
66
|
+
<% if actions.delete('update') && !defined?(EffectiveResources) -%>
|
63
67
|
def update
|
64
68
|
@<%= singular_name %> = <%= class_name %>.find(params[:id])
|
65
69
|
|
66
70
|
@page_title = "Edit #{@<%= singular_name %>}"
|
67
71
|
authorize! :update, @<%= singular_name %>
|
68
72
|
|
69
|
-
if @<%= singular_name %>.update_attributes(
|
73
|
+
if @<%= singular_name %>.update_attributes(<%= singular_name %>_params)
|
70
74
|
flash[:success] = 'Successfully updated <%= singular_name %>'
|
71
75
|
redirect_to(redirect_path)
|
72
76
|
else
|
@@ -76,7 +80,7 @@ class <%= namespaced_class_name %>Controller < <%= [namespace_path.classify.pres
|
|
76
80
|
end
|
77
81
|
|
78
82
|
<% end -%>
|
79
|
-
<% if actions.delete('destroy') -%>
|
83
|
+
<% if actions.delete('destroy') && !defined?(EffectiveResources) -%>
|
80
84
|
def destroy
|
81
85
|
@<%= singular_name %> = <%= class_name %>.find(params[:id])
|
82
86
|
authorize! :destroy, @<%= singular_name %>
|
@@ -84,7 +88,7 @@ class <%= namespaced_class_name %>Controller < <%= [namespace_path.classify.pres
|
|
84
88
|
if @<%= singular_name %>.destroy
|
85
89
|
flash[:success] = 'Successfully deleted <%= singular_name %>'
|
86
90
|
else
|
87
|
-
flash
|
91
|
+
flash[:danger] = "Unable to delete <%= singular_name %>: #{@<%= singular_name %>.errors.full_messages.to_sentence}"
|
88
92
|
end
|
89
93
|
|
90
94
|
redirect_to <%= index_path %>
|
@@ -115,9 +119,9 @@ class <%= namespaced_class_name %>Controller < <%= [namespace_path.classify.pres
|
|
115
119
|
end
|
116
120
|
|
117
121
|
<% end -%>
|
118
|
-
|
122
|
+
protected
|
119
123
|
|
120
|
-
def
|
124
|
+
def <%= singular_name %>_params
|
121
125
|
params.require(:<%= singular_name %>).permit(:id,
|
122
126
|
<% attributes_names.each_slice(8).with_index do |slice, index| -%>
|
123
127
|
<%= slice.map { |name| permitted_param_for(name) }.join(', ') %><%= ',' if ((index+1) * 8) < attributes.length %>
|
@@ -125,6 +129,7 @@ class <%= namespaced_class_name %>Controller < <%= [namespace_path.classify.pres
|
|
125
129
|
)
|
126
130
|
end
|
127
131
|
|
132
|
+
<% if !defined?(EffectiveResources) -%>
|
128
133
|
def redirect_path
|
129
134
|
case params[:commit].to_s
|
130
135
|
when 'Save'
|
@@ -138,5 +143,6 @@ class <%= namespaced_class_name %>Controller < <%= [namespace_path.classify.pres
|
|
138
143
|
end
|
139
144
|
end
|
140
145
|
|
146
|
+
<% end -%>
|
141
147
|
end
|
142
148
|
<% end -%>
|
@@ -1,18 +1,14 @@
|
|
1
|
-
|
2
|
-
module Datatables
|
3
|
-
class <%= namespaced_class_name %> < Effective::Datatable
|
1
|
+
class <%= namespaced_class_name %>Datatable < Effective::Datatable
|
4
2
|
|
5
|
-
|
6
|
-
|
3
|
+
datatable do<% attributes.each do |attribute| %>
|
4
|
+
table_column :<%= attribute.name -%>
|
7
5
|
<% end %>
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def collection
|
13
|
-
<%= class_name %>.all
|
14
|
-
end
|
7
|
+
actions_column
|
8
|
+
end
|
15
9
|
|
16
|
-
|
10
|
+
def collection
|
11
|
+
<%= class_name %>.all
|
17
12
|
end
|
13
|
+
|
18
14
|
end
|
@@ -3,7 +3,11 @@
|
|
3
3
|
= f.input :<%= attribute.name %>
|
4
4
|
<% end -%>
|
5
5
|
|
6
|
+
<% if defined?(EffectiveResources) -%>
|
7
|
+
= simple_form_submit(f)
|
8
|
+
<% else -%>
|
6
9
|
%p.text-right
|
7
10
|
= f.button :submit, 'Save', data: { disable_with: 'Saving...' }
|
8
11
|
= f.button :submit, 'Save and Continue', data: { disable_with: 'Saving...' }
|
9
12
|
= f.button :submit, 'Save and Add New', data: { disable_with: 'Saving...' }
|
13
|
+
<% end -%>
|
@@ -3,9 +3,11 @@ class <%= class_name %> < <%= parent_class_name.classify %>
|
|
3
3
|
<% attributes.select(&:reference?).each do |attribute| -%>
|
4
4
|
belongs_to :<%= attribute.name %><%= ', polymorphic: true' if attribute.polymorphic? %><%= ', required: true' if attribute.required? %>
|
5
5
|
<% end -%>
|
6
|
+
<% if attributes.all? { |attribute| attribute.respond_to?(:token?) } -%>
|
6
7
|
<% attributes.select(&:token?).each do |attribute| -%>
|
7
8
|
has_secure_token<% if attribute.name != "token" %> :<%= attribute.name %><% end %>
|
8
9
|
<% end -%>
|
10
|
+
<% end -%>
|
9
11
|
<% if attributes.any?(&:password_digest?) -%>
|
10
12
|
has_secure_password
|
11
13
|
<% end -%>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_developer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|