Module: Textus::Infra::Publisher
- Defined in:
- lib/textus/infra/publisher.rb
Overview
Publishes built artifacts from the store to repo-relative consumer paths. Publish = copy + sentinel. The in-store file is already the consumer-shaped artifact; no parsing or stripping.
Sentinel I/O is delegated to Store::Sentinel. Sentinels live under ‘<store_root>/sentinels/` and mirror the target’s repo-relative layout so consumer directories aren’t polluted with ‘.textus-managed.json` siblings.
Class Method Summary collapse
- .managed?(target, store_root) ⇒ Boolean
- .publish(source:, target:, store_root:) ⇒ Object
- .refuse_if_unmanaged(target, store_root) ⇒ Object
Class Method Details
.managed?(target, store_root) ⇒ Boolean
28 29 30 |
# File 'lib/textus/infra/publisher.rb', line 28 def self.managed?(target, store_root) File.exist?(Store::Sentinel.sentinel_path(target, store_root)) end |
.publish(source:, target:, store_root:) ⇒ Object
13 14 15 16 17 18 19 |
# File 'lib/textus/infra/publisher.rb', line 13 def self.publish(source:, target:, store_root:) FileUtils.mkdir_p(File.dirname(target)) refuse_if_unmanaged(target, store_root) File.delete(target) if File.symlink?(target) FileUtils.cp(source, target) Store::Sentinel.write!(target: target, source: source, store_root: store_root) end |
.refuse_if_unmanaged(target, store_root) ⇒ Object
21 22 23 24 25 26 |
# File 'lib/textus/infra/publisher.rb', line 21 def self.refuse_if_unmanaged(target, store_root) return unless File.exist?(target) || File.symlink?(target) return if managed?(target, store_root) raise PublishError.new("refusing to clobber unmanaged file at #{target}", target: target) end |