The list of platforms lived on `PlatformLink::SUPPORTED_PLATFORMS` — a model
about links to a platform's website — and was copied around it four times in
the admin (`%w[tic80 ebitengine love c64 godot bevy phaser]`), spelled out in
three apipie descriptions, and turned into a class name by string
interpolation in three services:
"WarpEngine::Platforms::#{platform.camelize}::Service".constantize
Seven places that had to agree, and nothing that made them.
`WarpEngine::Platform` is now that one place. `Platform.names` is the list,
`Platform.find!("godot")` answers with a value object that knows its `label`,
its `expected_kinds` and its updater `service`, and the constantize is gone —
the registry holds the reference. `PublishService` and `BuildsService` ask it,
the admin selects read `Platform.names`, and
`PlatformLink::SUPPORTED_PLATFORMS` stays as an alias of `Platform::NAMES` so
a host pinned to 0.7 keeps working.
`Software` also defends its own value sets now. It validated neither `status`
nor `platform`, so a mistyped platform only surfaced later, at publish time,
as "Unsupported platform" — after the row existed. And `status` had three
different answers depending on where you looked: the admin offered
development/demo/released/archived, the API documentation claimed
"active, inactive", and the database holds the first four. `Software::STATUSES`
is the list, the inclusion validations enforce both, and the documentation
names the values the database actually has.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
54 lines
802 B
Ruby
54 lines
802 B
Ruby
require "active_job/railtie"
|
|
|
|
require "blueprinter"
|
|
require "apipie-rails"
|
|
|
|
require "warp_engine/version"
|
|
require "warp_engine/configuration"
|
|
require "warp_engine/platform"
|
|
require "warp_engine/storage"
|
|
require "warp_engine/access"
|
|
require "warp_engine/images"
|
|
require "warp_engine/ci"
|
|
|
|
module WarpEngine
|
|
|
|
def self.table_name_prefix
|
|
""
|
|
end
|
|
|
|
def self.config
|
|
@config ||= Configuration.new
|
|
end
|
|
|
|
def self.configure
|
|
yield(config)
|
|
end
|
|
|
|
def self.instruments_publish?
|
|
true
|
|
end
|
|
|
|
def self.storage
|
|
Storage.adapter
|
|
end
|
|
|
|
def self.images
|
|
Images.adapter
|
|
end
|
|
|
|
def self.ci
|
|
CI.adapter
|
|
end
|
|
|
|
def self.access_policy
|
|
AccessPolicy.current
|
|
end
|
|
|
|
def self.identity_configured?
|
|
config.access_token_owner_class.present?
|
|
end
|
|
end
|
|
|
|
require "warp_engine/engine"
|