cloudrail_si 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +3 -0
  3. data/examples/README.md +3 -0
  4. data/examples/simple/index.rb +11 -0
  5. data/lib/cloudrail_si.rb +41 -0
  6. data/lib/cloudrail_si/RedirectReceivers.rb +40 -0
  7. data/lib/cloudrail_si/Settings.rb +12 -0
  8. data/lib/cloudrail_si/errors/DetailErrors.rb +13 -0
  9. data/lib/cloudrail_si/errors/InternalError.rb +10 -0
  10. data/lib/cloudrail_si/errors/UserError.rb +11 -0
  11. data/lib/cloudrail_si/helpers/Helper.rb +151 -0
  12. data/lib/cloudrail_si/helpers/LimitedReadableStream.rb +55 -0
  13. data/lib/cloudrail_si/helpers/SequenceReadableStream.rb +59 -0
  14. data/lib/cloudrail_si/servicecode/InitSelfTest.rb +92 -0
  15. data/lib/cloudrail_si/servicecode/Interpreter.rb +213 -0
  16. data/lib/cloudrail_si/servicecode/Sandbox.rb +361 -0
  17. data/lib/cloudrail_si/servicecode/VarAddress.rb +11 -0
  18. data/lib/cloudrail_si/servicecode/commands/AwaitCodeRedirect.rb +48 -0
  19. data/lib/cloudrail_si/servicecode/commands/Break.rb +16 -0
  20. data/lib/cloudrail_si/servicecode/commands/CallFunc.rb +26 -0
  21. data/lib/cloudrail_si/servicecode/commands/Clone.rb +18 -0
  22. data/lib/cloudrail_si/servicecode/commands/Concat.rb +22 -0
  23. data/lib/cloudrail_si/servicecode/commands/Conditional.rb +27 -0
  24. data/lib/cloudrail_si/servicecode/commands/Create.rb +56 -0
  25. data/lib/cloudrail_si/servicecode/commands/Delete.rb +21 -0
  26. data/lib/cloudrail_si/servicecode/commands/Get.rb +25 -0
  27. data/lib/cloudrail_si/servicecode/commands/GetMimeType.rb +1005 -0
  28. data/lib/cloudrail_si/servicecode/commands/JumpRel.rb +18 -0
  29. data/lib/cloudrail_si/servicecode/commands/Pull.rb +34 -0
  30. data/lib/cloudrail_si/servicecode/commands/Push.rb +32 -0
  31. data/lib/cloudrail_si/servicecode/commands/Return.rb +16 -0
  32. data/lib/cloudrail_si/servicecode/commands/Set.rb +23 -0
  33. data/lib/cloudrail_si/servicecode/commands/Size.rb +26 -0
  34. data/lib/cloudrail_si/servicecode/commands/ThrowError.rb +17 -0
  35. data/lib/cloudrail_si/servicecode/commands/array/Uint8ToBase64.rb +25 -0
  36. data/lib/cloudrail_si/servicecode/commands/debug/Out.rb +24 -0
  37. data/lib/cloudrail_si/servicecode/commands/hash/md5.rb +29 -0
  38. data/lib/cloudrail_si/servicecode/commands/hash/sha1.rb +30 -0
  39. data/lib/cloudrail_si/servicecode/commands/http/RequestCall.rb +51 -0
  40. data/lib/cloudrail_si/servicecode/commands/json/Parse.rb +40 -0
  41. data/lib/cloudrail_si/servicecode/commands/json/Stringify.rb +21 -0
  42. data/lib/cloudrail_si/servicecode/commands/math/Floor.rb +27 -0
  43. data/lib/cloudrail_si/servicecode/commands/math/MathCombine.rb +35 -0
  44. data/lib/cloudrail_si/servicecode/commands/object/GetKeyArray.rb +21 -0
  45. data/lib/cloudrail_si/servicecode/commands/object/GetKeyValueArrays.rb +29 -0
  46. data/lib/cloudrail_si/servicecode/commands/stream/MakeJoinedStream.rb +38 -0
  47. data/lib/cloudrail_si/servicecode/commands/stream/MakeLimitedStream.rb +23 -0
  48. data/lib/cloudrail_si/servicecode/commands/stream/StreamToString.rb +25 -0
  49. data/lib/cloudrail_si/servicecode/commands/stream/StringToStream.rb +20 -0
  50. data/lib/cloudrail_si/servicecode/commands/string/Base64Encode.rb +42 -0
  51. data/lib/cloudrail_si/servicecode/commands/string/Format.rb +43 -0
  52. data/lib/cloudrail_si/servicecode/commands/string/IndexOf.rb +29 -0
  53. data/lib/cloudrail_si/servicecode/commands/string/LastIndexOf.rb +29 -0
  54. data/lib/cloudrail_si/servicecode/commands/string/Split.rb +29 -0
  55. data/lib/cloudrail_si/servicecode/commands/string/StringTransform.rb +29 -0
  56. data/lib/cloudrail_si/servicecode/commands/string/Substr.rb +30 -0
  57. data/lib/cloudrail_si/servicecode/commands/string/Substring.rb +30 -0
  58. data/lib/cloudrail_si/services/Facebook.rb +528 -0
  59. data/lib/cloudrail_si/services/FacebookPage.rb +310 -0
  60. data/lib/cloudrail_si/services/Foursquare.rb +314 -0
  61. data/lib/cloudrail_si/services/GitHub.rb +354 -0
  62. data/lib/cloudrail_si/services/GooglePlaces.rb +309 -0
  63. data/lib/cloudrail_si/services/GooglePlus.rb +367 -0
  64. data/lib/cloudrail_si/services/Instagram.rb +342 -0
  65. data/lib/cloudrail_si/services/LinkedIn.rb +363 -0
  66. data/lib/cloudrail_si/services/MicrosoftLive.rb +346 -0
  67. data/lib/cloudrail_si/services/Nexmo.rb +173 -0
  68. data/lib/cloudrail_si/services/Slack.rb +318 -0
  69. data/lib/cloudrail_si/services/Twilio.rb +173 -0
  70. data/lib/cloudrail_si/services/Twitter.rb +795 -0
  71. data/lib/cloudrail_si/services/Yahoo.rb +408 -0
  72. data/lib/cloudrail_si/services/Yelp.rb +389 -0
  73. data/lib/cloudrail_si/statistics/Statistics.rb +125 -0
  74. data/lib/cloudrail_si/types/Address.rb +9 -0
  75. data/lib/cloudrail_si/types/Charge.rb +33 -0
  76. data/lib/cloudrail_si/types/CloudMetaData.rb +19 -0
  77. data/lib/cloudrail_si/types/CreditCard.rb +76 -0
  78. data/lib/cloudrail_si/types/Date.rb +49 -0
  79. data/lib/cloudrail_si/types/DateOfBirth.rb +16 -0
  80. data/lib/cloudrail_si/types/Error.rb +21 -0
  81. data/lib/cloudrail_si/types/Location.rb +8 -0
  82. data/lib/cloudrail_si/types/POI.rb +17 -0
  83. data/lib/cloudrail_si/types/Refund.rb +25 -0
  84. data/lib/cloudrail_si/types/SandboxObject.rb +20 -0
  85. data/lib/cloudrail_si/types/SpaceAllocation.rb +13 -0
  86. data/lib/cloudrail_si/types/Subscription.rb +27 -0
  87. data/lib/cloudrail_si/types/SubscriptionPlan.rb +26 -0
  88. data/lib/cloudrail_si/types/Types.rb +43 -0
  89. data/lib/cloudrail_si/version.rb +3 -0
  90. metadata +205 -0
