Class: ZodRails::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/zod_rails/generator.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(output_dir:) ⇒ Generator

Returns a new instance of Generator.



7
8
9
10
11
# File 'lib/zod_rails/generator.rb', line 7

def initialize(output_dir:)
  @output_dir = output_dir
  @file_writer = Generation::FileWriter.new(output_dir: output_dir)
  @emitter = Generation::TypescriptEmitter.new
end

Instance Attribute Details

#emitterObject (readonly)

Returns the value of attribute emitter.



5
6
7
# File 'lib/zod_rails/generator.rb', line 5

def emitter
  @emitter
end

#file_writerObject (readonly)

Returns the value of attribute file_writer.



5
6
7
# File 'lib/zod_rails/generator.rb', line 5

def file_writer
  @file_writer
end

#output_dirObject (readonly)

Returns the value of attribute output_dir.



5
6
7
# File 'lib/zod_rails/generator.rb', line 5

def output_dir
  @output_dir
end

Instance Method Details

#check(model_classes) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/zod_rails/generator.rb', line 46

def check(model_classes)
  model_classes.each_with_object([]) do |klass, drift|
    target = generate_content(klass)
    full_path = File.join(output_dir, target[:filename])
    expected = file_writer.preview(filename: target[:filename], content: target[:content])

    if !File.exist?(full_path)
      drift << { filename: target[:filename], status: :missing }
    elsif File.read(full_path) != expected
      drift << { filename: target[:filename], status: :drifted }
    end
  end
end

#generate(model_class) ⇒ Object



13
14
15
16
17
# File 'lib/zod_rails/generator.rb', line 13

def generate(model_class)
  result = generate_content(model_class)
  file_writer.write(filename: result[:filename], content: result[:content])
  result[:filename]
end

#generate_all(model_classes) ⇒ Object



40
41
42
43
44
# File 'lib/zod_rails/generator.rb', line 40

def generate_all(model_classes)
  files = model_classes.map { |klass| generate(klass) }
  run_post_generate_command
  files
end

#generate_content(model_class) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/zod_rails/generator.rb', line 19

def generate_content(model_class)
  inspector = Introspection::ModelInspector.new(model_class)
  excluded = ZodRails.configuration.excluded_columns
  builder = Generation::SchemaBuilder.new(inspector, excluded_columns: excluded)

  response_schema = {
    name: builder.schema_name,
    body: builder.build
  }

  input_schema = {
    name: builder.schema_name(input_schema: true),
    body: builder.build(input_schema: true)
  }

  content = emitter.emit_combined(response: response_schema, input: input_schema)
  filename = file_writer.output_path_for(inspector.model_name)

  { filename: filename, content: content }
end