kynetx_am_api 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2010 Kynetx Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'rubygems'
2
+ require 'rake'
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + "/rails/init.rb"
@@ -0,0 +1,41 @@
1
+ require File.dirname(__FILE__) + '/kynetx_am_api/direct_api.rb'
2
+ require File.dirname(__FILE__) + '/kynetx_am_api/oauth.rb'
3
+ require File.dirname(__FILE__) + '/kynetx_am_api/user.rb'
4
+ require File.dirname(__FILE__) + '/kynetx_am_api/application.rb'
5
+
6
+
7
+ DEFAULT_META = <<-KRL
8
+ meta {
9
+ name "<<NAME>>"
10
+ description <<
11
+ <<DESCRIPTION>>
12
+ >>
13
+ author ""
14
+ // Uncomment this line to require Markeplace purchase to use this app.
15
+ // authz require user
16
+ logging off
17
+ }
18
+ KRL
19
+
20
+ DEFAULT_GLOBAL = <<-KRL
21
+ global {
22
+
23
+ }
24
+ KRL
25
+
26
+ DEFAULT_DISPATCH = <<-KRL
27
+ dispatch {
28
+ // Some example dispatch domains
29
+ // www.exmple.com
30
+ // other.example.com
31
+ }
32
+ KRL
33
+
34
+ DEFAULT_RULE = <<-KRL
35
+ rule <<NAME>> is active {
36
+ select using "" setting ()
37
+ // pre { }
38
+ // notify("Hello World", "This is a sample rule.");
39
+ noop();
40
+ }
41
+ KRL
@@ -0,0 +1,228 @@
1
+ module KynetxAmApi
2
+ class Application
3
+
4
+ attr_reader :name
5
+ attr_reader :user
6
+ attr_reader :application_id
7
+ attr_reader :api
8
+
9
+ def initialize(user, application_id, version=nil)
10
+ @api = user.api
11
+ @application_id = application_id
12
+ @user = user
13
+ load_base
14
+ end
15
+
16
+ def to_param
17
+ return @application_id
18
+ end
19
+
20
+ def create_initial_app(name, description)
21
+ @name = name
22
+ @description = description
23
+ @meta = DEFAULT_META.gsub("<<NAME>>", name).gsub("<<DESCRIPTION>>", description)
24
+ @global = DEFAULT_GLOBAL
25
+ @dispatch = DEFAULT_DISPATCH
26
+ @first_rule = DEFAULT_RULE.gsub("<<NAME>>", "first_rule")
27
+ set_krl(gen_default_krl)
28
+ load_base
29
+ return self
30
+ end
31
+
32
+ def delete
33
+ @api.post_app_delete(@application_id)
34
+ end
35
+
36
+ def krl(v=nil)
37
+ @krl ||= @api.get_app_source(@application_id, v ? v : "development", :krl)
38
+ end
39
+
40
+ def image_url(size="normal")
41
+ # returns the image url of a given size
42
+ load_base unless @images
43
+ if @images.empty?
44
+ defaults = {
45
+ "thumb" => "http://appresource.s3.amazonaws.com/apiappimages/missing_thumb.png",
46
+ "normal" => "http://appresource.s3.amazonaws.com/apiappimages/missing.png",
47
+ "original" => "http://appresource.s3.amazonaws.com/apiappimages/missing.png",
48
+ "icard" => "http://appresource.s3.amazonaws.com/apiappimages/missing_icard.jpg"
49
+ }
50
+ return defaults[size.to_s]
51
+ end
52
+ return @images[size.to_s]
53
+ end
54
+
55
+ def set_image(filename, content_type, image_data)
56
+ return @api.post_app_updateappimage(@application_id, filename, content_type, image_data)
57
+ end
58
+
59
+ def krl=(krl)
60
+ set_krl(krl)
61
+ end
62
+
63
+ def users
64
+ load_base unless @users
65
+ return @users
66
+ end
67
+
68
+ def remove_user(userid)
69
+ return @api.post_remove_user(@application_id, userid)
70
+ end
71
+
72
+ def version
73
+ return development_version
74
+ end
75
+
76
+ def development_version
77
+ load_versions unless @development_version
78
+ return @development_version
79
+ end
80
+
81
+ def production_version
82
+ load_versions unless @production_version
83
+ return @production_version
84
+ end
85
+
86
+ def production_version=(version)
87
+ @api.post_app_setproductversion(@application_id, version)
88
+ @production_version = version
89
+ end
90
+
91
+ def versions
92
+ load_versions unless @versions
93
+ return @versions
94
+ end
95
+
96
+ def set_version_note(version, note)
97
+ @api.post_app_setversionnote(@application_id, version, note)
98
+ end
99
+
100
+ def owner
101
+ load_base unless @owner
102
+ return @owner
103
+ end
104
+
105
+ def transfer_request
106
+ load_base unless @transfer_request
107
+ return @transfer_request
108
+ end
109
+
110
+ def transfer_owner(user_id, message)
111
+ load_base unless @name
112
+ return @api.post_app_transferownershiprequest(@application_id, @name, user_id, message)
113
+ end
114
+
115
+ def cancel_transfer(request_id)
116
+ return @api.post_app_ownershiptransfercancel(@application_id, request_id)
117
+ end
118
+
119
+ def share(email, message)
120
+ load_base unless @name
121
+ return @api.post_app_inviteuser(@application_id, @name, email, message)
122
+ end
123
+
124
+ def invites
125
+ load_base unless @invites
126
+ return @invites
127
+ end
128
+
129
+ def cancel_invite(invite_id)
130
+ return @api.post_app_invitecancel(@application_id, invite_id)
131
+ end
132
+
133
+ def reload
134
+ load_base
135
+ load_versions
136
+ end
137
+
138
+ #----- Distrubution Methods
139
+
140
+ def bookmarklet(env="prod", runtime="init.kobj.net/js/shared/kobj-static.js")
141
+ return @api.post_app_generate(@application_id, "bookmarklet", {"env" => env, "runtime" => runtime})["data"]
142
+ end
143
+
144
+ def infocard(name, datasets, env="prod")
145
+ load_base unless @guid
146
+ options = {
147
+ "extname" => name.gsub(/[&'<]/, "_"),
148
+ "extdatasets" => datasets.to_s,
149
+ "extversion" => env
150
+ }
151
+
152
+ options["image_url"] = image_url("icard")
153
+
154
+ return @api.post_app_generate(@application_id, "info_card", options)
155
+ end
156
+
157
+ def extension(type, name, author, description)
158
+ options = {
159
+ "extname" => name,
160
+ "extdesc" => description,
161
+ "extauthor" => author.to_s.empty? ? @user.name : author
162
+ }
163
+ options["appguid"] = @guid if type == :ie
164
+ return @api.post_app_generate(@application_id, type.to_s, options)
165
+
166
+ end
167
+
168
+ private
169
+
170
+ def gen_default_krl
171
+ r = "ruleset #{@application_id} {\n#{@meta}\n#{@dispatch}\n#{@global}\n#{@first_rule}}"
172
+ return r
173
+ end
174
+
175
+ def load_base
176
+ app_details = @api.get_app_details(@application_id)
177
+ puts "APPDETAILS: #{app_details.inspect}" if $DEBUG
178
+ if app_details["error"]
179
+ raise app_details["error"]
180
+ end
181
+ @name = app_details["name"]
182
+ @application_id = app_details["appid"]
183
+ @guid = app_details["guid"]
184
+ @owner = nil
185
+ @users = app_details["users"]
186
+ @users.each do |user|
187
+ if user["role"] == "owner"
188
+ @owner = user
189
+ break
190
+ end
191
+ end
192
+ @transfer_request = app_details["transferrequest"]
193
+ @transfer_request = nil unless @transfer_request
194
+ @invites = app_details["invites"]
195
+ @invites = [] unless @invites
196
+ @images = app_details["images"]
197
+ @images = [] unless @images
198
+ end
199
+
200
+
201
+ def load_versions
202
+ app_info = @api.get_app_info(@application_id)
203
+ puts "APPINFO: #{app_info.inspect}" if $DEBUG
204
+ @production_version = app_info["production"]["version"] if app_info["production"]
205
+ @development_version = app_info["development"]["version"] if app_info["development"]
206
+ @application_id = app_info["appid"]
207
+ @versions = app_info["versions"]
208
+ end
209
+
210
+ def set_krl(krl)
211
+ # ensure that the ruleset_id is correct.
212
+ krl.gsub!(/ruleset.*?\{/m, "ruleset #{@application_id} {")
213
+ puts "NEW KRL: #{krl}" if $DEBUG
214
+ response = @api.post_app_source(@application_id, krl, "krl")
215
+ response = JSON.parse(response)
216
+ if response["valid"]
217
+ reload
218
+ return true
219
+ else
220
+ raise response["error"]
221
+ end
222
+ end
223
+
224
+
225
+ end
226
+ end
227
+
228
+
@@ -0,0 +1,210 @@
1
+ module KynetxAmApi
2
+ require 'rubygems'
3
+ require 'oauth'
4
+ require 'json'
5
+ require 'net/http/post/multipart'
6
+
7
+ class DirectApi
8
+
9
+ attr_accessor :oauth
10
+
11
+ #
12
+ # Create a new session to the KynetxApi Manager.
13
+ #
14
+ # request_token
15
+ # request_secret
16
+ # :request_token
17
+ # :request_secret
18
+ # :oauth_verifier
19
+ # :access_token
20
+ # :access_secret
21
+ #
22
+ def initialize(tokens_and_secrets = {})
23
+ @oauth = KynetxAmApi::Oauth.new(tokens_and_secrets)
24
+ end
25
+
26
+ #
27
+ def get_request_token
28
+ @oauth.get_request_token
29
+ end
30
+
31
+ #
32
+ # Provides the url to direct user to if the application has not been authorized.
33
+ #
34
+ def get_authorize_url
35
+ return get_request_token.authorize_url
36
+ end
37
+
38
+
39
+ #
40
+ # API Call From Here Down.
41
+ #
42
+
43
+ #
44
+ #
45
+ def get_applist
46
+ return get_response("applist", :json)
47
+ end
48
+
49
+ def get_appcreate
50
+ return get_response("appcreate", :json)
51
+ end
52
+
53
+ def post_app_delete(application_id)
54
+ return post_response("app/#{application_id}/delete", {})
55
+ end
56
+
57
+ def post_remove_user(application_id, user_id)
58
+ return post_response("app/#{application_id}/removeuser", {"userid" => user_id})
59
+ end
60
+
61
+ def post_app_inviteuser(application_id, application_name, email, message)
62
+ return post_response("app/#{application_id}/inviteuser", {"email" => email, "message" => message, "appname" => application_name.to_s})
63
+ end
64
+
65
+ def post_app_invitecancel(application_id, invite_id)
66
+ return post_response("app/#{application_id}/invitecancel",{"inviteid" => invite_id})
67
+ end
68
+
69
+ def post_app_transferownershiprequest(application_id,application_name,user_id,message)
70
+ return post_response("app/#{application_id}/ownershiptransferrequest", {"userid" => user_id, "message" => message, "appname" => application_name})
71
+ end
72
+
73
+ def post_app_ownershiptransfercancel(application_id,transfer_id)
74
+ return post_response("app/#{application_id}/ownershiptransfercancel", {"ownershiptransferrequestid" => transfer_id})
75
+ end
76
+
77
+ #
78
+ # type is one of ff = firefox, ie = internet explorer, cr = google chrome
79
+ #
80
+ def post_app_generate(application_id, type, opts={})
81
+ #
82
+ # default_options = {
83
+ # "name" => "",
84
+ # "author" => "",
85
+ # "description" => "",
86
+ # "guid" => "",
87
+ # "datasets" => "",
88
+ # "env" => "prod",
89
+ # "image_url" => "http://appresource.s3.amazonaws.com/apiappimages/missing_icard.jpg",
90
+ # "runtime" => ""
91
+ # }
92
+ # options = default_options.merge(opts)
93
+ return post_response("app/#{application_id}/generate/#{type}", opts,:json)
94
+ end
95
+
96
+
97
+ def get_app_source(application_id, version, format = :krl)
98
+ data = get_response("app/#{application_id}/source/#{version}/#{format}", format)
99
+ return data
100
+ end
101
+
102
+ def get_app_info(application_id)
103
+ return get_response("app/#{application_id}/info", :json)
104
+ end
105
+
106
+ def get_app_details(application_id)
107
+ return get_response("app/#{application_id}/details", :json)
108
+ end
109
+
110
+
111
+ def post_app_source(application_id, source, type = "krl")
112
+ data = ""
113
+ if type == "krl"
114
+ data = {:krl => source.to_s}
115
+ else
116
+ data = {:json => source.to_json}
117
+ end
118
+ return post_response("app/#{application_id}/source", data)
119
+ end
120
+
121
+
122
+ def post_app_setproductversion(application_id, version)
123
+ return post_response("app/#{application_id}/setproductionversion", {"version" => version})
124
+ end
125
+
126
+ def post_app_setversionnote(application_id, version, note)
127
+ return post_response("app/#{application_id}/setversionnote", {"version" => version, "note" => note}, :json)
128
+ end
129
+
130
+ def post_app_updateappimage(application_id, filename, content_type, image_data)
131
+ # TODO: Make this go through the APIß
132
+ response = ""
133
+ url = URI.parse('https://accounts.kynetx.com/api/0.1/updateAppInfo')
134
+ StringIO.open(image_data) do |i|
135
+ req = Net::HTTP::Post::Multipart.new url.path,
136
+ "image" => UploadIO.new(i, content_type, filename),
137
+ "appid" => application_id
138
+ http = Net::HTTP.new(url.host, url.port)
139
+ http.use_ssl = true
140
+ response = http.start { |h| h.request(req) }
141
+ end
142
+
143
+ return response
144
+ end
145
+
146
+ def ping
147
+ return get_response("ping")
148
+ end
149
+
150
+ def get_user_info
151
+ user = @oauth.user
152
+ if user.username.to_s.empty?
153
+ user_info = get_response("userinfo", :json)
154
+ user.username = user_info["username"]
155
+ user.userid = user_info["userid"]
156
+ user.name = user_info["name"]
157
+ end
158
+ return user
159
+ end
160
+
161
+ private
162
+
163
+ def get_response(api_method, format = nil)
164
+ if format == :json
165
+ headers = {'Accept'=>'application/json'}
166
+ end
167
+ api_call = "/0.1/#{api_method}"
168
+ puts "---------GET---------------" if $DEBUG
169
+ puts api_call if $DEBUG
170
+ puts "___________________________" if $DEBUG
171
+ response = @oauth.get_access_token.get(api_call, headers).body
172
+ puts response.inspect if $DEBUG
173
+ puts "___________________________" if $DEBUG
174
+ begin
175
+ response = JSON.parse(response) if format == :json
176
+ rescue
177
+ puts $! if $DEBUG
178
+ raise "Unexpected response from the api: (#{api_method}) :: #{response}"
179
+ end
180
+ return response
181
+ end
182
+
183
+ # Probably a better way to do this. Make it a little more DRY
184
+ def post_response(api_method, data, format=nil, additional_headers=nil)
185
+ if format == :json
186
+ headers = {'Accept'=>'application/json'}
187
+ end
188
+ if additional_headers
189
+ headers.merge!(additional_headers)
190
+ end
191
+ api_call = "/0.1/#{api_method}"
192
+ puts "---------POST--------------" if $DEBUG
193
+ puts api_call if $DEBUG
194
+ puts data.inspect if $DEBUG
195
+ puts "___________________________" if $DEBUG
196
+ response = @oauth.get_access_token.post(api_call, data, headers).body
197
+ puts response.inspect if $DEBUG
198
+ puts "---------------------------" if $DEBUG
199
+ begin
200
+ response = JSON.parse(response) if format == :json
201
+ rescue
202
+ puts $! if $DEBUG
203
+ raise "Unexpected response from the api: (#{api_method}) :: #{response}"
204
+ end
205
+ return response
206
+ end
207
+
208
+
209
+ end
210
+ end
@@ -0,0 +1,91 @@
1
+ module KynetxAmApi
2
+ require 'oauth'
3
+ require 'json'
4
+
5
+ class Oauth
6
+
7
+ attr_accessor :request_token
8
+ attr_accessor :account_consumer
9
+ attr_accessor :api_consumer
10
+ attr_accessor :user
11
+ attr_accessor :access_token
12
+
13
+
14
+ def initialize(user=nil)
15
+ @user = KynetxAmApi::User.new(user)
16
+ if @user.oauth_verifier
17
+ access_tokens
18
+ end
19
+ end
20
+
21
+ def get_access_token
22
+ return @access_token if @access_token
23
+ return @access_token = OAuth::AccessToken.new(get_api_consumer, @user.access_token, @user.access_secret)
24
+ end
25
+
26
+ def get_request_token
27
+ return @request_token if @request_token
28
+ return @request_token = get_account_consumer.get_request_token
29
+ end
30
+
31
+
32
+ def self.accounts_server_url=(v)
33
+ @@accounts_server_url = v
34
+ end
35
+
36
+ def self.api_server_url=(v)
37
+ @@api_server_url = v
38
+ end
39
+
40
+ def self.consumer_key=(v)
41
+ @@consumer_key = v
42
+ end
43
+
44
+ def self.consumer_secret=(v)
45
+ @@consumer_secret = v
46
+ end
47
+
48
+ private
49
+
50
+
51
+ def access_tokens
52
+ access_request_token = OAuth::RequestToken.new(get_account_consumer, @user.request_token, @user.request_secret)
53
+ access_token_data = access_request_token.get_access_token :oauth_verifier => @user.oauth_verifier
54
+ @user.access_token = access_token_data.token
55
+ @user.access_secret = access_token_data.secret
56
+
57
+ end
58
+
59
+ def get_account_consumer
60
+ return @account_consumer if @account_consumer
61
+ return @account_consumer = OAuth::Consumer.new(@@consumer_key, @@consumer_secret, {
62
+ :site => @@accounts_server_url,
63
+ :scheme => :header,
64
+ :method => :get,
65
+ :request_token_path => "/oauth/request_token",
66
+ :access_token_path => "/oauth/access_token",
67
+ :authorize_path => "/oauth/authorize",
68
+ :oauth_version => "1.0a"
69
+ })
70
+
71
+
72
+ end
73
+
74
+
75
+ def get_api_consumer
76
+ return @api_consumer if @api_consumer
77
+ return @api_consumer = OAuth::Consumer.new(@@consumer_key, @@consumer_secret, {
78
+ :site => @@api_server_url,
79
+ :scheme => :header,
80
+ :method => :get,
81
+ :request_token_path => "/oauth/request_token",
82
+ :access_token_path => "/oauth/access_token",
83
+ :authorize_path => "/oauth/authorize",
84
+ :oauth_version => "1.0a"
85
+ })
86
+
87
+
88
+ end
89
+
90
+ end
91
+ end
@@ -0,0 +1,125 @@
1
+ module KynetxAmApi
2
+ #
3
+ # Simple wrapper to allow access to the OAuth user information. This also hold some basic user data like
4
+ # username, name and user id.
5
+ #
6
+ class User
7
+ # OAuth Request Token
8
+ attr_accessor :request_token
9
+ # OAuth Secret Token
10
+ attr_accessor :request_secret
11
+ # OAuth Verifieer
12
+ attr_accessor :oauth_verifier
13
+ # OAuth Access Token
14
+ attr_accessor :access_token
15
+ # OAuth Access Secret
16
+ attr_accessor :access_secret
17
+ # Kynetx User name
18
+ attr_accessor :username
19
+ # Kynetx User ID
20
+ attr_accessor :userid
21
+ # Full name of user
22
+ attr_accessor :name
23
+ # Current Application context.
24
+ attr_reader :current_application
25
+
26
+
27
+ #
28
+ # Accepts a hash that has the following entries.
29
+ # - :request_token
30
+ # - :request_secret
31
+ # - :oauth_verifier
32
+ # - :access_token
33
+ # - :access_secret
34
+ # - :username
35
+ # - :userid
36
+ # - :name
37
+ #
38
+
39
+ def initialize(attributes)
40
+ @request_token = attributes[:request_token]
41
+ @request_secret = attributes[:request_secret]
42
+ @oauth_verifier = attributes[:oauth_verifier]
43
+ @access_token = attributes[:access_token]
44
+ @access_secret = attributes[:access_secret]
45
+ @username = attributes[:username]
46
+ @userid = attributes[:userid]
47
+ @name = attributes[:name]
48
+ @current_applicaion = nil
49
+ end
50
+
51
+ #
52
+ # Returns the direct api to the Kynetx Application Manager.
53
+ #
54
+ def api
55
+ @api ||= KynetxAmApi::DirectApi.new({:access_token => @access_token, :access_secret => @access_secret})
56
+ return @api
57
+ end
58
+
59
+ #
60
+ # Read applications list
61
+ #
62
+ # - :offset => Start in list (not implemented)
63
+ # - :size => Number of application to list (not implemented)
64
+ #
65
+ # Returns a has with two keys
66
+ # - "apps" => Array Off Hashes with :appid , :role, :name, :created
67
+ # - "valid" => true
68
+ #
69
+ def applications(options = {})
70
+ @applications = api.get_applist if !@applications
71
+ @applications
72
+ end
73
+
74
+ #
75
+ # - :application_id => application_id
76
+ # - :version => Version of application to obtain
77
+ #
78
+ def find_application(options = {})
79
+ options[:version] ||= "development"
80
+ raise "Expecting :application_id" unless options[:application_id]
81
+
82
+ if @current_application && @current_application.application_id != options[:application_id]
83
+ @current_application = KynetxAmApi::Application.new(self, options[:application_id], options[:version])
84
+ else
85
+ @current_application ||= KynetxAmApi::Application.new(self, options[:application_id], options[:version])
86
+ end
87
+ return @current_application
88
+ end
89
+
90
+
91
+ def create_application(name, description="")
92
+ appid = api.get_appcreate["appid"]
93
+ @current_application = KynetxAmApi::Application.new(self, appid).create_initial_app(name, description)
94
+
95
+ return @current_application
96
+ end
97
+
98
+ def duplicate_application(application_id)
99
+ old_app = KynetxAmApi::Application.new(self, application_id)
100
+ new_app = create_application(old_app.name || "", "")
101
+ new_app.krl = old_app.krl
102
+ return new_app
103
+ end
104
+
105
+ def owns_current?
106
+ return false unless @current_application
107
+ return @current_application.owner["kynetxuserid"].to_i == self.userid.to_i
108
+ end
109
+
110
+ def to_h
111
+ return {
112
+ :access_secret => @access_secret,
113
+ :access_token => @access_token,
114
+ :request_token => @request_token,
115
+ :request_secret => @request_secret,
116
+ :oauth_verifier => @oauth_verifier,
117
+ :name => @name,
118
+ :userid => @userid,
119
+ :username => @username
120
+ }
121
+ end
122
+
123
+
124
+ end
125
+ end
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + "/../lib/kynetx_am_api.rb"
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kynetx_am_api
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 2
9
+ version: 0.1.2
10
+ platform: ruby
11
+ authors:
12
+ - Michael Farmer, Cid Dennis
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-05-03 00:00:00 -06:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: json
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: oauth
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ type: :runtime
43
+ version_requirements: *id002
44
+ - !ruby/object:Gem::Dependency
45
+ name: multipart-post
46
+ prerelease: false
47
+ requirement: &id003 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ type: :runtime
55
+ version_requirements: *id003
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ prerelease: false
59
+ requirement: &id004 !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ type: :development
67
+ version_requirements: *id004
68
+ description: " Using this gem you can access the Kynetx Application API. This api allows developers a way\n to create,update, delete rulesets. This gem also helps with the required OAuth communcations with\n the api server.\n"
69
+ email: cid@kynetx.com
70
+ executables: []
71
+
72
+ extensions: []
73
+
74
+ extra_rdoc_files:
75
+ - LICENSE
76
+ files:
77
+ - lib/kynetx_am_api/application.rb
78
+ - lib/kynetx_am_api/direct_api.rb
79
+ - lib/kynetx_am_api/oauth.rb
80
+ - lib/kynetx_am_api/user.rb
81
+ - lib/kynetx_am_api.rb
82
+ - rails/init.rb
83
+ - init.rb
84
+ - Rakefile
85
+ - LICENSE
86
+ has_rdoc: true
87
+ homepage: http://www.kynetx.com
88
+ licenses: []
89
+
90
+ post_install_message:
91
+ rdoc_options:
92
+ - --charset=UTF-8
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ segments:
100
+ - 0
101
+ version: "0"
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ requirements: []
110
+
111
+ rubyforge_project:
112
+ rubygems_version: 1.3.6
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: Simple Gem used to communicate with the Kynetx Application Manager.
116
+ test_files: []
117
+