Class: HerokuAppInfo::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/heroku_app_info/parser.rb

Instance Method Summary collapse

Instance Method Details

#app_multi_itemsHash

Returns:

  • (Hash)


100
101
102
103
104
105
106
# File 'lib/heroku_app_info/parser.rb', line 100

def app_multi_items
  {
    "Addons" => Array,
    "Collaborators" => Array,
    "Dynos" => Hash
  }
end

#apps(apps) ⇒ Array

simple app list

Parameters:

  • apps (String)

Returns:

  • (Array)


11
12
13
14
15
16
# File 'lib/heroku_app_info/parser.rb', line 11

def apps(apps)
  apps.lines(chomp: true).grep_v(/\A===/).map { |e|
    /\A([^ ]+)/ =~ e
    $1
  }.compact
end

#parse(text) ⇒ Hash

Parameters:

  • text (String)

Returns:

  • (Hash)


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/heroku_app_info/parser.rb', line 22

def parse(text)
  info = {}

  last_item = nil
  title = nil
  text.lines(chomp: true).each { |line|
    next if line.size < 1

    data = parse_line(line.rstrip)

    case data[:item]
    when :continuation
      info[last_item] << data[:content]
    when :title
      title = data[:content]
    else
      multi_item = app_multi_items.select { |item, type| item == data[:item] }
      if multi_item.size > 0
        case multi_item.values.first.to_s
        when "Array"
          info[data[:item]] = [data[:content]]
        when "Hash"
          info[data[:item]] = parse_hash_item(data[:content])
        end
      else
        info[data[:item]] = data[:content]
      end
    end
    last_item = data[:item] unless data[:item] == :continuation
  }

  info
end

#parse_hash_item(item) ⇒ Hash

Parameters:

  • item (String, nil)

Returns:

  • (Hash)


88
89
90
91
92
93
94
95
# File 'lib/heroku_app_info/parser.rb', line 88

def parse_hash_item(item)
  if item.nil?
    {}
  else

    YAML.safe_load(item.split(",").map(&:strip).join("\n"))
  end
end

#parse_line(line) ⇒ Hash

Parameters:

  • line (String)

Returns:

  • (Hash)


60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/heroku_app_info/parser.rb', line 60

def parse_line(line)
  case line
  # title line
  when /\A=== (.+)\z/
    {
      item: :title,
      content: $1
    }
  # data line
  when /\A(?:([A-Z][^:]+):)?(?: +(.+))?\z/
    if !$1 && $2 # continuation
      {
        item: :continuation,
        content: $2
      }
    else # normal
      {
        item: $1,
        content: $2
      }
    end
  end
end