Class: DevSystem::SimpleGenerator

Inherits:
BaseGenerator show all
Defined in:
lib/dev_system/subsystems/generator/generators/simple_generator.rb

Defined Under Namespace

Classes: Mapper, UnitHelper

Instance Attribute Summary

Attributes inherited from BaseGenerator

#menv

Attributes inherited from Liza::Controller

#menv

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from BaseGenerator

#action_name, #after, #args, #before_default, #before_input, #call, call, #command, default_args, #default_args, #default_booleans, default_booleans, default_strings, #default_strings, get_generator_signatures, #input_args, input_args, #input_booleans, input_booleans, input_strings, #input_strings, set_default_arg, #set_default_arg, #set_default_boolean, set_default_boolean, #set_default_string, set_default_string, set_input_arg, #set_input_arg, set_input_boolean, #set_input_boolean, set_input_string, #set_input_string

Methods inherited from Generator

get_generator_signatures

Methods inherited from Liza::Controller

#`, `, attr_accessor, attr_reader, attr_writer, #attrs, box, #box, call, color, division, division!, division?, inherited, menv_accessor, menv_reader, menv_writer, on_connected, panel, #panel, plural, require, requirements, sh, #sh, singular, subsystem, subsystem!, subsystem?, subsystem_token, token

Methods inherited from Liza::Unit

_erbs_for, #add, add, cl, #cl, class_methods_defined, const_added, const_missing, constants_defined, define_error, descendants_select, division, erbs_available, erbs_defined, erbs_for, errors, #fetch, fetch, get, #get, instance_methods_defined, log, #log, log?, #log?, #log_array, log_array, log_hash, #log_hash, #log_level, log_level, #log_level?, log_level?, log_levels, #log_levels, #log_render_convert, #log_render_format, #log_render_in, #log_render_out, method_added, methods_defined, namespace, part, raise_error, #raise_error, reload!, #reload!, #render, #render!, #render_stack, renderable_formats_for, renderable_names, section, sections, #set, set, #settings, settings, singleton_method_added, sleep, #sleep, stick, #stick, sticks, #sticks, subclasses_select, subunits, system, #system, system?, test_class, time_diff, #time_diff

Class Method Details

.before_instance_call(method, *args, &block) ⇒ Object



7
8
9
10
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 7

def self.before_instance_call(method, *args, &block)
  log :higher, "before_instance_call save #{method}, #{args}, #{block}"
  before_instance_calls << [method, args, block]
end

.before_instance_callsObject



5
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 5

def self.before_instance_calls()= fetch(:before_instance_calls) { [] }

.set_default_views(views) ⇒ Object



243
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 243

def self.set_default_views(views) = before_instance_call(:set_default_views, views)

Instance Method Details

#add_unit(unit, class_names, unit_path) ⇒ Object



262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 262

def add_unit(unit, class_names, unit_path)
  raise "unit_path cannot be empty" if unit_path.nil?
  @current_unit = unit
  @class_names = class_names
  @class_name = class_names[0]
  unit.sections.each do |section|
    @current_section = section
    section[:content] = render! section[:render_key], format: :rb
  end
  unit.views.each do |view|
    view[:content] = render! view[:render_key], format: view[:render_format]
  end

  new_lines = render! :unit, format: :rb
  if arg_views_eof? && unit.views.any?
    new_lines << "\n__END__\n\n"
    unit.views.each do |view|
      new_lines << "# view #{view[:name]}.#{view[:format]}.erb\n#{view[:content]}"
    end
  end
  mapper.write_after unit_path, new_lines
end

#add_view(unit, view, view_path) ⇒ Object



285
286
287
288
289
290
291
292
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 285

def add_view(unit, view, view_path)
  raise "view_path cannot be empty" if view_path.nil?
  view[:content] = render! view[:render_key], format: view[:render_format]

  new_content = view[:content].dup
  new_content.prepend "# view #{view[:name]}.#{view[:format]}.erb\n" if arg_views_adjacent?
  mapper.write_after view_path, new_content
end

#app_shellObject



341
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 341

def app_shell() = @app_shell ||= AppShell.new

#arg_viewsObject



249
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 249

def arg_views() = @arg_views ||= command.simple_string(:views)

#arg_views_adjacent?Boolean

Returns:



239
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 239

def arg_views_adjacent?() = arg_views == 'adjacent'

#arg_views_eof?Boolean

Returns:



237
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 237

def arg_views_eof?() = arg_views == 'eof'

#arg_views_nested?Boolean

Returns:



241
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 241

def arg_views_nested?() = arg_views == 'nested'

#arg_views_none?Boolean

Returns:



235
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 235

def arg_views_none?() = arg_views == 'none'

#beforeObject



12
13
14
15
16
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 12

def before
  super

  before_instance_calls
end

#before_instance_callsObject



18
19
20
21
22
23
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 18

def before_instance_calls
  self.class.before_instance_calls.each do |method, args, block|
    log :higher, "before_instance_call send #{method}, #{args}, #{block}"
    send method, *args, &block
  end
end

#copy_examples(controller) ⇒ Object



193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 193

def copy_examples controller
  puts
  log controller.to_s
  singular = controller.singular
  sys = controller.system.token
  
  [
    Lizarb.gem_dir,
    Lizarb.app_dir,
  ].uniq.each do |dir|
    FileShell.directory? "#{dir}/examples/#{singular}" or next
    copy_files "#{dir}/examples/#{singular}/app/#{sys}", "#{App.directory}/#{sys}"
  end
