Class: Zapata::RZpec::Writer

Inherits:
Object
  • Object
show all
Defined in:
lib/zapata/rzpec/writer.rb

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(file, _code, subject_analysis, whole_analysis, spec_analysis = nil) ⇒ Writer

Returns a new instance of Writer.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/zapata/rzpec/writer.rb', line 14

def initialize(file, _code, subject_analysis, whole_analysis, spec_analysis = nil)
  self.class.reset_ivars
  @subject_analysis = subject_analysis
  @whole_analysis = whole_analysis
  @spec_analysis = spec_analysis
  @writer = Core::Writer.new(file)
  @result = {}

  write_require

  klasses.each do |klass|
    write_class(klass)
  end

  self.class.reset_ivars
end

Class Attribute Details

.ivarsObject

Returns the value of attribute ivars.



7
8
9
# File 'lib/zapata/rzpec/writer.rb', line 7

def ivars
  @ivars
end

Class Method Details

.reset_ivarsObject



9
10
11
# File 'lib/zapata/rzpec/writer.rb', line 9

def reset_ivars
  @ivars = []
end

Instance Method Details

#initialize_def(klass) ⇒ Object



46
47
48
# File 'lib/zapata/rzpec/writer.rb', line 46

def initialize_def(klass)
  klass_defs(klass).detect { |method| method.name == :initialize }
end

#klass_defs(klass) ⇒ Object



39
40
41
42
43
44
# File 'lib/zapata/rzpec/writer.rb', line 39

def klass_defs(klass)
  @subject_analysis.select do |method|
    [Primitive::Def, Primitive::Defs].include?(method.class) &&
      method.public? && method.klass.name == klass.name
  end
end

#klassesObject



35
36
37
# File 'lib/zapata/rzpec/writer.rb', line 35

def klasses
  @subject_analysis.select { |obj| obj.is_a?(Primitive::Klass) }
end

#write_class(klass) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/zapata/rzpec/writer.rb', line 50

def write_class(klass)
  @writer.append_line
  @writer.append_line("describe #{klass.name} do")

  write_instance_let(klass)

  klass_defs(klass).each do |primitive_def|
    write_method(primitive_def)
  end

  self.class.ivars.each do |ivar|
    predicted_value = Predictor::Value.new(ivar.value, ivar).choose
    literal_predicted_value = Printer.print(predicted_value.to_raw)
    write_let(ivar.value, literal_predicted_value)
  end

  @writer.append_line('end')
end

#write_equal(method_name) ⇒ Object



108
109
110
111
112
113
114
# File 'lib/zapata/rzpec/writer.rb', line 108

def write_equal(method_name)
  if @spec_analysis
    Printer.print(Primitive::Raw.new(:literal, @spec_analysis.expected(method_name)))
  else
    Printer.print(Primitive::Raw.new(:str, 'Fill this in by hand'))
  end
end

#write_instance_let(klass) ⇒ Object



69
70
71
72
73
74
75
# File 'lib/zapata/rzpec/writer.rb', line 69

def write_instance_let(klass)
  if initialize_def = initialize_def(klass)
    write_let_from_initialize(initialize_def)
  else
    write_let(klass.name, "#{klass.name}.new")
  end
end

#write_let(name, block) ⇒ Object



77
78
79
80
81
# File 'lib/zapata/rzpec/writer.rb', line 77

def write_let(name, block)
  @writer.append_line("let(:#{Printer.to_var_name(name)}) do")
  @writer.append_line(block)
  @writer.append_line('end')
end

#write_let_from_initialize(initialize_def) ⇒ Object



83
84
85
86
# File 'lib/zapata/rzpec/writer.rb', line 83

def write_let_from_initialize(initialize_def)
  block = "#{initialize_def.klass.name}.new#{initialize_def.literal_predicted_args}"
  write_let(initialize_def.klass.name, block)
end

#write_method(primitive_def) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/zapata/rzpec/writer.rb', line 88

def write_method(primitive_def)
  return unless primitive_def.node.body
  return if primitive_def.name == :initialize

  @writer.append_line
  @writer.append_line("it '##{primitive_def.name}' do")

  receiver = if primitive_def.self?
    primitive_def.klass.name
  else
    Printer.to_var_name(primitive_def.klass.name)
  end

  @writer.append_line(
    "expect(#{receiver}.#{primitive_def.name}#{primitive_def.literal_predicted_args}).to eq(#{write_equal(primitive_def.name)})"
  )

  @writer.append_line('end')
end

#write_requireObject



31
32
33
# File 'lib/zapata/rzpec/writer.rb', line 31

def write_require
  @writer.append_line("require '#{Core::Loader.helper_name}'")
end