Class: Frameit::ConfigParser

Inherits:
Object
  • Object
show all
Defined in:
frameit/lib/frameit/config_parser.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



5
6
7
# File 'frameit/lib/frameit/config_parser.rb', line 5

def data
  @data
end

Instance Method Details

#change_paths_to_absolutes!(values) ⇒ Object

Use absolute paths instead of relative



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'frameit/lib/frameit/config_parser.rb', line 42

def change_paths_to_absolutes!(values)
  values.each do |key, value|
    if value.kind_of?(Hash)
      change_paths_to_absolutes!(value) # recursive call
    elsif value.kind_of?(Array)
      value.each do |current|
        change_paths_to_absolutes!(current) if current.kind_of?(Hash) # recursive call
      end
    else
      if ['font', 'background'].include?(key)
        # Change the paths to relative ones
        # `replace`: to change the content of the string, so it's actually stored
        if @path # where is the config file. We don't have a config file in tests
          containing_folder = File.expand_path('..', @path)
          value.replace(File.join(containing_folder, value))
        end
      end
    end
  end
end

#fetch_value(path) ⇒ Object

Fetches the finished configuration for a given path. This will try to look for a specific value and fallback to a default value if nothing was found



28
29
30
31
32
33
34
35
36
37
38
39
# File 'frameit/lib/frameit/config_parser.rb', line 28

def fetch_value(path)
  specific = @data['data'].find { |a| path.include?(a['filter']) }

  default = @data['default']

  values = default.fastlane_deep_merge(specific || {})

  change_paths_to_absolutes!(values)
  validate_values(values)

  values
end

#load(path) ⇒ Object



7
8
9
10
11
12
# File 'frameit/lib/frameit/config_parser.rb', line 7

def load(path)
  return nil unless File.exist?(path) # we are okay with no config at all
  UI.verbose("Parsing config file '#{path}'")
  @path = path
  self.parse(File.read(path))
end

#parse(data) ⇒ Object

Parameters:

  • data (String)

    the JSON data to be parsed



15
16
17
18
19
20
21
22
23
24
# File 'frameit/lib/frameit/config_parser.rb', line 15

def parse(data)
  begin
    @data = JSON.parse(data)
  rescue => ex
    UI.error(ex.message)
    UI.user_error!("Invalid JSON file at path '#{@path}'. Make sure it's a valid JSON file")
  end

  self
end

#validate_values(values) ⇒ Object

Make sure the paths/colors are valid



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'frameit/lib/frameit/config_parser.rb', line 64

def validate_values(values)
  values.each do |key, value|
    if value.kind_of?(Hash)
      validate_values(value) # recursive call
    else
      case key
      when 'font'
        UI.user_error!("Could not find font at path '#{File.expand_path(value)}'") unless File.exist?(value)
      when 'fonts'
        UI.user_error!("`fonts` must be an array") unless value.kind_of?(Array)

        value.each do |current|
          UI.user_error!("You must specify a font path") if current.fetch('font', '').length == 0
          UI.user_error!("Could not find font at path '#{File.expand_path(current.fetch('font'))}'") unless File.exist?(current.fetch('font'))
          UI.user_error!("`supported` must be an array") unless current.fetch('supported', []).kind_of?(Array)
        end
      when 'background'
        UI.user_error!("Could not find background image at path '#{File.expand_path(value)}'") unless File.exist?(value)
      when 'color'
        UI.user_error!("Invalid color '#{value}'. Must be valid Hex #123123") unless value.include?("#")
      when 'padding'
        unless value.kind_of?(Integer) || value.split('x').length == 2 || (value.end_with?('%') && value.to_f > 0)
          UI.user_error!("padding must be type integer or pair of integers of format 'AxB' or a percentage of screen size")
        end
      when 'show_complete_frame', 'title_below_image'
        UI.user_error!("'#{key}' must be a Boolean") unless [true, false].include?(value)
      when 'font_scale_factor'
        UI.user_error!("font_scale_factor must be numeric") unless value.kind_of?(Numeric)
      end
    end
  end
end