Module: Heroku::API::Mock

Defined in:
lib/heroku/api/mock.rb,
lib/heroku/api/mock/apps.rb,
lib/heroku/api/mock/keys.rb,
lib/heroku/api/mock/logs.rb,
lib/heroku/api/mock/user.rb,
lib/heroku/api/mock/addons.rb,
lib/heroku/api/mock/stacks.rb,
lib/heroku/api/mock/domains.rb,
lib/heroku/api/mock/releases.rb,
lib/heroku/api/mock/processes.rb,
lib/heroku/api/mock/config_vars.rb,
lib/heroku/api/mock/collaborators.rb

Constant Summary collapse

APP_NOT_FOUND =
{ :body => 'App not found.',   :status => 404 }
USER_NOT_FOUND =
{ :body => 'User not found.',  :status => 404 }
STACKS =
[
  {
    "beta"      => false,
    "requested" => false,
    "current"   => false,
    "name"      => "aspen-mri-1.8.6"
  },
  {
    "beta"      => false,
    "requested" => false,
    "current"   => false,
    "name"      => "bamboo-mri-1.9.2"
  },
  {
    "beta"      => false,
    "requested" => false,
    "current"   => false,
    "name"      => "bamboo-ree-1.8.7"
  },
  {
    "beta"      => true,
    "requested" => false,
    "current"   => false,
    "name"      => "cedar"
  }
]

Class Method Summary collapse

Class Method Details

.add_mock_app_addon(mock_data, app, addon) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/heroku/api/mock.rb', line 35

def self.add_mock_app_addon(mock_data, app, addon)
  addon_data = get_mock_addon(mock_data, addon)
  mock_data[:addons][app] << addon_data.reject {|key, value| !['beta', 'configured', 'description', 'name', 'state', 'url'].include?(key)}
  version = mock_data[:releases][app].map {|release| release['name'][1..-1].to_i}.max || 0
  env = if get_mock_app(mock_data, app)['stack'] == 'cedar'
    {
      'BUNDLE_WITHOUT'      => 'development:test',
      'DATABASE_URL'        => 'postgres://username:[email protected]/username',
      'LANG'                => 'en_US.UTF-8',
      'RACK_ENV'            => 'production',
      'SHARED_DATABASE_URL' => 'postgres://username:[email protected]/username'
    }
  else
    {}
  end
  mock_data[:releases][app] << {
    'addons'      => mock_data[:addons][app].map {|addon| addon['name']},
    'commit'      => nil,
    'created_at'  => timestamp,
    'descr'       => "Add-on add #{addon_data['name']}",
    'env'         => env,
    'name'        => "v#{version + 1}",
    'pstable'     => { 'web' => '' },
    'user'        => '[email protected]'
  }
end

.get_mock_addon(mock_data, addon) ⇒ Object



62
63
64
65
66
67
68
# File 'lib/heroku/api/mock.rb', line 62

def self.get_mock_addon(mock_data, addon)
  @addons ||= begin
    data = File.read("#{File.dirname(__FILE__)}/mock/cache/get_addons.json")
    Heroku::API::OkJson.decode(data)
  end
  @addons.detect {|addon_data| addon_data['name'] == addon}
end

.get_mock_addon_price(mock_data, addon) ⇒ Object



70
71
72
73
74
75
76
77
78
# File 'lib/heroku/api/mock.rb', line 70

def self.get_mock_addon_price(mock_data, addon)
  addon_data = get_mock_addon(mock_data, addon)
  price_cents = addon_data['price_cents'] || 0
  price = format("$%d/mo", price_cents / 100)
  if price == '$0/mo'
    price = 'free'
  end
  price
end

.get_mock_app(mock_data, app) ⇒ Object



80
81
82
# File 'lib/heroku/api/mock.rb', line 80

def self.get_mock_app(mock_data, app)
  mock_data[:apps].detect {|app_data| app_data['name'] == app}
end

.get_mock_app_addon(mock_data, app, addon) ⇒ Object



84
85
86
# File 'lib/heroku/api/mock.rb', line 84

def self.get_mock_app_addon(mock_data, app, addon)
  mock_data[:addons][app].detect {|addon_data| addon_data['name'] == addon}
end

.get_mock_app_domain(mock_data, app, domain) ⇒ Object



88
89
90
# File 'lib/heroku/api/mock.rb', line 88

