Class: TRMNLP::FrameworkVersion

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/trmnlp/framework_version.rb

Overview

Represents a TRMNL design-system framework version, so plugins can pin (or float to "latest") the CSS/JS bundle they render against, both in production and locally.

Constant Summary collapse

DEFAULT_ASSET_HOST =
'https://trmnl.com'
DATA_PATH =
File.expand_path('../../db/data/framework_versions.yml', __dir__)
MANIFEST_URL =

DATA_PATH holds a copy of this file, refreshed by rake framework:sync.

'https://raw.githubusercontent.com/usetrmnl/trmnl-framework/main/db/data/framework_versions.yml'
MANIFEST_TIMEOUT =
2

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(number, asset_host: DEFAULT_ASSET_HOST) ⇒ FrameworkVersion

Returns a new instance of FrameworkVersion.



54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/trmnlp/framework_version.rb', line 54

def initialize(number, asset_host: DEFAULT_ASSET_HOST)
  @asset_host = asset_host

  if number.nil? || number == 'latest'
    @number = self.class.config.fetch('latest')
    @pinned = false
  elsif self.class.version_numbers.include?(number)
    @number = number
    @pinned = true
  else
    raise ArgumentError, "unknown framework version: #{number}"
  end
end

Instance Attribute Details

#numberObject (readonly)

Returns the value of attribute number.



20
21
22
# File 'lib/trmnlp/framework_version.rb', line 20

def number
  @number
end

Class Method Details

.configObject



22
# File 'lib/trmnlp/framework_version.rb', line 22

def self.config = @config ||= (remote_config || YAML.load_file(DATA_PATH)).freeze

.latestObject



44
# File 'lib/trmnlp/framework_version.rb', line 44

def self.latest = new(config.fetch('latest'))

.optionsObject

Suitable for showing in a select form field. Pinnable versions are ordered newest-first by semantic version — never by manifest order.



48
49
50
51
52
# File 'lib/trmnlp/framework_version.rb', line 48

def self.options
  newest_first = version_numbers.sort_by { |number| Gem::Version.new(number) }.reverse
  [{ "Always track latest (currently v#{latest.number})" => 'latest' }] +
    newest_first.map { |number| { "v#{number}" => number } }
end

.version_numbersObject



42
# File 'lib/trmnlp/framework_version.rb', line 42

def self.version_numbers = config.fetch('versions').map { |v| v['number'] }.freeze

Instance Method Details

#<=>(other) ⇒ Object



80
81
82
83
84
# File 'lib/trmnlp/framework_version.rb', line 80

def <=>(other)
  return nil unless other.is_a?(self.class)

  Gem::Version.new(number) <=> Gem::Version.new(other.number)
end

#==(other) ⇒ Object



78
# File 'lib/trmnlp/framework_version.rb', line 78

def ==(other) = other.is_a?(self.class) && number == other.number

#as_jsonObject



86
# File 'lib/trmnlp/framework_version.rb', line 86

def as_json(*) = number

#css_urlObject

Both a pinned and an unpinned ("latest") version resolve to a concrete release here — #number is never the literal "latest" — so a local preview renders the same bundle as the hosted service instead of drifting onto a new release the moment one ships.



74
# File 'lib/trmnlp/framework_version.rb', line 74

def css_url = "#{@asset_host}/css/#{number}/plugins.css"

#js_urlObject



76
# File 'lib/trmnlp/framework_version.rb', line 76

def js_url = "#{@asset_host}/js/#{number}/plugins.js"

#pinned?Boolean

Returns:

  • (Boolean)


68
# File 'lib/trmnlp/framework_version.rb', line 68

def pinned? = @pinned

#to_sObject



88
# File 'lib/trmnlp/framework_version.rb', line 88

def to_s = number