nodester 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in nodester.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Martin Wawrusch
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+
2
+ WARNING: NOT RELEASED YET
3
+
4
+ = Nodester
5
+
6
+ An API wrapper for the nodester API (http://nodester.com). The initial version uses a straight approach, an ActiveResource like interface might be added if there is enough interest.
7
+
8
+ == Install
9
+
10
+ Include this in your gemfile
11
+
12
+ gem 'nodester'
13
+
14
+ == Use
15
+
16
+ client = Nodester::Client.new("username","password")
17
+ client.create_app 'myappname','server.js'
18
+ ...
19
+
20
+ Note: There are a couple of methods, notably the platform_create_request and platform_status methods that
21
+ operate against www.nodester.com and not api.nodester.com, those do not require a userid/password. Just choose dummy/dummy or something similar.
22
+
23
+ All results are hashes, with strings (not symbols) as keys.
24
+
25
+ In case of an error either a ResponseError or a StandardError is raised.
26
+
27
+ == Dependencies
28
+
29
+ * Httparty
30
+
31
+
32
+ == Acknowledgments
33
+
34
+ Thanks to
35
+
36
+ * Aaron Russel (https://github.com/aaronrussell) whose cloudapp api helped a lot (some spec code is taken verbatim)
37
+ * John Nunemaker (https://github.com/jnunemaker) for httparty and all his other contributions.
38
+
39
+
40
+ == Trivia
41
+
42
+ This gem was created to the tunes of Natalia Kills and Nicki Minaj.
43
+
44
+ == Contributing to nodester
45
+
46
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
47
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
48
+ * Fork the project
49
+ * Start a feature/bugfix branch
50
+ * Commit and push until you are happy with your contribution
51
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
52
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
53
+
54
+ == Copyright
55
+
56
+ Copyright (c) 2011 Martin Wawrusch, inc. See LICENSE for
57
+ further details.
58
+
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ desc 'Run the specs'
6
+ RSpec::Core::RakeTask.new do |r|
7
+ r.verbose = false
8
+ end
9
+
10
+ task :default => :spec
@@ -0,0 +1,194 @@
1
+ require 'httparty'
2
+
3
+ module Nodester
4
+ # An API wrapper for the nodester.com API
5
+ # @example Request a nodester.com coupon
6
+ # client = Nodester::Client.new("","")
7
+ # client.platform_coupon_request('arthur@dent.com')
8
+ #
9
+ # @example Convert a coupon (received per email) to an account
10
+ # client = Nodester::Client.new("","")
11
+ # client.platform_create_user("coupon",'arthur','dent','arthur@dent.com','rsakey')
12
+ #
13
+ # @example Get the platform status
14
+ # client = Nodester::Client.new("","")
15
+ # res = client.platform_status()
16
+ # puts "Status #{res['status']} Apps Hosted #{res['appshosted']} Apps Running #{res['appsrunning']}"
17
+ #
18
+ # @example Create an app
19
+ # client = Nodester::Client.new("arthur","dent")
20
+ # client.create_app 'myappname','server.js'
21
+ #
22
+ #
23
+ class Client
24
+ include HTTParty
25
+ base_uri 'http://api.nodester.com'
26
+
27
+ PLATFORM_URI = 'http://nodester.com'
28
+
29
+ def initialize(u, p )
30
+ @auth = {:username => u, :password => p}
31
+ end
32
+
33
+
34
+ # Examines a bad response and raises an approriate exception
35
+ #
36
+ # @param [HTTParty::Response] response
37
+ def self.bad_response(response)
38
+ if response.class == HTTParty::Response
39
+ raise ResponseError, response
40
+ end
41
+ raise StandardError, "Unkown error"
42
+ end
43
+
44
+ def handle_result(res)
45
+ res.ok? ? res : bad_response(res)
46
+ end
47
+
48
+ # ------------------------------------
49
+ # Nodester.com platform specific functions
50
+ # ------------------------------------
51
+
52
+ # Creates a coupon request against nodester.com for early access
53
+ # Flow is as follows: You post this and receive a coupon per email.
54
+ # Parameters:
55
+ # email (required) : "x@y.com"
56
+ # Returns:
57
+ # status : "success - you are now in queue to receive an invite on our next batch!"
58
+ def platform_coupon_request(email)
59
+ options={ :body => {:email => email}, :base_uri => PLATFORM_URI}
60
+ handle_result self.class.post('/coupon', options)
61
+ end
62
+
63
+ # Returns the nodester.com platform status
64
+ # {:status=>"up", :appshosted=>1599, :appsrunning=>988}
65
+ def platform_status()
66
+ options = {:base_uri => PLATFORM_URI}
67
+ handle_result self.class.get('/status', options)
68
+ end
69
+
70
+ # Creates a new user from the coupon given.
71
+ def platform_create_user(coupon,user,password,email,rsakey)
72
+ options={ :body => {:coupon => coupon,:user =>user,:password=>password,:email=>email,:rsakey=>rsakey}, :base_uri => PLATFORM_URI}
73
+ handle_result self.class.post('/user', options)
74
+ end
75
+
76
+ # ------------------------------------
77
+ # API specific functions
78
+ # ------------------------------------
79
+
80
+ # Updates the current user.
81
+ def update_user(opts={})
82
+ options={:body => opts,:basic_auth => @auth}
83
+ handle_result self.class.put('/user', options)
84
+ end
85
+
86
+ # Deletes the current user.
87
+ def platform_delete_user()
88
+ options={:basic_auth => @auth}
89
+ handle_result self.class.delete('/user', options)
90
+ end
91
+
92
+
93
+
94
+ # Creates a new app
95
+ # Parameters are:
96
+ # appname (required). The name of the app.
97
+ # start (required). The file to start, for example server.js.
98
+ # Returns:
99
+ # status : "success" | "failure"
100
+ # message : "some text" ==> Only if failure
101
+ # port : 12345
102
+ # gitrepo : 'git@nodester.com:/node/git/mwawrusch/blah.git'
103
+ # start : "the value of start, for example servre.js"
104
+ # running : true | false
105
+ # pid : "unknown" | some pid
106
+ def create_app(appname,start)
107
+ options={:body => {:appname=>appname,:start=>start}, :basic_auth => @auth}
108
+ handle_result self.class.post('/app', options)
109
+ end
110
+
111
+
112
+ def update_app(appname,opts = {})
113
+ opts.merge!({:appname => appname})
114
+
115
+ options={:body=> opts, :basic_auth => @auth}
116
+ handle_result self.class.put('/app', options)
117
+ end
118
+
119
+ def start_stop_app(appname,running = true)
120
+
121
+ options={:body=> {:appname => appname, :running=>start}, :basic_auth => @auth}
122
+ handle_result self.class.put('/app', options)
123
+ end
124
+
125
+
126
+ def delete_app(appname)
127
+ options={:body => {:appname => appname}, :basic_auth => @auth}
128
+ handle_result self.class.delete('/app', options)
129
+ end
130
+
131
+ def app(appname)
132
+ options={:body => {},:basic_auth => @auth}
133
+ handle_result self.class.get("/app/#{appname}", options)
134
+ end
135
+
136
+ # Get a list of all apps.
137
+ # Returns:
138
+ # An array containing a list of apps, if any.
139
+ #
140
+ # App object format:
141
+ # name : testxyz1
142
+ # port : 12344
143
+ # gitrepo : 'git@nodester.com:/node/git/mwawrusch/blah.git'
144
+ # running : false
145
+ # pid : "unknown" | some pid
146
+ # gitrepo : 'git@nodester.com:/node/git/mwawrusch/2914-2295037e88fed947a9b3b994171c5a9e.git", "running"=>false, "pid"=>"unknown"}
147
+ def apps()
148
+ options={:basic_auth => @auth}
149
+ handle_result self.class.get('/apps', options)
150
+ end
151
+
152
+
153
+
154
+ def update_env(appname,key,value)
155
+ options={:body => {:appname => appname,:key=>key,:value=>value},:basic_auth => @auth}
156
+ handle_result self.class.put('/env', options)
157
+ end
158
+
159
+ def delete_env(appname,key)
160
+ options={:body => {:appname => appname,:key=>key},:basic_auth => @auth}
161
+ handle_result self.class.delete('/env', options)
162
+ end
163
+
164
+ def env(appname,key)
165
+ options={:body => {:appname => appname,:key=>key},:basic_auth => @auth}
166
+ handle_result self.class.get('/env', options)
167
+ end
168
+
169
+ def update_npm(action,package)
170
+ options={:body => {:action => action,:package=>package},:basic_auth => @auth}
171
+ handle_result self.class.post('/npm', options)
172
+ end
173
+
174
+
175
+ def create_appdomain(appname,domain)
176
+ options={:body => {:appname => appname,:domain=>domain},:basic_auth => @auth}
177
+ handle_result self.class.post('/appdomains', options)
178
+ end
179
+
180
+ def delete_appdomain(appname,domain)
181
+ options={:body => {:appname => appname,:domain=>domain},:basic_auth => @auth}
182
+ handle_result self.class.delete('/appdomains', options)
183
+ end
184
+
185
+ def appdomains()
186
+ options={:basic_auth => @auth}
187
+ handle_result self.class.get('/appdomains', options)
188
+ end
189
+
190
+
191
+ end
192
+
193
+ end
194
+
@@ -0,0 +1,3 @@
1
+ module Nodester
2
+ VERSION = "0.0.1"
3
+ end
data/lib/nodester.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "nodester/version"
2
+
3
+ module Nodester
4
+ require "nodester/client"
5
+ end
data/nodester.gemspec ADDED
@@ -0,0 +1,43 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "nodester/version"
4
+
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "nodester"
8
+ s.version = Nodester::VERSION
9
+ s.platform = Gem::Platform::RUBY
10
+ s.authors = ["Martin Wawrusch"]
11
+ s.email = ["martin@wawrusch.com"]
12
+ s.homepage = "http://github.com/scottyapp/nodester"
13
+ s.summary = %q{An API wrapper for the nodester API (http://nodester.com).}
14
+ s.description = %q{A gem that implements the nodester.com API which allows you to cloud-host node.js applications.}
15
+ s.extra_rdoc_files = ["LICENSE","README.md"]
16
+ s.rdoc_options = ["--charset=UTF-8"]
17
+ s.rubyforge_project = "nodester"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+
24
+ s.add_runtime_dependency "httparty"
25
+ s.add_development_dependency "rspec", "~> 2.1"
26
+ s.add_development_dependency "rake", "~> 0.8"
27
+ s.add_development_dependency "fakeweb",">= 0"
28
+ s.add_development_dependency "bundler","~> 1.0.0"
29
+ #s.add_development_dependency "rcov", ">= 0"
30
+ s.post_install_message=<<eos
31
+ **********************************************************************************
32
+ Thank you for using this gem.
33
+
34
+ Follow @martin_sunset on Twitter for announcements, updates and news
35
+ https://twitter.com/martin_sunset
36
+
37
+ To get the source go to http://github.com/scottyapp/nodester
38
+
39
+ **********************************************************************************
40
+ eos
41
+
42
+
43
+ end
@@ -0,0 +1,131 @@
1
+ require 'spec_helper'
2
+ require 'nodester'
3
+
4
+ describe Nodester::Client do
5
+ before(:each) do
6
+ fake_it_all
7
+ @client = Nodester::Client.new("arthur","dent")
8
+ end
9
+
10
+
11
+ context "when invoking platform_coupon_request" do
12
+ it "should be a success" do
13
+ res = @client.platform_coupon_request "arthur@dent.com"
14
+ res['status'].start_with?('success').should == true
15
+ end
16
+ end
17
+
18
+ context "when invoking platform_status" do
19
+ it "should return a status" do
20
+ res = @client.platform_status
21
+ res['status'].should == "up"
22
+ res['appshosted'].should == 1599
23
+ res['appsrunning'].should == 988
24
+ end
25
+ end
26
+
27
+ # Need testing:
28
+ #platform_create_user
29
+ #update_user
30
+ #platform_delete_user
31
+
32
+ context "when invoking create_app" do
33
+ it "should create an app" do
34
+ res = @client.create_app "testapp","server.js"
35
+ res['status'].should == "success"
36
+ res['port'].should > 0
37
+ res['gitrepo'].start_with?('git@nodester.com:/node/git/').should == true
38
+ res['start'].should == 'server.js'
39
+ res['running'].should == false
40
+ res['pid'].should == 'unknown'
41
+
42
+ end
43
+ end
44
+
45
+ =begin
46
+ context "when invoking update_app" do
47
+ it "should update an app" do
48
+ res = @client.update_app
49
+ end
50
+ end
51
+
52
+ context "when invoking start_stop_app" do
53
+ it "should start an app" do
54
+ res = @client.start_stop_app('testapp',true)
55
+ end
56
+ end
57
+
58
+ context "when invoking delete_app" do
59
+ it "should delete an app" do
60
+ res = @client.delete_app
61
+ end
62
+ end
63
+ =end
64
+
65
+ context "when invoking app" do
66
+ it "should return app info" do
67
+ res = @client.app 'a1234'
68
+ res['status'].should == "success"
69
+ res['port'].should > 0
70
+ res['gitrepo'].start_with?('git@nodester.com:/node/git/').should == true
71
+ res['start'].should == 'server.js'
72
+ res['running'].should == false
73
+ res['pid'].should == 'unknown'
74
+
75
+ end
76
+ end
77
+
78
+ context "when invoking apps" do
79
+ it "should return a list of apps" do
80
+ res = @client.apps
81
+ res.length.should == 2
82
+ res[0]['name'].should == 'a1234'
83
+ end
84
+ end
85
+
86
+ =begin
87
+ context "when invoking update_env" do
88
+ it "should set an env value" do
89
+ res = @client.update_env
90
+ end
91
+ end
92
+
93
+ context "when invoking delete_env" do
94
+ it "should remove an env value" do
95
+ res = @client.delete_env
96
+ end
97
+ end
98
+
99
+ context "when invoking env" do
100
+ it "should return an env value" do
101
+ res = @client.env
102
+ end
103
+ end
104
+
105
+ context "when invoking update_npm" do
106
+ it "should perform an op against the npm" do
107
+ res = @client.update_npm
108
+ end
109
+ end
110
+
111
+
112
+ context "when invoking create_appdomain" do
113
+ it "should create an app domain" do
114
+ res = @client.create_appdomain
115
+ end
116
+ end
117
+
118
+ context "when invoking delete_appdomain" do
119
+ it "should delete an app domain" do
120
+ res = @client.delete_appdomain
121
+ end
122
+ end
123
+
124
+ context "when invoking appdomains" do
125
+ it "should list all available appdomains" do
126
+ res = @client.update_npm
127
+ end
128
+ end
129
+ =end
130
+
131
+ end
@@ -0,0 +1,37 @@
1
+ require 'fakeweb'
2
+
3
+ FakeWeb.allow_net_connect = false
4
+
5
+ def stub_file(stub)
6
+ File.join(File.dirname(__FILE__), 'stubs', stub)
7
+ end
8
+
9
+ def fake_it_all
10
+ FakeWeb.clean_registry
11
+ #FakeWeb.register_uri :head, %r{http://(api.)|(www.)?nodester.com(/items)?}, :status => ["200", "OK"]
12
+
13
+ {
14
+ # GET URLs
15
+ :get => {
16
+ 'http://nodester.com/status' => 'platform_get_status',
17
+ 'http://arthur:dent@api.nodester.com/apps' => 'get_apps',
18
+ %r|http://arthur:dent@api.nodester.com/app/[a-zA-Z0-0]+| => 'get_app'
19
+ },
20
+ # POST URLs
21
+ :post => {
22
+ 'http://nodester.com/coupon' => 'platform_post_coupon',
23
+ 'http://arthur:dent@api.nodester.com/app' => 'post_app'
24
+ },
25
+ # PUT URLs
26
+ :put => {
27
+ },
28
+ # DELETE URLs
29
+ :delete => {
30
+ }
31
+ }.each do |method, requests|
32
+ requests.each do |url, response|
33
+ FakeWeb.register_uri(method, url, :response => stub_file(response))
34
+ end
35
+ end
36
+ end
37
+
@@ -0,0 +1,20 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ require 'rspec'
6
+ require 'nodester'
7
+ require 'httparty'
8
+ require 'fakeweb_helper.rb'
9
+
10
+
11
+ # Requires supporting files with custom matchers and macros, etc,
12
+ # in ./support/ and its subdirectories.
13
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
14
+
15
+ RSpec.configure do |config|
16
+ config.color_enabled = true
17
+ end
18
+
19
+
20
+
@@ -0,0 +1,5 @@
1
+ HTTP/1.1 200 OK
2
+ Status: 200
3
+ Content-Type: application/json; charset=utf-8
4
+
5
+ {"status":"success","port":11092,"gitrepo":"git@nodester.com:/node/git/mwawrusch/2939-bf58ab1dd19cc93cc4427bb920c0ff4b.git","start":"server.js","running":false,"pid":"unknown"}
@@ -0,0 +1,5 @@
1
+ HTTP/1.1 200 OK
2
+ Status: 200
3
+ Content-Type: application/json; charset=utf-8
4
+
5
+ [{"name":"a1234","port":11092,"gitrepo":"git@nodester.com:/node/git/mwawrusch/2939-bf58ab1dd19cc93cc4427bb920c0ff4b.git","running":false,"pid":"unknown"},{"name":"testxyz123","port":11067,"gitrepo":"git@nodester.com:/node/git/mwawrusch/2914-2295037e88fed947a9b3b994171c5a9e.git","running":false,"pid":"unknown"}]
@@ -0,0 +1,5 @@
1
+ HTTP/1.1 200 OK
2
+ Status: 200
3
+ Content-Type: application/json; charset=utf-8
4
+
5
+ { status : 'up', appshosted : 1599, appsrunning : 988}
@@ -0,0 +1,5 @@
1
+ HTTP/1.1 200 OK
2
+ Status: 200
3
+ Content-Type: application/json; charset=utf-8
4
+
5
+ { status : 'success - you are now in queue to receive an invite on our next batch!'}
@@ -0,0 +1,5 @@
1
+ HTTP/1.1 200 OK
2
+ Status: 200
3
+ Content-Type: application/json; charset=utf-8
4
+
5
+ {"status":"success","port":11092,"gitrepo":"git@nodester.com:/node/git/mwawrusch/2939-bf58ab1dd19cc93cc4427bb920c0ff4b.git","start":"server.js","running":false,"pid":"unknown"}
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nodester
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Martin Wawrusch
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-07-28 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: httparty
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: "2.1"
36
+ type: :development
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: rake
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: "0.8"
47
+ type: :development
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: fakeweb
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ type: :development
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: bundler
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 1.0.0
69
+ type: :development
70
+ version_requirements: *id005
71
+ description: A gem that implements the nodester.com API which allows you to cloud-host node.js applications.
72
+ email:
73
+ - martin@wawrusch.com
74
+ executables: []
75
+
76
+ extensions: []
77
+
78
+ extra_rdoc_files:
79
+ - LICENSE
80
+ - README.md
81
+ files:
82
+ - .gitignore
83
+ - Gemfile
84
+ - LICENSE
85
+ - README.md
86
+ - Rakefile
87
+ - lib/nodester.rb
88
+ - lib/nodester/client.rb
89
+ - lib/nodester/version.rb
90
+ - nodester.gemspec
91
+ - spec/client_spec.rb
92
+ - spec/fakeweb_helper.rb
93
+ - spec/spec_helper.rb
94
+ - spec/stubs/get_app
95
+ - spec/stubs/get_apps
96
+ - spec/stubs/platform_get_status
97
+ - spec/stubs/platform_post_coupon
98
+ - spec/stubs/post_app
99
+ has_rdoc: true
100
+ homepage: http://github.com/scottyapp/nodester
101
+ licenses: []
102
+
103
+ post_install_message: |
104
+ **********************************************************************************
105
+ Thank you for using this gem.
106
+
107
+ Follow @martin_sunset on Twitter for announcements, updates and news
108
+ https://twitter.com/martin_sunset
109
+
110
+ To get the source go to http://github.com/scottyapp/nodester
111
+
112
+ **********************************************************************************
113
+
114
+ rdoc_options:
115
+ - --charset=UTF-8
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: "0"
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: "0"
130
+ requirements: []
131
+
132
+ rubyforge_project: nodester
133
+ rubygems_version: 1.5.0
134
+ signing_key:
135
+ specification_version: 3
136
+ summary: An API wrapper for the nodester API (http://nodester.com).
137
+ test_files:
138
+ - spec/client_spec.rb
139
+ - spec/fakeweb_helper.rb
140
+ - spec/spec_helper.rb
141
+ - spec/stubs/get_app
142
+ - spec/stubs/get_apps
143
+ - spec/stubs/platform_get_status
144
+ - spec/stubs/platform_post_coupon
145
+ - spec/stubs/post_app