Class: Pinspec::Emit::SpecWriter

Inherits:
Object
  • Object
show all
Defined in:
lib/pinspec/emit/spec_writer.rb

Defined Under Namespace

Classes: RawRuby, Result

Constant Summary collapse

SPEC_DIR =
"spec/characterization"
SUPPORT_DIR =
"spec/characterization/support"
SERIALIZER_TEMPLATE =
File.expand_path("../../../templates/serializer.rb", __dir__)
SUPPORT_TEMPLATE =
File.expand_path("../../../templates/spec_support.rb", __dir__)
FACTORY_TEMPLATE =
File.expand_path("../../../templates/factory_build.rb", __dir__)
PROVENANCE =
"pinspec:generated"

Instance Method Summary collapse

Constructor Details

#initialize(app_root:, target:, plan:, corpus:, stability:, fk_map:, force: false, only_aspect: nil, spec_dir: nil, namer: nil) ⇒ SpecWriter

Returns a new instance of SpecWriter.



20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/pinspec/emit/spec_writer.rb', line 20

def initialize(app_root:, target:, plan:, corpus:, stability:, fk_map:, force: false,
               only_aspect: nil, spec_dir: nil, namer: nil)
  @app_root = app_root
  @target = target
  @plan = plan
  @corpus = corpus
  @stability = stability
  @fk_map = fk_map
  @force = force
  @only_aspect = only_aspect
  @spec_dir = spec_dir || SPEC_DIR
  @namer = namer
end

Instance Method Details

#guard_existing!Object



55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/pinspec/emit/spec_writer.rb', line 55

def guard_existing!
  return unless File.file?(spec_path)

  existing = Analyzer::Source.read(spec_path)
  return if @force

  unless existing.include?(PROVENANCE)
    raise VerifyFailed,
          "#{spec_path} already exists and was not written by pinspec. " \
          "Nothing pinspec did not write is ever overwritten; move it aside " \
          "or pass --force."
  end
end

#spec_pathObject



34
35
36
37
38
# File 'lib/pinspec/emit/spec_writer.rb', line 34

def spec_path
  suffix = @only_aspect ? "_#{@only_aspect}" : ""

  File.join(@app_root, @spec_dir, "#{file_stem}#{suffix}_spec.rb")
end

#write!Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/pinspec/emit/spec_writer.rb', line 40

def write!
  guard_existing!

  FileUtils.mkdir_p(File.dirname(spec_path))
  FileUtils.mkdir_p(File.join(@app_root, SUPPORT_DIR))

  support = write_support!
  File.write(spec_path, render)

  Result.new(
    spec_path: spec_path, support_paths: support,
    pinned_cases: pinned.map { |verdict| verdict.case_id }, aspects: aspect_counts
  )
end