end

#copy_file(source, target) ⇒ Object



227
228
229
230
231
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 227

def copy_file source, target
  path = App.root.join target
  text = FileShell.read_text source
  mapper.write_after path, text
end

#copy_files(from_folder, to_folder) ⇒ Object



210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 210

def copy_files from_folder, to_folder
  from_pattern = "#{from_folder}/**/*"
  log "from_pattern = #{from_pattern}"

  from_files = Dir[from_pattern]
  log "from_files"
  log_array from_files
  puts

  from_files.each do |source|
    next if File.directory? source

    target = source.sub(from_folder, to_folder)
    copy_file source, target
  end
end

#create_file(name, template, format) ⇒ Object



169
170
171
172
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 169

def create_file name, template, format
  contents = render! template, format: format
  create_file_contents name, contents
end

#create_file_contents(name, contents) ⇒ Object



174
175
176
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 174

def create_file_contents name, contents
  update_file name, contents
end

#delete_file(name) ⇒ Object



188
189
190
191
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 188

def delete_file name
  path = App.root.join name
  mapper.delete_after path
end

#generate(*args, &block) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 94

def generate(*args, &block)
  args = args.flatten
  cmd_menv = Command.panel.forge ["generate", *args]
  cmd_menv[:command] = SimpleCommand.new.tap do |cmd|
    cmd.instance_variable_set :@menv, cmd_menv
    cmd.before
  end

  gen_menv = panel.forge cmd_menv
  gen_menv[:simple_mapper] = mapper
  panel.forge_shortcut gen_menv
  panel.find gen_menv
  panel.find_shortcut gen_menv
  panel.forward gen_menv
end

#informObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 27

def inform
  log :lowest, "informing #{mapper.changes.count} changes"

  mapper.changes.each do |fname, data|
    mapper.changes.delete fname if data[:before] == data[:after]
  end
  
  mapper.changes.each do |fname, data|
    puts_line
    
    action = "updating"
    action = "creating" if data[:before] == ""
    action = "deleting" if data[:after] == ""

    diff = {
      "+": (data[:after].split("\n") - data[:before].split("\n")).count,
      "-": (data[:before].split("\n") - data[:after].split("\n")).count,
    }

    bit = diff.map { "#{_1}#{_2}" }.join(" ")
    relative = Pathname(fname).relative_path_from(App.root)
    string = "#{action.ljust 8} | #{"#{bit}".rjust 8} lines | #{relative}"
    log :lowest, string

    if log_level? :low
      puts relative
      DifflcsGemShell.log_diff(data[:before].split("\n"), data[:after].split("\n")) if diff.values.sum.positive?
    end
  end
end

#mapperObject



110
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 110

def mapper() = menv[:simple_mapper] ||= Mapper.new(self)

#pick_many_units(units) ⇒ Object



330
331
332
333
334
335
336
337
338
339
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 330

def pick_many_units(units)
  options = units.map do |unit|
    [
      "#{TypographyShell.color_class unit}",
      unit
    ]
  end.to_h
  selected = units.count == 1 ? :all : :none
  InputShell.multi_select "Pick Multiple Controllers", options, selected: selected
end

#puts_lineObject



343
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 343

def puts_line() =  puts "-" * 120

#read_file(name) ⇒ Object



178
179
180
181
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 178

def read_file name
  path = App.root.join name
  mapper.read_after path
end

#remove_units(units) ⇒ Object



317
318
319
320
321
322
323
324
325
326
327
328
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 317

def remove_units(units)
  units.each do |unit|
    unit_path_radical = unit.source_location_radical
    unit_path = "#{unit_path_radical}.rb"

    mapper.delete_after Pathname unit_path
    views = Dir["#{unit_path_radical}*/**/*"]
    views.each do |fname|
      mapper.delete_after Pathname fname
    end
  end
end

#saveObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 58

def save
  puts_line
  diff = {
    "+": mapper.changes.map { _2[:after].split("\n").count }.sum,
    "-": mapper.changes.map { _2[:before].split("\n").count }.sum,
  }
  log "saving #{mapper.changes.count} files changed: #{diff[:"+"]} insertions(+), #{diff[:"-"]} deletions(-)"

  choices = mapper.changes.keys.map { [_1, _1] }.to_h
  if command.simple_boolean :confirm
    answers = choices.keys
  else
    answers = InputShell.multi_select "Approve all changes?", choices
  end

  #
  
  puts_line
  diff = {
    "+": mapper.changes.map { _2[:after].split("\n").count }.sum,
    "-": mapper.changes.map { _2[:before].split("\n").count }.sum,
  }
  log "saving #{answers.count} files changed: #{diff[:"+"]} insertions(+), #{diff[:"-"]} deletions(-)"

  answers.each do |fname|
    answer = mapper.changes[fname]
    if answer[:after] == ""
      FileShell.remove fname, log_level: :higher
    else
      FileShell.write_text fname, answer[:after], log_level: :higher
    end
  end
end

#set_default_views(views) ⇒ Object



245
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 245

def set_default_views(views) = command.set_default_string(:views, views)

#update_file(name, contents) ⇒ Object



183
184
185
186
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 183

def update_file name, contents
  path = App.root.join name
  mapper.write_after path, contents
end

#valid_viewsObject



247
# File 'lib/dev_system/subsystems/generator/generators/simple_generator.rb', line 247

def valid_views() = @valid_views ||=  %w[none eof adjacent nested]