46 lines
1.4 KiB
Ruby
46 lines
1.4 KiB
Ruby
require "yaml"
|
|
|
|
module Backlog
|
|
# The parsed contents of a repo's `.cc-os/config` (YAML). Only the
|
|
# `board` key matters to the resolver: an explicit board-name override.
|
|
# Never touches the filesystem itself — callers read the file and pass
|
|
# its contents (or nil, if absent) in.
|
|
class Config
|
|
def initialize(contents)
|
|
@data = contents.to_s.strip.empty? ? {} : (YAML.safe_load(contents) || {})
|
|
rescue Psych::SyntaxError
|
|
@data = {}
|
|
end
|
|
|
|
# @return [String, nil] the explicit board name override, if configured
|
|
def board
|
|
@data["board"]
|
|
end
|
|
|
|
# @return [String, nil] the tracker key (e.g. "forgejo:owner/repo"), if configured
|
|
def tracker
|
|
@data["tracker"]
|
|
end
|
|
|
|
def configured? = !board.nil?
|
|
def tracker_configured? = !tracker.nil?
|
|
|
|
# @return [Hash] a copy of the parsed config data
|
|
def to_h = @data.dup
|
|
|
|
# Return new YAML contents with `key` set to `value`, preserving every
|
|
# other key already present in `contents`. Pure — does not touch the
|
|
# filesystem; callers read/write the file themselves.
|
|
#
|
|
# @param contents [String, nil] existing raw `.cc-os/config` contents
|
|
# @param key [String, Symbol] key to set
|
|
# @param value [Object] value to set it to
|
|
# @return [String] the updated YAML contents
|
|
def self.merge(contents, key, value)
|
|
data = new(contents).to_h
|
|
data[key.to_s] = value
|
|
YAML.dump(data)
|
|
end
|
|
end
|
|
end
|