hilarity-api 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f1ae3a442253b1117e494d6fafaa509acef62f85
4
+ data.tar.gz: a3745ec63482719134e8f9219dadfc8021287497
5
+ SHA512:
6
+ metadata.gz: 67231c27b9211f98eac20622610f66f205b3544ef422fc167f28961a6d309e97ac4035ae5140e6bb18f843d1a3c06af9c1e325f72a1dcbab0c44df4420d69298
7
+ data.tar.gz: 1c4bdcf7b8043a7ce26656230a0c446e2ba25cc1422f3081ab6c019380a177a08dad84b06402b64197e425e7966f34f7781ed7746d2ada3ec9fdbc003ac4b245
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rvmrc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in hilarity-rb.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,127 @@
1
+ Hilarity Ruby Client
2
+ ==================
3
+
4
+ The Hilarity Ruby Client is used to interact with the [Hilarity API](https://hilarity.io/docs/) from Ruby.
5
+
6
+
7
+ Usage
8
+ -----
9
+
10
+ Start by creating a connection to Hilarity with your credentials:
11
+
12
+ require 'hilarity-api'
13
+
14
+ hilarity = Hilarity::API.new(:api_key => API_KEY) # use API Key
15
+ hilarity = Hilarity::API.new(:username => USERNAME, :password => PASSWORD) # use username and password
16
+ hilarity = Hilarity::API.new(:headers => {'User-Agent' => 'custom'}) # use custom header
17
+
18
+ NOTE: You can leave out the `:api_key` if `ENV['HILARITY_API_KEY']` is set instead.
19
+
20
+ Now you can make requests to the api.
21
+
22
+ Requests
23
+ --------
24
+
25
+ What follows is an overview of commands you can run for the client.
26
+
27
+ For additional details about any of the commands, see the [API docs](http://legacy-api-docs.hilarity.io).
28
+
29
+ ### Add-ons
30
+
31
+ hilarity.delete_addon(APP, ADD_ON) # remove the ADD_ON add-on from the app named APP
32
+ hilarity.post_addon(APP, ADD_ON) # add ADD_ON add-on to an the app named APP
33
+ hilarity.put_addon(APP, ADD_ON) # update the ADD_ON add-on on the app named APP
34
+ hilarity.get_addons # see a listing of all available add-ons
35
+ hilarity.get_addons(APP) # see listing of installed add-ons for the app named APP
36
+
37
+ ### Apps
38
+
39
+ hilarity.delete_app(APP) # delete the app named APP
40
+ hilarity.get_apps # get a list of your apps
41
+ hilarity.get_app(APP) # get info about the app named APP
42
+ hilarity.get_dyno_types(APP) # get dyno types for the app named APP
43
+ hilarity.post_app # create an app with a generated name and the default stack
44
+ hilarity.post_app_maintenance(APP, '1') # toggle maintenance mode for the app named APP
45
+ hilarity.post_app('name' => 'app') # create an app with a specified name, APP
46
+ hilarity.put_app('name' => 'myapp') # update an app to have a different name
47
+
48
+ ### Collaborators
49
+
50
+ hilarity.delete_collaborator(APP, 'email@example.com') # remove 'email@example.com' collaborator from APP app
51
+ hilarity.get_collaborators(APP) # list collaborators for APP app
52
+ hilarity.post_collaborator(APP, 'email@example.com') # add 'email@example.com' collaborator to APP app
53
+
54
+ ### Config Variables
55
+
56
+ hilarity.delete_config_var(APP, KEY) # remove KEY key from APP app
57
+ hilarity.get_config_vars(APP) # get list of config vars for APP app
58
+ hilarity.put_config_vars(APP, KEY => 'value') # set KEY key to 'value' for APP app
59
+
60
+ ### Domains
61
+
62
+ hilarity.delete_domain(APP, 'example.com') # remove the 'example.com' domain from the APP app
63
+ hilarity.get_domains(APP) # list configured domains for the APP app
64
+ hilarity.post_domain(APP, 'example.com') # add 'example.com' domain to the APP app
65
+
66
+ ### Keys
67
+
68
+ hilarity.delete_key('user@hostname.local') # remove the 'user@hostname.local' key
69
+ hilarity.delete_keys # remove all keys
70
+ hilarity.get_keys # list configured keys
71
+ hilarity.post_key('key data') # add key defined by 'key data'
72
+
73
+ ### Logs
74
+
75
+ hilarity.get_logs(APP) # return logs information for APP app
76
+
77
+ ### Processes
78
+
79
+ hilarity.get_ps(APP) # list current dynos for APP app
80
+ hilarity.post_ps(APP, 'command') # run 'command' command in context of APP app
81
+ hilarity.post_ps_restart(APP) # restart all dynos for APP app
82
+ hilarity.post_ps_scale(APP, TYPE, QTY) # scale TYPE type dynos to QTY for APP app
83
+ hilarity.post_ps_stop(APP, 'ps' => 'web.1') # stop 'web.1' dyno for APP app
84
+ hilarity.post_ps_stop(APP, 'type' => 'web') # stop all 'web' dynos for APP app
85
+ hilarity.post_ps_restart(APP, 'ps' => 'web.1') # restart 'web.1' dyno for APP app
86
+ hilarity.put_dynos(APP, DYNOS) # set number of dynos for bamboo app APP to DYNOS
87
+ hilarity.put_workers(APP, WORKERS) # set number of workers for bamboo app APP to WORKERS
88
+ hilarity.post_ps_scale(APP, 'worker', WORKERS) # set number of workers for cedar app APP to WORKERS
89
+ hilarity.put_formation(APP, 'web' => '2X') # set dyno size to '2X' for all 'web' dynos for APP app
90
+
91
+ ### Releases
92
+
93
+ hilarity.get_releases(APP) # list of releases for the APP app
94
+ hilarity.get_release(APP, 'v#') # get details of 'v#' release for APP app
95
+ hilarity.post_release(APP, 'v#') # rollback APP app to 'v#' release
96
+
97
+ ### Stacks
98
+
99
+ hilarity.get_stack(APP) # list available stacks
100
+ hilarity.put_stack(APP, STACK) # migrate APP app to STACK stack
101
+
102
+ ### User
103
+
104
+ hilarity.get_user # list user info
105
+
106
+ Mock
107
+ ----
108
+
109
+ For testing (or practice) you can also use a simulated Hilarity account:
110
+
111
+ require 'hilarity-api'
112
+
113
+ hilarity = Hilarity::API.new(:api_key => API_KEY, :mock => true)
114
+
115
+ Commands will now behave as normal, however, instead of interacting with your actual Hilarity account you'll be interacting with a **blank** test account. Note: test accounts will have NO apps to begin with. You'll need to create one:
116
+
117
+ hilarity.post_app(:name => 'my-test-app')
118
+
119
+ Tests
120
+ -----
121
+
122
+ To run tests, first set `ENV['HEROKU_API_KEY']` to your api key. Then use `bundle exec rake` to run mock tests or `MOCK=false bundle exec rake` to run integration tests.
123
+
124
+ Meta
125
+ ----
126
+
127
+ Released under the [MIT license](http://www.opensource.org/licenses/mit-license.php).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ task :cache, [:api_key] do |task, args|
4
+ unless args.api_key
5
+ puts('cache requires an api key, please call as `cache[api_key]`')
6
+ else
7
+ require "#{File.dirname(__FILE__)}/lib/hilarity/api"
8
+ hilarity = Hilarity::API.new(:api_key => args.api_key)
9
+ end
10
+ end
data/changelog.txt ADDED
@@ -0,0 +1,3 @@
1
+ 0.0.1 08/26/2014
2
+ =================
3
+ Forked from hilarity.rb
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "hilarity/api/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "hilarity-api"
7
+ s.version = Hilarity::API::VERSION
8
+ s.authors = ["Zane Shannon"]
9
+ s.email = ["zcs@hilarity.io"]
10
+ s.homepage = "http://github.com/hilarity/hilarity.rb"
11
+ s.license = 'MIT'
12
+ s.summary = %q{Ruby Client for the Hilarity API}
13
+ s.description = %q{Ruby Client for the Hilarity API}
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_runtime_dependency 'excon', '~>0.38'
21
+ s.add_runtime_dependency 'multi_json', '~>1.8'
22
+
23
+ s.add_development_dependency 'minitest'
24
+ s.add_development_dependency 'rake'
25
+ end
@@ -0,0 +1 @@
1
+ require(File.join(File.dirname(__FILE__), "hilarity", "api"))
@@ -0,0 +1,143 @@
1
+ require "base64"
2
+ require "cgi"
3
+ require "excon"
4
+ require "multi_json"
5
+ require "securerandom"
6
+ require "uri"
7
+ require "zlib"
8
+
9
+ __LIB_DIR__ = File.expand_path(File.join(File.dirname(__FILE__), ".."))
10
+ unless $LOAD_PATH.include?(__LIB_DIR__)
11
+ $LOAD_PATH.unshift(__LIB_DIR__)
12
+ end
13
+
14
+ require "hilarity/api/errors"
15
+ require "hilarity/api/version"
16
+
17
+ require "hilarity/api/apps"
18
+ require "hilarity/api/config_vars"
19
+ require "hilarity/api/domains"
20
+ require "hilarity/api/keys"
21
+ require "hilarity/api/login"
22
+ require "hilarity/api/user"
23
+
24
+ srand
25
+
26
+ module Hilarity
27
+ class API
28
+
29
+ HEADERS = {
30
+ 'Accept' => 'application/json',
31
+ 'Accept-Encoding' => 'gzip',
32
+ #'Accept-Language' => 'en-US, en;q=0.8',
33
+ 'User-Agent' => "hilarity-rb/#{Hilarity::API::VERSION}",
34
+ 'X-Ruby-Version' => RUBY_VERSION,
35
+ 'X-Ruby-Platform' => RUBY_PLATFORM
36
+ }
37
+
38
+ OPTIONS = {
39
+ :headers => {},
40
+ :host => 'hilarity.io',
41
+ :nonblock => false,
42
+ :scheme => 'https'
43
+ }
44
+
45
+ def initialize(options={})
46
+ options = OPTIONS.merge(options)
47
+
48
+ @api_key = options.delete(:api_key) || ENV['HILARITY_API_KEY']
49
+ if !@api_key && options.has_key?(:username) && options.has_key?(:password)
50
+ username = options.delete(:username)
51
+ password = options.delete(:password)
52
+ @connection = Excon.new("#{options[:scheme]}://#{options[:host]}", options.merge(:headers => HEADERS))
53
+ @api_key = self.post_login(username, password).body["api_key"]
54
+ end
55
+
56
+ user_pass = ":#{@api_key}"
57
+ options[:headers] = HEADERS.merge({
58
+ 'Authorization' => "Basic #{Base64.encode64(user_pass).gsub("\n", '')}",
59
+ }).merge(options[:headers])
60
+
61
+ @connection = Excon.new("#{options[:scheme]}://#{options[:host]}", options)
62
+ end
63
+
64
+ def request(params, &block)
65
+ begin
66
+ response = @connection.request(params, &block)
67
+ rescue Excon::Errors::HTTPStatusError => error
68
+ klass = case error.response.status
69
+ when 401 then Hilarity::API::Errors::Unauthorized
70
+ when 402 then Hilarity::API::Errors::VerificationRequired
71
+ when 403 then Hilarity::API::Errors::Forbidden
72
+ when 404
73
+ if error.request[:path].match /\/apps\/\/.*/
74
+ Hilarity::API::Errors::NilApp
75
+ else
76
+ Hilarity::API::Errors::NotFound
77
+ end
78
+ when 408 then Hilarity::API::Errors::Timeout
79
+ when 422 then Hilarity::API::Errors::RequestFailed
80
+ when 423 then Hilarity::API::Errors::Locked
81
+ when 429 then Hilarity::API::Errors::RateLimitExceeded
82
+ when /50./ then Hilarity::API::Errors::RequestFailed
83
+ else Hilarity::API::Errors::ErrorWithResponse
84
+ end
85
+
86
+ decompress_response!(error.response)
87
+ reerror = klass.new(error.message, error.response)
88
+ reerror.set_backtrace(error.backtrace)
89
+ raise(reerror)
90
+ end
91
+
92
+ if response.body && !response.body.empty?
93
+ decompress_response!(response)
94
+ begin
95
+ response.body = MultiJson.load(response.body)
96
+ rescue
97
+ # leave non-JSON body as is
98
+ end
99
+ end
100
+
101
+ # reset (non-persistent) connection
102
+ @connection.reset
103
+
104
+ response
105
+ end
106
+
107
+ private
108
+
109
+ def decompress_response!(response)
110
+ return unless response.headers['Content-Encoding'] == 'gzip'
111
+ response.body = Zlib::GzipReader.new(StringIO.new(response.body)).read
112
+ end
113
+
114
+ def app_params(params)
115
+ app_params = {}
116
+ params.each do |key, value|
117
+ app_params["app[#{key}]"] = value
118
+ end
119
+ app_params
120
+ end
121
+
122
+ def addon_params(params)
123
+ params.inject({}) do |accum, (key, value)|
124
+ accum["config[#{key}]"] = value
125
+ accum
126
+ end
127
+ end
128
+
129
+ def escape(string)
130
+ CGI.escape(string).gsub('.', '%2E')
131
+ end
132
+
133
+ def ps_options(params)
134
+ if ps_env = params.delete(:ps_env) || params.delete('ps_env')
135
+ ps_env.each do |key, value|
136
+ params["ps_env[#{key}]"] = value
137
+ end
138
+ end
139
+ params
140
+ end
141
+
142
+ end
143
+ end
@@ -0,0 +1,71 @@
1
+ module Hilarity
2
+ class API
3
+
4
+ # DELETE /apps/:app
5
+ def delete_app(app)
6
+ request(
7
+ :expects => 200,
8
+ :method => :delete,
9
+ :path => "/api/v1/apps/#{app}"
10
+ )
11
+ end
12
+
13
+ # GET /apps
14
+ def get_apps
15
+ request(
16
+ :expects => 200,
17
+ :method => :get,
18
+ :path => "/api/v1/apps"
19
+ )
20
+ end
21
+
22
+ # GET /apps/:app
23
+ def get_app(app)
24
+ request(
25
+ :expects => 200,
26
+ :method => :get,
27
+ :path => "/api/v1/apps/#{app}"
28
+ )
29
+ end
30
+
31
+ # GET /apps/:app/server/maintenance
32
+ def get_app_maintenance(app)
33
+ request(
34
+ :expects => 200,
35
+ :method => :get,
36
+ :path => "/api/v1/apps/#{app}/server/maintenance"
37
+ )
38
+ end
39
+
40
+ # POST /apps
41
+ def post_app(params={})
42
+ request(
43
+ :expects => 202,
44
+ :method => :post,
45
+ :path => '/api/v1/apps',
46
+ :query => app_params(params)
47
+ )
48
+ end
49
+
50
+ # POST /apps/:app/server/maintenance
51
+ def post_app_maintenance(app, maintenance_mode)
52
+ request(
53
+ :expects => 200,
54
+ :method => :post,
55
+ :path => "/api/v1/apps/#{app}/server/maintenance",
56
+ :query => {'maintenance_mode' => maintenance_mode}
57
+ )
58
+ end
59
+
60
+ # PUT /apps/:app
61
+ def put_app(app, params)
62
+ request(
63
+ :expects => 200,
64
+ :method => :put,
65
+ :path => "/api/v1/apps/#{app}",
66
+ :query => app_params(params)
67
+ )
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,33 @@
1
+ module Hilarity
2
+ class API
3
+
4
+ # DELETE /apps/:app/config/:key
5
+ def delete_config_var(app, key)
6
+ request(
7
+ :expects => 200,
8
+ :method => :delete,
9
+ :path => "/api/v1/apps/#{app}/config/#{escape(key)}"
10
+ )
11
+ end
12
+
13
+ # GET /apps/:app/config
14
+ def get_config_vars(app)
15
+ request(
16
+ :expects => 200,
17
+ :method => :get,
18
+ :path => "/api/v1/apps/#{app}/config"
19
+ )
20
+ end
21
+
22
+ # PUT /apps/:app/config
23
+ def put_config_vars(app, vars)
24
+ request(
25
+ :body => MultiJson.dump(vars),
26
+ :expects => 200,
27
+ :method => :put,
28
+ :path => "/api/v1/apps/#{app}/config"
29
+ )
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,42 @@
1
+ module Hilarity
2
+ class API
3
+
4
+ # DELETE /apps/:app/domains/:domain
5
+ def delete_domain(app, domain)
6
+ request(
7
+ :expects => 200,
8
+ :method => :delete,
9
+ :path => "/api/v1/apps/#{app}/domains/#{escape(domain)}"
10
+ )
11
+ end
12
+
13
+ # DELETE /apps/:app/domains
14
+ def delete_domains(app)
15
+ request(
16
+ :expects => 200,
17
+ :method => :delete,
18
+ :path => "/api/v1/apps/#{app}/domains"
19
+ )
20
+ end
21
+
22
+ # GET /apps/:app/domains
23
+ def get_domains(app)
24
+ request(
25
+ :expects => 200,
26
+ :method => :get,
27
+ :path => "/api/v1/apps/#{app}/domains"
28
+ )
29
+ end
30
+
31
+ # POST /apps/:app/domains
32
+ def post_domain(app, domain)
33
+ request(
34
+ :expects => 201,
35
+ :method => :post,
36
+ :path => "/api/v1/apps/#{app}/domains",
37
+ :query => {'domain_name[url]' => domain}
38
+ )
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,28 @@
1
+ module Hilarity
2
+ class API
3
+ module Errors
4
+ class Error < StandardError; end
5
+
6
+ class ErrorWithResponse < Error
7
+ attr_reader :response
8
+
9
+ def initialize(message, response)
10
+ message = message << "\nbody: #{response.body.inspect}"
11
+ super message
12
+ @response = response
13
+ end
14
+ end
15
+
16
+ class Unauthorized < ErrorWithResponse; end
17
+ class VerificationRequired < ErrorWithResponse; end
18
+ class Forbidden < ErrorWithResponse; end
19
+ class NotFound < ErrorWithResponse; end
20
+ class Timeout < ErrorWithResponse; end
21
+ class Locked < ErrorWithResponse; end
22
+ class RateLimitExceeded < ErrorWithResponse; end
23
+ class RequestFailed < ErrorWithResponse; end
24
+ class NilApp < ErrorWithResponse; end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,42 @@
1
+ module Hilarity
2
+ class API
3
+
4
+ # DELETE /ssh_keys/:key
5
+ def delete_key(key)
6
+ request(
7
+ :expects => 200,
8
+ :method => :delete,
9
+ :path => "/api/v1/ssh_keys/#{escape(key)}"
10
+ )
11
+ end
12
+
13
+ # DELETE /ssh_keys
14
+ def delete_keys
15
+ request(
16
+ :expects => 200,
17
+ :method => :delete,
18
+ :path => "/api/v1/ssh_keys"
19
+ )
20
+ end
21
+
22
+ # GET /ssh_keys
23
+ def get_keys
24
+ request(
25
+ :expects => 200,
26
+ :method => :get,
27
+ :path => "/api/v1/ssh_keys"
28
+ )
29
+ end
30
+
31
+ # POST /ssh_keys
32
+ def post_key(key)
33
+ request(
34
+ :body => key,
35
+ :expects => 200,
36
+ :method => :post,
37
+ :path => "/api/v1/ssh_keys"
38
+ )
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,14 @@
1
+ module Hilarity
2
+ class API
3
+
4
+ def post_login(username, password)
5
+ request(
6
+ :expects => 200,
7
+ :method => :post,
8
+ :path => '/api/v1/users/login',
9
+ :query => { 'username' => username, 'password' => password }
10
+ )
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module Hilarity
2
+ class API
3
+
4
+ # GET /user/me
5
+ def get_user
6
+ request(
7
+ :expects => 200,
8
+ :method => :get,
9
+ :path => "/api/v1/users/me"
10
+ )
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ module Hilarity
2
+ class API
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hilarity-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Zane Shannon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: excon
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.38'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.38'
27
+ - !ruby/object:Gem::Dependency
28
+ name: multi_json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.8'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Ruby Client for the Hilarity API
70
+ email:
71
+ - zcs@hilarity.io
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - README.md
79
+ - Rakefile
80
+ - changelog.txt
81
+ - hilarity-api.gemspec
82
+ - lib/hilarity-api.rb
83
+ - lib/hilarity/api.rb
84
+ - lib/hilarity/api/apps.rb
85
+ - lib/hilarity/api/config_vars.rb
86
+ - lib/hilarity/api/domains.rb
87
+ - lib/hilarity/api/errors.rb
88
+ - lib/hilarity/api/keys.rb
89
+ - lib/hilarity/api/login.rb
90
+ - lib/hilarity/api/user.rb
91
+ - lib/hilarity/api/version.rb
92
+ homepage: http://github.com/hilarity/hilarity.rb
93
+ licenses:
94
+ - MIT
95
+ metadata: {}
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 2.2.2
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: Ruby Client for the Hilarity API
116
+ test_files: []