manywho 0.1.0

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.
Files changed (3) hide show
  1. checksums.yaml +15 -0
  2. data/lib/manywho.rb +555 -0
  3. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NjE2ZjlmMjlkMzc5ZDc2ODE5MDJkNmE1Y2Q0YzRiZmIzYWI0YTM3Ng==
5
+ data.tar.gz: !binary |-
6
+ NGE2ZmFiNzJlYjc0NjlmN2Q3MWNlYzAyZTRkMTFkMzA2NWFjZGQ0MQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZDMxMmFhZWNkMzI2MzQ2MDA2ZTY2N2YyMDk5YzhiNzNhYjhiOWM0NzM0NjE5
10
+ Yzc4OGU3YWRlNmEzYjM3ZDFjNWIxNGNiZDA3MzM0OTk1NjY0MWI0MDYzNGE5
11
+ NGJkNTNlNjBhYTUyMTI3YjZkOTBiMDQ4MWE4MTRiOGU5NTIxYTM=
12
+ data.tar.gz: !binary |-
13
+ MTI2ODNkNWIyYTExY2FlMmQ1YzUzOWM5NDU2ZTkxNDgwNGZmNWJiNDNjMGE0
14
+ NTQzMzA1YjE0MGFmNDZhYmMxOWNjNjUzMzUxZjcxY2MxMTRlMjQ5Y2Y2OTVk
15
+ YTBjOTM2ZmQ2YmRiMDE2MWZiZjMzNjMxNjNiZmQ2ZjQzMjYyY2Y=
data/lib/manywho.rb ADDED
@@ -0,0 +1,555 @@
1
+ =begin
2
+
3
+ Copyright 2013 Manywho, Inc.
4
+
5
+ Licensed under the Manywho License, Version 1.0 (the "License"); you may not use this
6
+ file except in compliance with the License.
7
+
8
+ You may obtain a copy of the License at: http://manywho.com/sharedsource
9
+
10
+ Unless required by applicable law or agreed to in writing, software distributed under
11
+ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
12
+ KIND, either express or implied. See the License for the specific language governing
13
+ permissions and limitations under the License.
14
+
15
+ =end
16
+
17
+ require "net/http"
18
+ require "net/https"
19
+ require "json"
20
+ require "date"
21
+ require "cgi"
22
+
23
+ HTTP = Net::HTTP.new("flow.manywho.com", 443)
24
+ HTTP.use_ssl = true
25
+
26
+ # OpenSSL verification
27
+ HTTP.verify_mode = OpenSSL::SSL::VERIFY_NONE
28
+
29
+ module Manywho
30
+ class Engine
31
+ # Initialize instance variables
32
+ def initialize
33
+ @TenantUID = false
34
+ @LoginToken = nil
35
+ end
36
+
37
+ # This method sets the Tenant Unique ID
38
+ def set_tenant(tenantUniqueID)
39
+ if ( is_valid_id(tenantUniqueID, "tenantUniqueId") )
40
+ @TenantUID = tenantUniqueID
41
+ end
42
+ end
43
+
44
+ # Tests if an id is valid, otherwise raises an error
45
+ def is_valid_id(idString, idType)
46
+ if (idString.is_a? String) && (idString =~ /^[-0-9a-f]+$/) &&
47
+ (idString.length == 36) && (idString.count("-") == 4)
48
+ return true
49
+ else
50
+ puts "Error: id is not valid (" + idType + "): " + idString.to_s
51
+ return false
52
+ end
53
+ end
54
+
55
+ # Tests if a request has completed successfully, otherwise raises an error
56
+ def is_ok(resp, url)
57
+ if (resp.code == "200") && (resp.body.length)
58
+ return true
59
+ else
60
+ puts "Error: something went wrong in the rsponse (" + url +")"
61
+ return false
62
+ end
63
+ end
64
+
65
+ # Tests if a value is of a specified class type, otherwise raises an error
66
+ def is_class(value, expectedClass, methodName, parameter)
67
+ if (value.class.to_s == expectedClass.to_s)
68
+ return true
69
+ else
70
+ puts "Error: parameter " + parameter.to_s + " of " + methodName + " must be a " + expectedClass.to_s + ". " +
71
+ "Parameter " + parameter.to_s + " was a " + value.class.to_s
72
+ return false
73
+ end
74
+ end
75
+
76
+ # Gets a FlowResponse object from the server for the provided ID
77
+ def get_FlowResponse(flowId)
78
+ if ( is_valid_id(flowId, "FlowId") )
79
+ resp, data = HTTP.get("/api/run/1/flow/" + flowId,
80
+ { "ManyWhoTenant" => @TenantUID , "content-type" => "application/json"} )
81
+ # If everything went well, return a new FlowResponse from the JSON object retrieved
82
+ if ( is_ok(resp, "/api/run/1/flow/" + flowId) )
83
+ parsedJSON = JSON.parse(resp.body)
84
+ return FlowResponse.new(parsedJSON)
85
+ end
86
+ end
87
+ return false
88
+ end
89
+
90
+ # Creates an EngineInitializationRequest to be sent to the server using get_EngineInitializationResponse
91
+ def create_EngineInitializationRequest(flowResponse, annotations = nil, inputs = [], mode = nil)
92
+ # Ensure that all of the arguments are valid
93
+ if ( is_class(flowResponse, FlowResponse, "create_EngineInitializationRequest", 1) ) &&
94
+ ( (annotations == nil) or (is_class( annotations, Hash, "create_EngineInitializationRequest", "annotations")) ) &&
95
+ ( (is_class( inputs, Array, "create_EngineInitializationRequest", "inputs")) ) &&
96
+ ( (mode == nil) or (is_class( mode, String, "create_EngineInitializationRequest", "mode")) )
97
+ # Create a hash to initialize the EngineInitializationRequest
98
+ engineInitializationJSON = { "flowId" => flowResponse.id,
99
+ "annotations" => annotations,
100
+ "inputs" => inputs,
101
+ "playerURL" => "https://flow.manywho.com/"+@TenantUID+"/play/myplayer",
102
+ "joinPlayerURL" => "https://flow.manywho.com/"+@TenantUID+"/play/myplayer",
103
+ "mode" => mode
104
+ }
105
+ return EngineInitializationRequest.new(engineInitializationJSON)
106
+ end
107
+ return false
108
+ end
109
+
110
+ # Gets an EngineInitializationResponse from the server, using a HTTP POST request.
111
+ def get_EngineInitializationResponse(engineInitializationRequest)
112
+ # Ensure that all of the arguments are valid
113
+ if ( is_class(engineInitializationRequest, EngineInitializationRequest, "get_EngineInitializationResponse", 1) )
114
+
115
+ # POST the EngineInitializationRequest
116
+ resp, data = HTTP.post("/api/run/1/",
117
+ engineInitializationRequest.to_json(),
118
+ { "ManyWhoTenant" => @TenantUID , "content-type" => "application/json"} )
119
+
120
+ # If everything went well, return a new EngineInitializationResponse created from the server's response
121
+ if ( is_ok(resp, "/api/run/1/") )
122
+ parsedJSON = JSON.parse(resp.body)
123
+ return EngineInitializationResponse.new(parsedJSON)
124
+ end
125
+ end
126
+ return false
127
+ end
128
+
129
+ # Logs in to the flow. Flows may require you to log in, this only has to be done once before executing the flow
130
+ def login(engineInitializationResponse, username, password)
131
+ # Ensure that all of the arguments are valid
132
+ if ( is_class(engineInitializationResponse, EngineInitializationResponse, "login", 1) ) &&
133
+ ( ( is_class(username, String, "login", 2) ) && (username.length) ) &&
134
+ ( ( is_class(password, String, "login", 3) ) && (password.length) )
135
+
136
+ # Create a logon request
137
+ loginRequest = {
138
+ "loginUrl" => engineInitializationResponse.authorizationContext.loginUrl, #engineInitializationResponse.authorizationContext["loginUrl"],
139
+ "username" => username,
140
+ "password" => password
141
+ }
142
+
143
+ # POST the login request
144
+ resp, data = HTTP.post("/api/run/1/authentication",
145
+ loginRequest.to_json(),
146
+ { "ManyWhoTenant" => @TenantUID , "content-type" => "application/json"} )
147
+
148
+ # If everything went well, set the logon token
149
+ if ( is_ok(resp, "/api/run/1/authentication") )
150
+ @LoginToken = resp.body[1...resp.body.length-1]
151
+ end
152
+ end
153
+ return false
154
+ end
155
+
156
+ # Create an EngineInvokeRequest to be posted to the server using get_EngineInvokeResponse
157
+ def create_EngineInvokeRequest(engineInitializationResponse, flowResponse=nil, invokeType="FORWARD")
158
+ # Ensure that all of the arguments are valid
159
+ if ( is_class(engineInitializationResponse, EngineInitializationResponse, "create_EngineInvokeRequest", 1) ) &&
160
+ ( is_class(invokeType, String, "create_EngineInvokeRequest", "invokeType") ) &&
161
+ ( (flowResponse == nil) || (is_class(flowResponse, FlowResponse, "create_EngineInvokeRequest", "flowResponse")) )
162
+
163
+ # If a flowResponse is provided, use the startMapElementId
164
+ # If no flowResponse is provided, such as the engine is syncing, use the currentMapElementId
165
+ if (flowResponse)
166
+ currentMapElementId = flowResponse.startMapElementId
167
+ elsif
168
+ currentMapElementId = engineInitializationResponse.currentMapElementId
169
+ end
170
+
171
+ # Create and return a new EngineInvokeRequest
172
+ engineInvokeJSON = {
173
+ "stateId" => engineInitializationResponse.stateId,
174
+ "stateToken" => engineInitializationResponse.stateToken,
175
+ "currentMapElementId" => currentMapElementId, #"7b2e4865-bd54-4073-b4f4-a4ec001afc9a", #### BODGE #### engineInitializationResponse.currentMapElementId,
176
+ "invokeType" => invokeType,
177
+ "geoLocation" => {
178
+ "latitude" => 0,
179
+ "longitude" => 0,
180
+ "accuracy" => 0,
181
+ "altitude" => 0,
182
+ "altitudeAccuracy" => 0,
183
+ "heading" => 0,
184
+ "speed" => 0
185
+ },
186
+ "mapElementInvokeRequest" => {
187
+ "selectedOutcomeId" => nil
188
+ },
189
+ "mode" => nil
190
+ }
191
+ return EngineInvokeRequest.new(engineInvokeJSON)
192
+ end
193
+ return false
194
+ end
195
+
196
+ # Create a EngineInvokeRequest from an engineInvokeResponse - such as when an outcome is selected, and a new EngineInvokeRequest is required
197
+ def recreate_EngineInvokeRequest(engineInvokeResponse, selectedOutcomeId, invokeType="FORWARD")
198
+ # Ensure that all of the arguments are valid
199
+ if ( is_class(engineInvokeResponse, EngineInvokeResponse, "recreate_EngineInvokeRequest", 1) ) &&
200
+ ( is_valid_id(selectedOutcomeId, "selectedOutcomeId") ) &&
201
+ ( is_class(invokeType, String, "create_EngineInvokeRequest", "invokeType") )
202
+
203
+ # Create and return a new EngineInvokeRequest
204
+ engineInvokeJSON = {
205
+ "stateId" => engineInvokeResponse.stateId,
206
+ "stateToken" => engineInvokeResponse.stateToken,
207
+ "currentMapElementId" => engineInvokeResponse.currentMapElementId,
208
+ "invokeType" => invokeType,
209
+ "geoLocation" => {
210
+ "latitude" => 0,
211
+ "longitude" => 0,
212
+ "accuracy" => 0,
213
+ "altitude" => 0,
214
+ "altitudeAccuracy" => 0,
215
+ "heading" => 0,
216
+ "speed" => 0
217
+ },
218
+ "mapElementInvokeRequest" => {
219
+ "selectedOutcomeId" => selectedOutcomeId
220
+ },
221
+ "mode" => nil
222
+ }
223
+ return EngineInvokeRequest.new(engineInvokeJSON)
224
+ end
225
+ return false
226
+ end
227
+
228
+ # Post the EngineInvokeRequest, and return the EngineInvokeResponse
229
+ def get_EngineInvokeResponse(engineInvokeRequest)
230
+ # Ensure that all arguments are valid
231
+ if ( is_class(engineInvokeRequest, EngineInvokeRequest, "get_EngineInvokeResponse", 1) )
232
+ if (@LoginToken)
233
+ # POST the EngineInvokeRequest, with authentication
234
+ resp, data = HTTP.post("/api/run/1/state/" + engineInvokeRequest.stateId,
235
+ engineInvokeRequest.to_json,
236
+ { "ManyWhoTenant" => @TenantUID , "content-type" => "application/json", "Authorization" => @LoginToken} )
237
+ else
238
+ # POST the EngineInvokeRequest, without authentication
239
+ resp, data = HTTP.post("/api/run/1/state/" + engineInvokeRequest.stateId,
240
+ engineInvokeRequest.to_json,
241
+ { "ManyWhoTenant" => @TenantUID , "content-type" => "application/json"} )
242
+ end
243
+
244
+ # If everything went well, return a new EngineInvokeResponse created from the server's response
245
+ if ( is_ok(resp, "/api/run/1/state/" + engineInvokeRequest.stateId) )
246
+ parsedJSON = JSON.parse(resp.body)
247
+ return EngineInvokeResponse.new(parsedJSON)
248
+ end
249
+ end
250
+ return false
251
+ end
252
+
253
+ # Select an outcomeResponse, and get the next EngineInvokeResponse
254
+ def select_OutcomeResponse(engineInvokeResponse, outcomeResponseDeveloperName, invokeType="FORWARD")
255
+ # Ensure that all arguments are valid
256
+ if ( is_class(engineInvokeResponse, EngineInvokeResponse, "select_OutcomeResponse", 1) ) &&
257
+ ( is_class(outcomeResponseDeveloperName, String, "select_OutcomeResponse", 2) ) &&
258
+ ( is_class(invokeType, String, "select_OutcomeResponse", "invokeType") )
259
+
260
+ # Get the ID of the selected outcome, using the outcome's developerName
261
+ selectedOutcomeId = nil
262
+ engineInvokeResponse.mapElementInvokeResponses[0].outcomeResponses.each do |outcomeResp|
263
+ if (outcomeResp.developerName == outcomeResponseDeveloperName)
264
+ selectedOutcomeId = outcomeResp.id
265
+ end
266
+ end
267
+
268
+ # Create the EngineInvokeRequest from the EngineInvokeResponse
269
+ engineInvokeRequest = recreate_EngineInvokeRequest(engineInvokeResponse, selectedOutcomeId)
270
+
271
+ # Return a new EngineInvokeResponse, created from data received from the server
272
+ return get_EngineInvokeResponse( engineInvokeRequest )
273
+ end
274
+ return false
275
+ end
276
+
277
+ # Load a flow, given the tenantId, flowId and logon details the first EngineInvokeResponse will be returned
278
+ def load_flow(tenant, flowId, username="", password="")
279
+ # Ensure all the arguments are valid
280
+ if ( is_valid_id(tenant, "tenantId") ) &&
281
+ ( is_valid_id(flowId, "flowId") ) &&
282
+ ( is_class(username, String, "load_flow", "username") ) &&
283
+ ( is_class(password, String, "load_flow", "password") )
284
+ # Set the tenant
285
+ set_tenant(tenant)
286
+
287
+ # Get the FlowResponse for the flow by id
288
+ flowResponse = get_FlowResponse(flowId)
289
+
290
+ # Create an EngineInitializationRequest, and use it to retreive an EngineInitializationResponse from the server
291
+ engineInitializationResponse = get_EngineInitializationResponse(
292
+ create_EngineInitializationRequest( flowResponse )
293
+ )
294
+
295
+ # If required to log in to the flow
296
+ if (engineInitializationResponse.statusCode == "401")
297
+ # If login details, attempt to login
298
+ if (username != "") && (password != "")
299
+ login(engineInitializationResponse, username, password)
300
+ else
301
+ return "You need to login to run this flow: " + engineInitializationResponse.authorizationContext.loginUrl#["loginUrl"]
302
+ end
303
+ end
304
+
305
+ # Get a new EngineInvokeResponse from the server
306
+ return engineInvokeResponse = get_EngineInvokeResponse(
307
+ create_EngineInvokeRequest(engineInitializationResponse, flowResponse=flowResponse) )
308
+ end
309
+ return false
310
+ end
311
+ end
312
+
313
+ # Initialized with a JSON hash, each value of the hash is converted into an instance variable. Can also be easily converted into a JSON string
314
+ class MyStruct
315
+ def to_json(options= {})
316
+ hash = {}
317
+ self.instance_variables.each do |var|
318
+ hash[var[1...var.length]] = self.instance_variable_get var
319
+ end
320
+ return hash.to_json
321
+ end
322
+
323
+ # Set instance values from the hash
324
+ def initialize(jsonValue)
325
+ if (jsonValue != nil)
326
+ jsonValue.each do
327
+ |k,v| self.instance_variable_set("@#{k}", v)
328
+ end
329
+ end
330
+ end
331
+ end
332
+
333
+ class FlowResponse < MyStruct
334
+ attr_accessor :dateCreated, :dateModified, :userCreated,
335
+ :userModified, :userOwner, :alertEmail,
336
+ :editingToken, :id, :developerName,
337
+ :developerSummary, :isActive, :startMapElementId,
338
+ :authorization
339
+
340
+ def initialize(jsonValue)
341
+ super(jsonValue)
342
+ @id = FlowIdentifier.new(@id)
343
+ end
344
+ end
345
+
346
+ class EngineInitializationRequest < MyStruct
347
+ attr_accessor :flowId, :annotations, :inputs,
348
+ :mode
349
+
350
+ def initialize(jsonValue)
351
+ super(jsonValue)
352
+ #@flowId = FlowIdentifier.new(@flowId)
353
+ if (@inputs != nil)
354
+ endArray = []
355
+ @inputs.each do |input|
356
+ endArray += [EngineValue(input)]
357
+ end
358
+ @inputs = endArray
359
+ end
360
+
361
+ end
362
+ end
363
+
364
+ class EngineInitializationResponse < MyStruct
365
+ attr_accessor :stateId, :stateToken, :currentMapElementId,
366
+ :currentMapElementId, :currentStreamId, :statusCode,
367
+ :authorizationContext
368
+ def initialize(jsonValue)
369
+ super(jsonValue)
370
+ @authorizationContext = AuthorizationContext.new(@authorizationContext)
371
+ end
372
+ end
373
+
374
+ class EngineInvokeRequest < MyStruct
375
+ attr_accessor :stateId, :stateToken, :currentMapElementId,
376
+ :invokeType, :annotations, :geoLocatoin,
377
+ :mapElementInvokeRequest, :mode
378
+ def initialize(jsonValue)
379
+ super(jsonValue)
380
+ @geoLocation = GeoLocation.new(@geoLocation)
381
+ @mapElementInvokeRequest = MapElementInvokeResponse.new(@mapElementInvokeRequest)
382
+ end
383
+ end
384
+
385
+ class MapElementInvokeRequest < MyStruct
386
+ attr_accessor :selectedOutcomeId
387
+ end
388
+
389
+ class EngineInvokeResponse < MyStruct
390
+ attr_accessor :stateId, :stateToken, :currentMapElementId,
391
+ :invokeType, :annotations, :mapElementInvokeResponses,
392
+ :stateLog, :preCommitStateValues, :stateValues,
393
+ :outputs, :statusCode, :runFlowUrl,
394
+ :joinFlowUrl, :authorizationContext
395
+ def initialize(jsonValue)
396
+ super(jsonValue)
397
+ if (@mapElementInvokeResponses != nil)
398
+ endArray = []
399
+ @mapElementInvokeResponses.each do |invokeResponse|
400
+ endArray += [MapElementInvokeResponse.new(invokeResponse)]
401
+ end
402
+ @mapElementInvokeResponses = endArray
403
+ end
404
+ if (@preCommitStateValues != nil)
405
+ endArray = []
406
+ @preCommitStateValues.each do |preComitStateValue|
407
+ endArray += [EngineValue.new(preComitStateValue)]
408
+ end
409
+ @preCommitStateValues = endArray
410
+ end
411
+ if (@stateValues != nil)
412
+ endArray = []
413
+ @stateValues.each do |stateValue|
414
+ endArray += [EngineValue.new(stateValue)]
415
+ end
416
+ @stateValues = endArray
417
+ end
418
+ if (@outputs != nil)
419
+ endArray = []
420
+ @outputs.each do |output|
421
+ endArray += [EngineValue.new(output)]
422
+ end
423
+ @outputs = endArray
424
+ end
425
+ @authorizationContext = AuthorizationContext.new(@authorizationContext)
426
+ end
427
+ end
428
+
429
+ class MapElementInvokeResponse < MyStruct
430
+ attr_accessor :mapElementId, :developerName, :pageResponse,
431
+ :outcomeResponses, :rootFaults
432
+
433
+ def initialize(jsonValue)
434
+ super(jsonValue)
435
+ @pageResponse = PageResponse.new(@pageResponse)
436
+ if (@outcomeResponses != nil)
437
+ endArray = []
438
+ @outcomeResponses.each do |outputResponse|
439
+ endArray += [OutcomeResponse.new(outputResponse)]
440
+ end
441
+ @outcomeResponses = endArray
442
+ end
443
+ end
444
+ end
445
+
446
+ class PageResponse < MyStruct
447
+ attr_accessor :label, :pageContainerResponses, :pageComponentResponses,
448
+ :pageContainerDataResponses, :pageComponentDataResponses, :order,
449
+ :outcomeResponses, :rootFaults
450
+ def initialize(jsonValue)
451
+ super(jsonValue)
452
+ if (@pageContainerResponses != nil)
453
+ endArray = []
454
+ @pageContainerResponses.each do |pContainer|
455
+ endArray += [PageContainerResponse.new(pContainer)]
456
+ end
457
+ @pageContainerResponses = endArray
458
+ end
459
+ if (@pageComponentResponses != nil)
460
+ endArray = []
461
+ @pageComponentResponses.each do |pComponent|
462
+ endArray += [PageComponentResponse.new(pComponent)]
463
+ end
464
+ @pageComponentResponses = endArray
465
+ end
466
+ if (@pageContainerDataResponses != nil)
467
+ endArray = []
468
+ @pageContainerDataResponses.each do |pContainerData|
469
+ endArray += [PageContainerDataResponse.new(pContainerData)]
470
+ end
471
+ @pageContainerDataResponses = endArray
472
+ end
473
+ if (@pageComponentDataResponses != nil)
474
+ endArray = []
475
+ @pageComponentDataResponses.each do |pComponentData|
476
+ endArray += [PageComponentDataResponse.new(pComponentData)]
477
+ end
478
+ @pageComponentDataResponses = endArray
479
+ end
480
+ if (@outcomeResponses != nil)
481
+ endArray = []
482
+ @outcomeResponses.each do |outcomeResponse|
483
+ endArray += [OutcomeResponse.new(outcomeResponse)]
484
+ end
485
+ @outcomeResponses = endArray
486
+ end
487
+ end
488
+ end
489
+
490
+ class PageContainerResponse < MyStruct
491
+ attr_accessor :id, :containerType, :developerName,
492
+ :label, :pageContainerResponses, :order
493
+ def initialize(jsonValue)
494
+ super(jsonValue)
495
+ if (@pageContainerResponses != nil)
496
+ endArray = []
497
+ @pageContainerResponses.each do |pContainer|
498
+ endArray += [PageContainerResponse.new(pContainer)]
499
+ end
500
+ @pageContainerResponses = endArray
501
+ end
502
+ end
503
+ end
504
+
505
+ class PageComponentResponse < MyStruct
506
+ attr_accessor :pageContainerDeveloperName, :pageContainerId, :id,
507
+ :developerName, :componentType, :contentType,
508
+ :label, :columns, :size,
509
+ :maxSize, :height, :width,
510
+ :hintValue, :helpInfo, :order,
511
+ :isMultiSelect, :hasEvents
512
+ end
513
+
514
+ class PageComponentDataResponse < MyStruct
515
+ attr_accessor :pageComponentId, :isEnabled, :isEditable,
516
+ :isRequired, :isVisible, :objectData,
517
+ :objectDataRequest, :contentValue, :content,
518
+ :isValid, :validationMessage, :tags
519
+ end
520
+
521
+ class PageContainerDataResponse < MyStruct
522
+ attr_accessor :pageContainerId, :isEnabled, :isVisible,
523
+ :tags
524
+ end
525
+
526
+ class OutcomeResponse < MyStruct
527
+ attr_accessor :id, :developerName, :label,
528
+ :pageActionBinding, :formElementBindingId, :order
529
+ end
530
+
531
+ class GeoLocation < MyStruct
532
+ attr_accessor :latitude, :longitude, :accuracy,
533
+ :altitude, :altitudeAccuracy, :heading,
534
+ :speed
535
+ end
536
+
537
+ class FlowIdentifier < MyStruct
538
+ attr_accessor :id, :versionId
539
+ end
540
+
541
+ class AuthorizationContext < MyStruct
542
+ attr_accessor :id, :directoryId, :loginUrl
543
+ end
544
+
545
+ class AuthorizationRequest < MyStruct
546
+ attr_accessor :loginUrl, :username, :password,
547
+ :token
548
+ end
549
+
550
+ class EngineValue < MyStruct
551
+ attr_accessor :id, :typeElementId, :typeElementEntryId,
552
+ :typeElementDeveloperName, :typeElementEntryDeveloperName, :contentValue,
553
+ :contentType, :id
554
+ end
555
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: manywho
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Eddie Ellams
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-03 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Allows Manywho flows to be run within Ruby
14
+ email: eddie.ellams@manywho.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/manywho.rb
20
+ homepage: ''
21
+ licenses:
22
+ - Manywho License, Version 1.0
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubyforge_project:
40
+ rubygems_version: 2.0.7
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: Manywho gem
44
+ test_files: []