@@ -0,0 +1,18 @@
1
+ require_relative '../../helpers/Helper'
2
+
3
+ module CloudRailSi
4
+ module ServiceCode
5
+ class JumpRel
6
+ def get_identifier
7
+ 'jumpRel'
8
+ end
9
+
10
+ def execute(environment, parameters)
11
+ Helper.assert(parameters.length === 1)
12
+ relative_end_pos = Helper.resolve(environment, parameters[0])
13
+ Helper.assert(Helper.is_number(relative_end_pos))
14
+ environment.increment_current_service_code_line(relative_end_pos)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,34 @@
1
+ require_relative '../../helpers/Helper'
2
+
3
+ module CloudRailSi
4
+ module ServiceCode
5
+ class Pull
6
+ def get_identifier
7
+ 'pull'
8
+ end
9
+
10
+ def execute(environment, parameters)
11
+ Helper.assert(parameters.length >= 2 &&
12
+ Helper.is_var_address(parameters[0]) &&
13
+ Helper.is_var_address(parameters[1]))
14
+ target_var = parameters[0]
15
+ container_var = parameters[1]
16
+ container_var_parts = environment.decode_variable_address(container_var)
17
+ (2..parameters.length - 1).each do |i|
18
+ container_var_parts.push(Helper.resolve(environment, parameters[i]))
19
+ end
20
+ container = environment.get_variable(container_var_parts)
21
+
22
+ if (Helper.is_array(container))
23
+ entry = container.pop()
24
+ elsif (Helper.is_string(container))
25
+ entry = container[-1]
26
+ environment.set_variable(container_var_parts, container)
27
+ else
28
+ raise Errors::InternalError.new('Pull only works for lists and strings')
29
+ end
30
+ environment.set_variable(target_var, entry)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,32 @@
1
+ require_relative '../../helpers/Helper'
2
+
3
+ module CloudRailSi
4
+ module ServiceCode
5
+ class Push
6
+ def get_identifier
7
+ 'push'
8
+ end
9
+
10
+ def execute(environment, parameters)
11
+ Helper.assert(parameters.length >= 2 &&
12
+ Helper.is_var_address(parameters[0]))
13
+ target_var = parameters[0]
14
+ value = Helper.resolve(environment, parameters[1])
15
+ target_var_parts = environment.decode_variable_address(target_var)
16
+ (2..parameters.length - 1).each do |i|
17
+ target_var_parts.push(Helper.resolve(environment, parameters[i]))
18
+ end
19
+ container = environment.get_variable(target_var_parts)
20
+ if (Helper.is_array(container))
21
+ container.push(value)
22
+ elsif (Helper.is_object(container))
23
+ container[container.length] = value
24
+ elsif (Helper.is_string(container))
25
+ environment.set_variable(target_var_parts, container.concat(value.to_string()))
26
+ else
27
+ raise Errors::InternalError.new('Push only works for lists, objects and strings')
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../../helpers/Helper'
2
+
3
+ module CloudRailSi
4
+ module ServiceCode
5
+ class Return
6
+ def get_identifier
7
+ 'return'
8
+ end
9
+
10
+ def execute(environment, parameters)
11
+ Helper.assert(parameters.length == 0)
12
+ environment.code_line_stack[environment.code_line_stack.length - 1] = 9007199254740991
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../helpers/Helper'
2
+
3
+ module CloudRailSi
4
+ module ServiceCode
5
+ class Set
6
+ def get_identifier
7
+ 'set'
8
+ end
9
+
10
+ def execute(environment, parameters)
11
+ Helper.assert(parameters.length >= 2 &&
12
+ Helper.is_var_address(parameters[0]))
13
+ target_var = parameters[0]
14
+ value = Helper.resolve(environment, parameters[1])
15
+ target_var_parts = environment.decode_variable_address(target_var)
16
+ (2..parameters.length - 1).each do |i|
17
+ target_var_parts.push(Helper.resolve(environment, parameters[i]))
18
+ end
19
+ environment.set_variable(target_var_parts, value)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../../helpers/Helper'
2
+
3
+ module CloudRailSi
4
+ module ServiceCode
5
+ class Size
6
+ def get_identifier
7
+ 'size'
8
+ end
9
+
10
+ def execute(environment, parameters)
11
+ Helper.assert(parameters.length === 2 &&
12
+ Helper.is_var_address(parameters[0]) &&
13
+ Helper.is_var_address(parameters[1]))
14
+ target_var = parameters[0]
15
+ container = environment.get_variable(parameters[1])
16
+ size = -1
17
+ if (Helper.is_array(container) || Helper.is_string(container))
18
+ size = container.length
19
+ elsif (Helper.is_object(container))
20
+ size = container.keys.length
21
+ end
22
+ environment.set_variable(target_var, size)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ require_relative '../../helpers/Helper'
2
+
3
+ module CloudRailSi
4
+ module ServiceCode
5
+ class ThrowError
6
+ def get_identifier
7
+ 'throwError'
8
+ end
9
+
10
+ def execute(environment, parameters)
11
+ Helper.assert(parameters.length < 2)
12
+ error_obj = Helper.resolve(environment, parameters[0]) if (parameters.length > 0)
13
+ environment.set_thrown_error(error_obj)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../../../helpers/Helper'
2
+ require_relative '../string/Base64Encode'
3
+
4
+ module CloudRailSi
5
+ module ServiceCode
6
+ class Uint8ToBase64
7
+ def get_identifier
8
+ 'array.uint8ToBase64'
9
+ end
10
+
11
+ def execute(environment, parameters)
12
+ Helper.assert(parameters.length >= 2 &&
13
+ Helper.is_var_address(parameters[0]) &&
14
+ Helper.is_var_address(parameters[1]))
15
+ result_var = parameters[0]
16
+ source_array = Helper.resolve(environment, parameters[1])
17
+ url_safe = !!Helper.resolve(environment, parameters[2]) if (parameters.length > 2)
18
+ Helper.assert(Helper.is_array(source_array))
19
+ packed = source_array.pack('c*')
20
+ base64_string = Base64Encode.encode([packed].pack("H*"), false, url_safe)
21
+ environment.set_variable(result_var, base64_string)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ require_relative '../../../helpers/Helper'
2
+ require 'json'
3
+
4
+ module CloudRailSi
5
+ module ServiceCode
6
+ class Out
7
+ def get_identifier
8
+ 'debug.out'
9
+ end
10
+
11
+ def execute(environment, parameters)
12
+ Helper.assert(parameters.length >= 1)
13
+ str = ''
14
+ (0..parameters.length - 1).each do |i|
15
+ parameter = parameters[i]
16
+ part = Helper.resolve(environment, parameter)
17
+ part = part.to_json if (Helper.is_array(part) || Helper.is_object(part))
18
+ str += part.to_s
19
+ end
20
+ print str
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../../../helpers/Helper'
2
+ require 'digest'
3
+
4
+ module CloudRailSi
5
+ module ServiceCode
6
+ class Md5
7
+ def get_identifier
8
+ 'hash.md5'
9
+ end
10
+
11
+ def execute(environment, parameters)
12
+ Helper.assert(parameters.length == 2 &&
13
+ Helper.is_var_address(parameters[0]))
14
+ result_var = parameters[0]
15
+ message = Helper.resolve(environment, parameters[1])
16
+ Helper.assert(Helper.is_string(message))
17
+
18
+ buf = Digest::MD5.hexdigest(message)
19
+
20
+ number_array = []
21
+ (0..buf.length - 1).step(2).each do |i|
22
+ number_array.push(buf[i, 2].to_i(16))
23
+ end
24
+
25
+ environment.set_variable(result_var, number_array)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../../../helpers/Helper'
2
+ require 'hmac-sha1'
3
+
4
+ module CloudRailSi
5
+ module ServiceCode
6
+ class Sha1
7
+ def get_identifier
8
+ 'crypt.hmac.sha1'
9
+ end
10
+
11
+ def execute(environment, parameters)
12
+ Helper.assert(parameters.length == 3 &&
13
+ Helper.is_var_address(parameters[0]))
14
+ result_var = parameters[0]
15
+ key = Helper.resolve(environment, parameters[1])
16
+ message = Helper.resolve(environment, parameters[2])
17
+ Helper.assert(Helper.is_string(key) && Helper.is_string(message))
18
+ hmac = HMAC::SHA1.new(key)
19
+ hmac.update(message)
20
+ buf = hmac.hexdigest
21
+
22
+ number_array = []
23
+ (0..buf.length - 1).each do |i|
24
+ number_array.push(buf[i].to_i(16))
25
+ end
26
+ environment.set_variable(result_var, number_array)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../../../helpers/Helper'
2
+ require 'rack'
3
+
4
+ module CloudRailSi
5
+ module ServiceCode
6
+ class RequestCall
7
+ def get_identifier
8
+ return 'http.requestCall'
9
+ end
10
+
11
+ def execute(environment, parameters)
12
+ Helper.assert(parameters.length == 2 &&
13
+ Helper.is_var_address(parameters[0]) &&
14
+ Helper.is_var_address(parameters[1]))
15
+ result_var = parameters[0]
16
+ options = Helper.resolve(environment, parameters[1])
17
+ url = options['url']
18
+ method = options['method']
19
+ request_headers = options['requestHeaders']
20
+
21
+ request_body = options['requestBody']
22
+
23
+ Helper.assert(Helper.is_string(url) && Helper.is_string(method))
24
+ Helper.assert(request_headers.nil? || Helper.is_object(request_headers))
25
+ Helper.assert(request_body.nil? || Helper.is_stream(request_body))
26
+
27
+ res = Helper.make_request(url, request_headers, request_body, method)
28
+ response = {}
29
+ response['code'] = res.code.to_i
30
+ response['message'] = Rack::Utils::HTTP_STATUS_CODES[res.code.to_i],
31
+ response['responseHeaders'] = capitalize_headers(res.to_hash),
32
+ response['responseBody'] = res.body
33
+
34
+ Helper.log("response:")
35
+ Helper.log(response)
36
+ Helper.log("\n")
37
+
38
+ environment.set_variable(result_var, response)
39
+ end
40
+
41
+ def capitalize_headers(headers)
42
+ return nil if headers.nil?
43
+
44
+ ret = {}
45
+ headers.each do |key|
46
+ ret[Helper.upper_case_first_letter(key[0])] = headers[key[0]][0]
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../../helpers/Helper'
2
+ require 'json'
3
+
4
+ module CloudRailSi
5
+ module ServiceCode
6
+ class Parse
7
+ def get_identifier
8
+ return 'json.parse'
9
+ end
10
+
11
+ def execute(environment, parameters)
12
+ Helper.assert(parameters.length == 2 &&
13
+ Helper.is_var_address(parameters[0]))
14
+ result_var = parameters[0]
15
+ input = Helper.resolve(environment, parameters[1])
16
+ Helper.assert(Helper.is_stream(input) || Helper.is_string(input))
17
+ if (Helper.is_stream(input))
18
+ return Helper.dump_stream(input, lambda { |string_input|
19
+ Helper.assert(Helper.is_string(string_input))
20
+ obj = parse(string_input)
21
+ environment.set_variable(result_var, obj)
22
+ })
23
+ else
24
+ obj = parse(input)
25
+ environment.set_variable(result_var, obj)
26
+ end
27
+ end
28
+
29
+ def parse(input)
30
+ parsed = JSON.parse(input)
31
+ Helper.log("Parsed JSON: #{parsed}\n\n")
32
+ parsed.each do |key|
33
+ if Helper.is_boolean(parsed[key])
34
+ parsed[key] = parsed[key] ? 1 : 0 #TODO: this needs to work deeply; affects stripe
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '../../../helpers/Helper'
2
+ require 'json'
3
+
4
+ module CloudRailSi
5
+ module ServiceCode
6
+ class Stringify
7
+ def get_identifier
8
+ return 'json.stringify'
9
+ end
10
+
11
+ def execute(environment, parameters)
12
+ Helper.assert(parameters.length == 2 &&
13
+ Helper.is_var_address(parameters[0]))
14
+ result_var = parameters[0]
15
+ input = Helper.resolve(environment, parameters[1])
16
+ str = input.to_json
17
+ environment.set_variable(result_var, str)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../../../helpers/Helper'
2
+
3
+ module CloudRailSi
4
+ module ServiceCode
5
+ class Floor
6
+ def get_identifier
7
+ 'math.floor'
8
+ end
9
+
10
+ def execute(environment, parameters)
11
+ Helper.assert(parameters.length == 2 &&
12
+ Helper.is_var_address(parameters[0]))
13
+ result_var = parameters[0]
14
+ input = Helper.resolve(environment, parameters[1])
15
+ Helper.assert(Helper.is_number(input))
16
+ res = round_down(input).to_i
17
+ environment.set_variable(result_var, res)
18
+ end
19
+
20
+ # adapted from http://stackoverflow.com/questions/7090537/a-way-to-round-floats-down
21
+ private
22
+ def round_down(val, n=0)
23
+ n < 1 ? val.to_i.to_f : (val - 0.5 / 10**n).round(n)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../../../helpers/Helper'
2
+
3
+ module CloudRailSi
4
+ module ServiceCode
5
+ class MathCombine
6
+ def initialize(identifier, combine_function)
7
+ @identifier = identifier
8
+ @combine_function = combine_function
9
+ end
10
+
11
+ def get_identifier
12
+ @identifier
13
+ end
14
+
15
+ def execute(environment, parameters)
16
+ Helper.assert(parameters.length >= 2 &&
17
+ Helper.is_var_address(parameters[0]))
18
+ result_var = parameters[0]
19
+ elements = []
20
+
21
+ (1..(parameters.length - 1)).each do |i|
22
+ resolved = Helper.resolve(environment, parameters[i])
23
+ resolved = resolved.to_f if (Helper.is_string(resolved) && resolved.index('.'))
24
+ resolved = resolved.to_i if (Helper.is_string(resolved) && resolved.index('.').nil?)
25
+
26
+ Helper.assert(Helper.is_number(resolved))
27
+ elements.push(resolved)
28
+ end
29
+
30
+ res = @combine_function.call(elements)
31
+ environment.set_variable(result_var, res)
32
+ end
33
+ end
34
+ end
35
+ end