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__)

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.



31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/trmnlp/framework_version.rb', line 31

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.



15
16
17
# File 'lib/trmnlp/framework_version.rb', line 15

def number
  @number
end

Class Method Details

.configObject



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

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

.latestObject



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

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.



25
26
27
28
29
# File 'lib/trmnlp/framework_version.rb', line 25

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



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

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

Instance Method Details

#<=>(other) ⇒ Object



57
58
59
60
61
# File 'lib/trmnlp/framework_version.rb', line 57

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

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

#==(other) ⇒ Object



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

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

#as_jsonObject



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

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.



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

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

#js_urlObject



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

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

#pinned?Boolean

Returns:

  • (Boolean)


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

def pinned? = @pinned

#to_sObject



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

def to_s = number