Class: WritersRoom::Versioner
- Inherits:
-
Object
- Object
- WritersRoom::Versioner
- 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
-
#dir ⇒ Object
readonly
Returns the value of attribute dir.
-
#slug ⇒ Object
readonly
Returns the value of attribute slug.
Instance Method Summary collapse
- #create_new_version(body: "", metadata: {}, based_on: nil) ⇒ Object
- #current_version ⇒ Object
-
#initialize(dir, slug) ⇒ Versioner
constructor
A new instance of Versioner.
- #latest_version ⇒ Object
- #version_at(number) ⇒ Object
- #version_count ⇒ Object
- #versions ⇒ Object
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
#dir ⇒ Object (readonly)
Returns the value of attribute dir.
9 10 11 |
# File 'lib/writers_room/versioner.rb', line 9 def dir @dir end |
#slug ⇒ Object (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) = 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(, body) File.write(version_path, content) Element.load(version_path) end |
#current_version ⇒ Object
29 30 31 |
# File 'lib/writers_room/versioner.rb', line 29 def current_version latest_version end |
#latest_version ⇒ Object
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_count ⇒ Object
21 22 23 |
# File 'lib/writers_room/versioner.rb', line 21 def version_count versions.length end |
#versions ⇒ Object
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 |