Class: Plum::ConfigSync

Inherits:
Object
  • Object
show all
Defined in:
app/services/plum/config_sync.rb

Overview

Config-as-code (phase 1): the content model lives as YAML files in the host repo and syncs into the database, like db:migrate for content types.

plum/content_types/posts.yml  ->  Plum::ContentType (blueprint)
plum/fieldsets/seo.yml        ->  Plum::Fieldset

Files are the source of truth; apply upserts the DB from them, export writes the DB back out (bootstrap + CP write-back later), and check reports drift for CI. Content (entries, terms, assets) is never touched.

Defined Under Namespace

Classes: DriftError, Result, UnsafePruneError

Constant Summary collapse

CONTENT_TYPE_DIR =
"content_types".freeze
FIELDSET_DIR =
"fieldsets".freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(site:, dir:) ⇒ ConfigSync

Returns a new instance of ConfigSync.



38
39
40
41
# File 'app/services/plum/config_sync.rb', line 38

def initialize(site:, dir:)
  @site = site
  @dir = Pathname(dir)
end

Class Method Details

.apply(site:, dir:, prune: false, force: false) ⇒ Object



30
31
32
# File 'app/services/plum/config_sync.rb', line 30

def self.apply(site:, dir:, prune: false, force: false)
  new(site: site, dir: dir).apply(prune: prune, force: force)
end

.check(site:, dir:) ⇒ Object



34
35
36
# File 'app/services/plum/config_sync.rb', line 34

def self.check(site:, dir:)
  new(site: site, dir: dir).check
end

.export(site:, dir:) ⇒ Object



26
27
28
# File 'app/services/plum/config_sync.rb', line 26

def self.export(site:, dir:)
  new(site: site, dir: dir).export
end

Instance Method Details

#apply(prune: false, force: false) ⇒ Object

Files -> DB. Upserts by handle inside a transaction. Deleting requires prune: true, and deleting a content type that still has entries additionally requires force: true.



55
56
57
58
59
60
61
62
63
64
65
# File 'app/services/plum/config_sync.rb', line 55

def apply(prune: false, force: false)
  result = Result.new(created: [], updated: [], unchanged: [], deleted: [])

  site.transaction do
    apply_content_types(result)
    apply_fieldsets(result)
    prune_missing(result, force: force) if prune
  end

  result
end

#checkObject

Returns human-readable drift lines; empty means files and DB agree.



68
69
70
71
72
73
# File 'app/services/plum/config_sync.rb', line 68

def check
  drift = []
  drift += check_kind(CONTENT_TYPE_DIR, content_types)
  drift += check_kind(FIELDSET_DIR, fieldsets)
  drift
end

#exportObject

DB -> files. Mirrors the database exactly: stale files for handles that no longer exist are removed.



45
46
47
48
49
50
# File 'app/services/plum/config_sync.rb', line 45

def export
  written = []
  written += export_kind(CONTENT_TYPE_DIR, content_types.order(:handle)) { |record| content_type_config(record) }
  written += export_kind(FIELDSET_DIR, fieldsets.order(:handle)) { |record| fieldset_config(record) }
  written
end