cloudrail_si 0.1.5

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 (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