Class: Mxrb::Model::DesignSystem

Inherits:
Object
  • Object
show all
Defined in:
lib/mxrb/model/design_system.rb

Overview

Read-only inventory and quality metrics for Mendix theme assets.

Constant Summary collapse

ASSET_DIRECTORIES =
%w[
  theme theme-cache themesource resources widgets javasource javascriptsource
  userlib vendorlib
].freeze
CSS_TOKEN =
/(?<name>--[A-Za-z0-9_-]+)\s*:\s*(?<value>[^;{}]+);/
SCSS_TOKEN =
/(?<name>\$[A-Za-z0-9_-]+)\s*:\s*(?<value>[^;{}]+);/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root) ⇒ DesignSystem

Returns a new instance of DesignSystem.



20
21
22
# File 'lib/mxrb/model/design_system.rb', line 20

def initialize(root)
  @root = File.expand_path(root)
end

Instance Attribute Details

#rootObject (readonly)

Returns the value of attribute root.



18
19
20
# File 'lib/mxrb/model/design_system.rb', line 18

def root
  @root
end

Instance Method Details

#catalogsObject



32
33
34
35
36
37
38
# File 'lib/mxrb/model/design_system.rb', line 32

def catalogs
  Dir.glob(File.join(@root, 'themesource', '**', 'design-properties.json')).sort.to_h do |path|
    [relative(path), JSON.parse(File.read(path))]
  rescue JSON::ParserError
    [relative(path), nil]
  end.freeze
end

#contrast_ratio(foreground, background) ⇒ Object



56
57
58
59
# File 'lib/mxrb/model/design_system.rb', line 56

def contrast_ratio(foreground, background)
  light, dark = [relative_luminance(foreground), relative_luminance(background)].sort.reverse
  ((light + 0.05) / (dark + 0.05)).round(2)
end

#literal_colorsObject



52
53
54
# File 'lib/mxrb/model/design_system.rb', line 52

def literal_colors
  tokens.select { _1.value.match?(/#[0-9a-f]{3,8}\b/i) }.freeze
end

#plan_literal_migration(replacements) ⇒ Object



61
62
63
# File 'lib/mxrb/model/design_system.rb', line 61

def plan_literal_migration(replacements)
  DesignMigrationPlan.build(@root, replacements)
end

#themesObject



28
29
30
# File 'lib/mxrb/model/design_system.rb', line 28

def themes
  tokens.map(&:theme).compact.uniq.sort.freeze
end

#tokensObject



24
25
26
# File 'lib/mxrb/model/design_system.rb', line 24

def tokens
  @tokens ||= stylesheet_paths.flat_map { scan_stylesheet(_1) }.freeze
end

#unresolved_referencesObject



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/mxrb/model/design_system.rb', line 40

def unresolved_references
  names = tokens.map(&:name).to_h { [_1, true] }
  tokens.flat_map do |token|
    token.value.scan(/var\((--[A-Za-z0-9_-]+)/).flatten.reject { names.key?(_1) }
         .map do
      {
        token:, reference: _1
      }.freeze
    end
  end.freeze
end