bullet_train-super_scaffolding 1.8.2 → 1.8.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 52bd806e1278e3ac3365aa11d8b5d8dc723daa05342e6aba8661dd05522672bd
4
- data.tar.gz: b0a9c6b29e04b3bf5683db9cdb9df7d851f3601422083246a1f76e41e8896c34
3
+ metadata.gz: 9fd34927138c9c4d62670e1cd4db49b074182fdafd559911c7a21614d31d0b99
4
+ data.tar.gz: e210ebe306a8c89bb453dcb6d5d9c732d8a783432a790c5f48c4cc5fe9a33525
5
5
  SHA512:
6
- metadata.gz: d421e343cecfe142599857aeeb89d13b69699c6e4ac3bf03391575ab8f664e7641072c9235f299aae5c15bc65181d2165f535ca699e60b51e5cc0800ed1051d5
7
- data.tar.gz: 46b0ea1b3621ddaddc77ca8f5aa08777434f796b54f7648dab73ef69860c845e253ec789b0a95721c6f12adb10876885d06d11a59f19ab8d3c2188581734c41b
6
+ metadata.gz: 7d787a123c710490675403e27c0560627d29c031f297252c8a4f3bd051d4968813c58ad2c8001d214d536cab872ed8058efcd38e16f5cb2a3e875a85787c6622
7
+ data.tar.gz: 88c909ec4c12c78e15e93257a87b3d03e26782a81125bc4664723154bdb41afa828d6ec193cd29de174516c5ae9083634dcc5a1bc1c8ec73aeacbc6ec0cfc35f
@@ -1,5 +1,5 @@
1
1
  module BulletTrain
2
2
  module SuperScaffolding
3
- VERSION = "1.8.2"
3
+ VERSION = "1.8.4"
4
4
  end
5
5
  end
@@ -22,7 +22,8 @@ module BulletTrain
22
22
  "action-models:targets-one" => "BulletTrain::ActionModels::Scaffolders::TargetsOneScaffolder",
23
23
  "action-models:targets-one-parent" => "BulletTrain::ActionModels::Scaffolders::TargetsOneParentScaffolder",
24
24
  "action-models:performs-export" => "BulletTrain::ActionModels::Scaffolders::PerformsExportScaffolder",
25
- "action-models:performs-import" => "BulletTrain::ActionModels::Scaffolders::PerformsImportScaffolder"
25
+ "action-models:performs-import" => "BulletTrain::ActionModels::Scaffolders::PerformsImportScaffolder",
26
+ "audit-logs" => "BulletTrain::AuditLogs::Scaffolders::AuditLogScaffolder"
26
27
  }
27
28
 
28
29
  class Runner
@@ -0,0 +1,22 @@
1
+ Description:
2
+ Generate files needed to add an audit log to a model.
3
+
4
+ Example:
5
+ E.g. Add audit logs to Posts from a Team.
6
+ rails generate super_scaffold:audit_logs Post Team name:text_field
7
+
8
+ The attributes you specify will be added to the _version partial and used to show different versions of the model.
9
+
10
+ This will create:
11
+ db/migrate/20241115152914_add_project_to_activity_versions.rb
12
+ app/views/account/projects/_version.html.erb'.
13
+ And update:
14
+ app/models/project.rb
15
+ app/models/activity/version.rb
16
+ app/views/account/projects/show.html.erb
17
+ app/models/activity/version.rb
18
+ config/routes.rb
19
+ app/controllers/account/projects_controller.rb
20
+
21
+ 🏆 Protip: Commit your other changes before running Super Scaffolding so it's easy to undo if you (or we) make any mistakes.
22
+ If you do that, you can reset to your last commit state by using `git checkout .` and `git clean -d -f`.
@@ -0,0 +1,26 @@
1
+ require_relative "../super_scaffold_base"
2
+ require "scaffolding/routes_file_manipulator"
3
+
4
+ class AuditLogsGenerator < Rails::Generators::Base
5
+ include SuperScaffoldBase
6
+
7
+ source_root File.expand_path("templates", __dir__)
8
+
9
+ namespace "super_scaffold:audit_logs"
10
+
11
+ argument :target_model, type: :string
12
+ argument :parent_model, type: :string
13
+ argument :attributes, type: :array, banner: "attribute:type attribute:type"
14
+
15
+ def generate
16
+ if defined?(BulletTrain::AuditLogs)
17
+ # We add the name of the specific super_scaffolding command that we want to
18
+ # invoke to the beginning of the argument string.
19
+ ARGV.unshift "audit-logs"
20
+ BulletTrain::SuperScaffolding::Runner.new.run
21
+ else
22
+ puts "You must have AuditLogs installed if you want to use this generator.".red
23
+ puts "Please refer to the documentation for more information: https://bullettrain.co/docs/audit-logs"
24
+ end
25
+ end
26
+ end
@@ -158,6 +158,33 @@ class Scaffolding::RoutesFileManipulator
158
158
  namespace_block_start.present? ? {namespace => namespace_block_start} : {}
