Class: Textus::Format::Yaml
Class Method Summary collapse
- .enforce_name_match!(path, meta) ⇒ Object
- .extensions ⇒ Object
- .inject_uid(meta, content, existing_uid) ⇒ Object
- .nested_glob ⇒ Object
- .parse(raw, path: nil) ⇒ Object
-
.rewrite_name(path, basename) ⇒ Object
rubocop:disable Naming/PredicateMethod.
- .serialize(meta:, body:, content: nil) ⇒ Object
- .serialize_for_put(meta:, body:, content:, path:) ⇒ Object
- .validate_against(schema, parsed) ⇒ Object
- .validate_path_extension(path, nested) ⇒ Object
Class Method Details
.enforce_name_match!(path, meta) ⇒ Object
71 72 73 74 75 76 77 78 79 |
# File 'lib/textus/format/yaml.rb', line 71 def self.enforce_name_match!(path, ) return unless .is_a?(Hash) && ["name"] ext = extensions.first basename = File.basename(path, ext) return if ["name"] == basename raise BadFrontmatter.new(path, "name '#{["name"]}' does not match basename '#{basename}'") end |
.extensions ⇒ Object
40 |
# File 'lib/textus/format/yaml.rb', line 40 def self.extensions = [".yaml", ".yml"] |
.inject_uid(meta, content, existing_uid) ⇒ Object
81 82 83 84 85 |
# File 'lib/textus/format/yaml.rb', line 81 def self.inject_uid(, content, existing_uid) m = .is_a?(Hash) ? .dup : {} m["uid"] = existing_uid || Textus::Uid.mint unless m["uid"].is_a?(String) && !m["uid"].empty? [m, content] end |
.nested_glob ⇒ Object
42 |
# File 'lib/textus/format/yaml.rb', line 42 def self.nested_glob = "**/*.{yaml,yml}" |
.parse(raw, path: nil) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/textus/format/yaml.rb', line 6 def self.parse(raw, path: nil) raw = raw.dup.force_encoding(Encoding::UTF_8) raise BadFrontmatter.new(path, "entry is not valid UTF-8") unless raw.valid_encoding? begin parsed = ::YAML.safe_load(raw, permitted_classes: [Date, Time], aliases: false) rescue Psych::SyntaxError, Psych::AliasesNotEnabled, Psych::DisallowedClass => e raise BadFrontmatter.new(path, "YAML parse failed: #{e.}") end raise BadFrontmatter.new(path, "YAML top-level must be a mapping") unless parsed.is_a?(Hash) = parsed["_meta"] fm = .is_a?(Hash) ? : {} = parsed.except("_meta") { "_meta" => fm, "body" => raw, "content" => } end |
.rewrite_name(path, basename) ⇒ Object
rubocop:disable Naming/PredicateMethod
60 61 62 63 64 65 66 67 68 69 |
# File 'lib/textus/format/yaml.rb', line 60 def self.rewrite_name(path, basename) # rubocop:disable Naming/PredicateMethod raw = File.binread(path) parsed = parse(raw, path: path) = parsed["_meta"] return false unless .is_a?(Hash) && ["name"].is_a?(String) && ["name"] != basename = .merge("name" => basename) File.binwrite(path, serialize(meta: , body: "", content: parsed["content"])) true end |
.serialize(meta:, body:, content: nil) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/textus/format/yaml.rb', line 23 def self.serialize(meta:, body:, content: nil) if content.is_a?(Hash) on_disk = && !.empty? ? { "_meta" => }.merge(content) : content ::YAML.dump(on_disk).sub(/\A---\n/, "") elsif body && !body.to_s.empty? b = body.to_s b += "\n" unless b.end_with?("\n") b else raise UsageError.new("yaml serialize requires :content or :body") end end |
.serialize_for_put(meta:, body:, content:, path:) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/textus/format/yaml.rb', line 44 def self.serialize_for_put(meta:, body:, content:, path:) raise UsageError.new("put for yaml requires content: or body:") if content.nil? && (body.nil? || body.to_s.empty?) if content.nil? begin parsed = parse(body.to_s, path: path) rescue BadFrontmatter => e raise BadContent.new(path, "bad_content: #{e.}") end [body.to_s, parsed["_meta"], body.to_s, parsed["content"]] else bytes = serialize(meta: , body: "", content: content) [bytes, , bytes, content] end end |
.validate_against(schema, parsed) ⇒ Object
36 37 38 |
# File 'lib/textus/format/yaml.rb', line 36 def self.validate_against(schema, parsed) schema.validate!(parsed["content"] || {}) end |
.validate_path_extension(path, nested) ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/textus/format/yaml.rb', line 87 def self.validate_path_extension(path, nested) ext = File.extname(path) if nested return if ext == "" raise UsageError.new("nested yaml path must not have an extension") end return if [".yaml", ".yml"].include?(ext) raise UsageError.new("yaml format requires '.yaml' or '.yml' path (got #{ext.inspect})") end |