def self.get_mock_app_domain(mock_data, app, domain)
  mock_data[:domains][app].detect {|domain_data| domain_data['domain'] == domain}
end

.get_mock_collaborator(mock_data, app, email) ⇒ Object



92
93
94
# File 'lib/heroku/api/mock.rb', line 92

def self.get_mock_collaborator(mock_data, app, email)
  mock_data[:collaborators][app].detect {|collaborator_data| collaborator_data['email'] == email}
end

.get_mock_key(mock_data, key) ⇒ Object



96
97
98
# File 'lib/heroku/api/mock.rb', line 96

def self.get_mock_key(mock_data, key)
  mock_data[:keys].detect {|key_data| %r{ #{Regexp.escape(key)}$}.match(key_data['contents'])}
end

.get_mock_processes(mock_data, app) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/heroku/api/mock.rb', line 100

def self.get_mock_processes(mock_data, app)
  mock_data[:ps][app].map do |ps|

    # swap day/month positions for Time.parse
    time_parts = ps['transitioned_at'].split(' ')
    date_parts = time_parts.first.split('/')
    date_parts[1], date_parts[2] = date_parts[2], date_parts[1]
    time_parts[0] = date_parts.join('/')
    munged_time = time_parts.join(' ')
    elapsed = Time.now.to_i - Time.parse(munged_time).to_i
    ps['elapsed'] = elapsed

    pretty_elapsed = if elapsed < 60
      "#{elapsed}s"
    elsif elapsed < (60 * 60)
      "#{elapsed / 60}m"
    else
      "#{elapsed / 60 / 60}h"
    end
    ps['pretty_state'] = "#{ps['state']} for #{pretty_elapsed}"

    ps
  end
end

.gzip(string) ⇒ Object



125
126
127
128
129
130
131
# File 'lib/heroku/api/mock.rb', line 125

def self.gzip(string)
  io = StringIO.new
  gzip = Zlib::GzipWriter.new(io)
  gzip.write(string)
  gzip.close
  io.string
end

.json_gzip(string) ⇒ Object



133
134
135
# File 'lib/heroku/api/mock.rb', line 133

def self.json_gzip(string)
  gzip(Heroku::API::OkJson.encode(string))
end

.parse_stub_params(params) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
# File 'lib/heroku/api/mock.rb', line 137

def self.parse_stub_params(params)
  api_key = Base64.decode64(params[:headers]['Authorization']).split(':').last

  parsed = params.dup
  begin # try to JSON decode
    parsed[:body] &&= Heroku::API::OkJson.decode(parsed[:body])
  rescue # else leave as is
  end

  [parsed, @mock_data[api_key]]
end

.remove_mock_app_addon(mock_data, app, addon) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/heroku/api/mock.rb', line 149

def self.remove_mock_app_addon(mock_data, app, addon)
  addon_data = mock_data[:addons][app].detect {|addon_data| addon_data['name'] == addon}
  mock_data[:addons][app].delete(addon_data)
  version = mock_data[:releases][app].map {|release| release['name'][1..-1].to_i}.max || 0
  env = if get_mock_app(mock_data, app)['stack'] == 'cedar'
    {
      'BUNDLE_WITHOUT'      => 'development:test',
      'DATABASE_URL'        => 'postgres://username:[email protected]/username',
      'LANG'                => 'en_US.UTF-8',
      'RACK_ENV'            => 'production',
      'SHARED_DATABASE_URL' => 'postgres://username:[email protected]/username'
    }
  else
    {}
  end
  mock_data[:releases][app] << {
    'addons'      => mock_data[:addons][app].map {|addon| addon['name']},
    'commit'      => nil,
    'created_at'  => timestamp,
    'descr'       => "Add-on remove #{addon_data['name']}",
    'env'         => env,
    'name'        => "v#{version + 1}",
    'pstable'     => { 'web' => '' },
    'user'        => '[email protected]'
  }
end

.timestampObject



184
185
186
# File 'lib/heroku/api/mock.rb', line 184

def self.timestamp
  Time.now.strftime("%G/%d/%m %H:%M:%S %z")
end

.with_mock_app(mock_data, app, &block) ⇒ Object



176
177
178
179
180
181
182
# File 'lib/heroku/api/mock.rb', line 176

def self.with_mock_app(mock_data, app, &block)
  if app_data = get_mock_app(mock_data, app)
    yield(app_data)
  else
    APP_NOT_FOUND
  end
end