159
159
  end
160
160
 
161
+ def find_last_in_namespace(needle, namespaces, within = nil, ignore = nil)
162
+ if namespaces.any?
163
+ namespace_lines = find_namespaces(namespaces, within)
164
+ within = namespace_lines[namespaces.last]
165
+ end
166
+
167
+ lines_within = Scaffolding::FileManipulator.lines_within(lines, within)
168
+ lines_within.reverse.each_with_index do |line, line_number|
169
+ reversed_line_number = lines_within.count - line_number - 1
170
+ # + 2 because line_number starts from 0, and within starts one line after
171
+ actual_line_number = (within + reversed_line_number + 2)
172
+
173
+ # The lines we want to ignore may be a a series of blocks, so we check each Range here.
174
+ ignore_line = false
175
+ if ignore.present?
176
+ ignore.each do |lines_to_ignore|
177
+ ignore_line = true if lines_to_ignore.include?(actual_line_number)
178
+ end
179
+ end
180
+
181
+ next if ignore_line
182
+ return (within + (within ? 1 : 0) + reversed_line_number) if line.match?(needle)
183
+ end
184
+
185
+ nil
186
+ end
187
+
161
188
  def find_in_namespace(needle, namespaces, within = nil, ignore = nil)
162
189
  if namespaces.any?
163
190
  namespace_lines = find_namespaces(namespaces, within)
@@ -187,15 +214,26 @@ class Scaffolding::RoutesFileManipulator
187
214
  within = options[:within]
188
215
  parts = parts.dup
189
216
  resource = parts.pop
217
+ needle = /resources :#{resource}#{options[:options] ? ", #{options[:options].gsub(/({)(.*)(})/, '{\2}')}" : ""}(,?\s.*)? do(\s.*)?$/
218
+
190
219
  # TODO this doesn't take into account any options like we do in `find_resource`.
