effective_developer 0.0.9 → 0.0.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4dba9b31a7c6e5352ab958ac3a0f1927e5531013
4
- data.tar.gz: 4f0127dc920f97aaef72cdad34b09aadac2356fc
3
+ metadata.gz: 5c9d245ef9985403865d0ff86827272eddb8451a
4
+ data.tar.gz: 3da5a891679cd2c3abbc30a4feb9a9a3e68f080d
5
5
  SHA512:
6
- metadata.gz: 447cd0b8ed58bb3bdc2557454795d663ec5a491ee76e7bf967f1aaa7dd37e503ff4603be3217332a0bdf44c5bf018dc9e1e31cd52c94c3df2262b1845f73255c
7
- data.tar.gz: 3d7dd836c6fe704dc80082cb4479e56443f77417f17603443a2caec606e5ad20f02c7e9bf5449846f46e53bdfa86401566612bbb54328c51636e05b0ee128840
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 returnst rue
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
@@ -1,3 +1,3 @@
1
1
  module EffectiveDeveloper
2
- VERSION = '0.0.9'.freeze
2
+ VERSION = '0.0.10'.freeze
3
3
  end
@@ -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/effective/datatables folder.'
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/models/effective/datatables', namespace_path, "#{plural_name}.rb")
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
- (attributes.keys - [klass.primary_key, 'created_at', 'updated_at']).map do |attr|
62
- "#{attr}:#{klass.column_for_attribute(attr).type || 'string'}"
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('_') + '_path'
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('_') + '_path'
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].compact.join('_') + "_path(@#{singular_name})"
116
+ [namespace_path.underscore.presence, singular_name, 'path', "(@#{singular_name})"].compact.join('_')
110
117
  end
111
118
 
112
119
  end
@@ -12,7 +12,7 @@ module Effective
12
12
 
13
13
  desc 'Adds a menu link to an existing _navbar.html.haml'
14
14
 
15
- def invoke_ability
15
+ def invoke_menu
16
16
  say_status :invoke, :menu, :white
17
17
  end
18
18
 
@@ -1,6 +1,6 @@
1
1
  # rails generate effective:migration NAME [field[:type] field[:type]] [options]
2
2
 
3
- # TODO - read from model dsl
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
- Rails::Generators.invoke('migration', ["create_#{plural_name}"] + invoked_attributes)
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
- def invoked_attributes
29
- super | ['created_at:datetime', 'updated_at:datetime']
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 :attributes, type: :array, default: [], banner: 'field[:type] field[:type]'
19
- class_option :actions, type: :array, default: ['crud'], desc: 'Included actions', banner: 'index show'
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 actions.delete('index') -%>
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 = Effective::Datatables::<%= namespaced_class_name %>.new(params[:scopes])
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(permitted_params)
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(permitted_params)
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.now[:danger] = "Unable to delete <%= singular_name %>: #{@<%= singular_name %>.errors.full_messages.to_sentence}"
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
- private
122
+ protected
119
123
 
120
- def permitted_params
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
- module Effective
2
- module Datatables
3
- class <%= namespaced_class_name %> < Effective::Datatable
1
+ class <%= namespaced_class_name %>Datatable < Effective::Datatable
4
2
 
5
- datatable do<% attributes.each do |attribute| %>
6
- table_column :<%= attribute.name -%>
3
+ datatable do<% attributes.each do |attribute| %>
4
+ table_column :<%= attribute.name -%>
7
5
  <% end %>
8
6
 
9
- actions_column
10
- end
11
-
12
- def collection
13
- <%= class_name %>.all
14
- end
7
+ actions_column
8
+ end
15
9
 
16
- end
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 -%>
@@ -1,3 +1,3 @@
1
1
  %h1= @page_title
2
2
 
3
- = render partial: 'form', locals: { <%= singular_name %>: @<%= singular_name %> }
3
+ = render 'form', <%= singular_name %>: @<%= singular_name %>
@@ -1,3 +1,3 @@
1
1
  %h1= @page_title
2
2
 
3
- = render partial: 'form', locals: { <%= singular_name %>: @<%= singular_name %> }
3
+ = render 'form', <%= singular_name %>: @<%= singular_name %>
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.9
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: 2016-12-23 00:00:00.000000000 Z
11
+ date: 2017-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails