Class: Frameit::ConfigParser

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



3
4
5
# File 'lib/frameit/config_parser.rb', line 3

def data
  @data
end

Instance Method Details

#change_paths_to_absolutes!(values) ⇒ Object

Use absolute paths instead of relative



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

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



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

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



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

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



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

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



62
63
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
96
# File 'lib/frameit/config_parser.rb', line 62

def validate_values(values)
  values.each do |key, value|
    if value.kind_of?(Hash)
      validate_values(value) # recursive call
    else
      if key == 'font'
        UI.user_error!("Could not find font at path '#{File.expand_path(value)}'") unless File.exist?(value)
      end

      if key == '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
      end

      if key == 'background'
        UI.user_error!("Could not find background image at path '#{File.expand_path(value)}'") unless File.exist? value
      end

      if key == 'color'
        UI.user_error!("Invalid color '#{value}'. Must be valid Hex #123123") unless value.include?("#")
      end

      if key == 'padding'
        unless value.kind_of?(Integer) || value.split('x').length == 2
          UI.user_error!("padding must be type integer or pair of integers of format 'AxB'")
        end
      end
    end
  end
end