191
- find_in_namespace(/resources :#{resource}#{options[:options] ? ", #{options[:options].gsub(/({)(.*)(})/, '{\2}')}" : ""}(,?\s.*)? do(\s.*)?$/, parts, within)
220
+ if options[:find_last]
221
+ find_last_in_namespace(needle, parts, within)
222
+ else
223
+ find_in_namespace(needle, parts, within)
224
+ end
192
225
  end
193
226
 
194
227
  def find_resource(parts, options = {})
195
228
  parts = parts.dup
196
229
  resource = parts.pop
197
230
  needle = /resources :#{resource}#{options[:options] ? ", #{options[:options].gsub(/({)(.*)(})/, '{\2}')}" : ""}(,?\s.*)?$/
198
- find_in_namespace(needle, parts, options[:within], options[:ignore])
231
+
232
+ if options[:find_last]
233
+ find_last_in_namespace(needle, parts, options[:within], options[:ignore])
234
+ else
235
+ find_in_namespace(needle, parts, options[:within], options[:ignore])
236
+ end
199
237
  end
200
238
 
201
239
  def find_or_create_resource(parts, options = {})
@@ -278,17 +316,18 @@ class Scaffolding::RoutesFileManipulator
278
316
  end
279
317
 
280
318
  def find_or_convert_resource_block(parent_resource, options = {})
281
- unless find_resource_block([parent_resource], options)
282
- if (resource_line_number = find_resource([parent_resource], options))
283
- # convert it.
284
- lines[resource_line_number].gsub!("\n", " do\n")
285
- insert_after(["end"], resource_line_number)
286
- else
287
- raise BulletTrain::SuperScaffolding::CannotFindParentResourceException.new("the parent resource (`#{parent_resource}`) doesn't appear to exist in `#{@filename}`.")
319
+ resource_statement_line = find_resource([parent_resource], options)
320
+ if resource_statement_line
321
+ resource_statement = lines[resource_statement_line]
322
+ if !resource_statement.match?(/ do(\s.*)?$/)
323
+ lines[resource_statement_line].gsub!("\n", " do\n")
324
+ insert_after(["end"], resource_statement_line)
288
325
  end
326
+ else
327
+ raise BulletTrain::SuperScaffolding::CannotFindParentResourceException.new("the parent resource (`#{parent_resource}`) doesn't appear to exist in `#{@filename}`.")
289
328
  end
290
329
 
291
- # update the block of code we're working within.
330
+ # capture the line number of the block of code we're working within.
292
331
  unless (within = find_resource_block([parent_resource], options))
293
332
  raise "tried to convert the parent resource to a block, but failed?"
294
333
  end
@@ -328,13 +367,18 @@ class Scaffolding::RoutesFileManipulator
328
367
  # end
329
368
  # end
330
369
 
331
- parent_within = find_or_convert_resource_block(parent_resource, within: within)
370
+ parent_within = find_resource([parent_resource], within: within)
371
+
372
+ # With deeply nested namespaces we end up with mutliple resource blocks and some things need
373
+ # to go into the last block. See this issue for details:
374
+ # https://github.com/bullet-train-co/bullet_train/issues/1655
375
+ last_parent_within = find_or_convert_resource_block(parent_resource, within: within, find_last: true)
332
376
 
333
377
  # add the new resource within that namespace.
334
378
  line = "scope module: '#{parent_resource}' do"
335
379
  # TODO you haven't tested this yet.
336
- unless (scope_within = Scaffolding::FileManipulator.find(lines, /#{line}/, parent_within))
337
- scope_within = insert([line, "end"], parent_within)
380
+ unless (scope_within = Scaffolding::FileManipulator.find(lines, /#{line}/, last_parent_within))
381
+ scope_within = insert([line, "end"], last_parent_within)
338
382
  end
339
383
 
340
384
  if child_namespaces.size > 1
@@ -361,7 +405,9 @@ class Scaffolding::RoutesFileManipulator
361
405
  else
362
406
  routing_options = "only: collection_actions"
363
407
  routing_options += ", #{formatted_concerns}" if formatted_concerns
364
- find_or_create_resource([child_resource], options: routing_options, within: scope_within)
408
+ # We find last here for this reason:
409
+ # https://github.com/bullet-train-co/bullet_train/issues/1655
410
+ find_or_create_resource([child_resource], options: routing_options, within: scope_within, find_last: true)
365
411
 
366
412
  # namespace :projects do
367
413
  # resources :deliverables, except: collection_actions
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullet_train-super_scaffolding
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.2
4
+ version: 1.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Culver
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-11-12 00:00:00.000000000 Z
11
+ date: 2024-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: standard
@@ -174,6 +174,8 @@ files:
174
174
  - lib/generators/super_scaffold/action_models/targets_one/targets_one_generator.rb
175
175
  - lib/generators/super_scaffold/action_models/targets_one_parent/USAGE
176
176
  - lib/generators/super_scaffold/action_models/targets_one_parent/targets_one_parent_generator.rb
177
+ - lib/generators/super_scaffold/audit_logs/USAGE
178
+ - lib/generators/super_scaffold/audit_logs/audit_logs_generator.rb
177
179
  - lib/generators/super_scaffold/conversations/USAGE
178
180
  - lib/generators/super_scaffold/conversations/conversations_generator.rb
179
181
  - lib/generators/super_scaffold/field/USAGE