Class: WritersRoom::Versioner

Inherits:
Object
  • Object
show all
Defined in:
lib/writers_room/versioner.rb

Overview

Manages file versioning for story elements. Creates slug_v1.md, slug_v2.md, etc. in the same directory.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dir, slug) ⇒ Versioner

Returns a new instance of Versioner.



11
12
13
14
# File 'lib/writers_room/versioner.rb', line 11

def initialize(dir, slug)
  @dir  = dir
  @slug = slug
end

Instance Attribute Details

#dirObject (readonly)

Returns the value of attribute dir.



9
10
11
# File 'lib/writers_room/versioner.rb', line 9

def dir
  @dir
end

#slugObject (readonly)

Returns the value of attribute slug.



9
10
11
# File 'lib/writers_room/versioner.rb', line 9

def slug
  @slug
end

Instance Method Details

#create_new_version(body: "", metadata: {}, based_on: nil) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/writers_room/versioner.rb', line 33

def create_new_version(body: "", metadata: {}, based_on: nil)
  next_num = version_count + 1
  version_file = "#{@slug}_v#{next_num}.md"
  version_path = File.join(@dir, version_file)

  meta = FrontMatter.stringify_keys().merge(
    "version" => next_num,
    "status"  => ["status"] || [:status] || "draft",
    "based_on" => based_on
  )

  # If based_on is specified, copy body from previous version if no body given
  if based_on && body.empty?
    source = File.join(@dir, based_on)
    if File.exist?(source)
      parsed = FrontMatter.load_file(source, symbolize_keys: false)
      body = parsed[:body]
    end
  end

  content = FrontMatter.dump(meta, body)
  File.write(version_path, content)

  Element.load(version_path)
end

#current_versionObject



29
30
31
# File 'lib/writers_room/versioner.rb', line 29

def current_version
  latest_version
end

#latest_versionObject



25
26
27
# File 'lib/writers_room/versioner.rb', line 25

def latest_version
  versions.last
end

#version_at(number) ⇒ Object



59
60
61
62
63
# File 'lib/writers_room/versioner.rb', line 59

def version_at(number)
  path = File.join(@dir, "#{@slug}_v#{number}.md")
  return nil unless File.exist?(path)
  Element.load(path)
end

#version_countObject



21
22
23
# File 'lib/writers_room/versioner.rb', line 21

def version_count
  versions.length
end

#versionsObject



16
17
18
19
# File 'lib/writers_room/versioner.rb', line 16

def versions
  pattern = File.join(@dir, "#{@slug}_v*.md")
  Dir.glob(pattern).sort_by { |f| extract_version_number(f) }
end