kinetic_sdk 0.1.1
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.
- checksums.yaml +7 -0
- data/GettingStarted.md +64 -0
- data/README.md +383 -0
- data/bin/console +12 -0
- data/bin/setup +8 -0
- data/gems/kontena-websocket-client-0.1.1/Gemfile +4 -0
- data/gems/kontena-websocket-client-0.1.1/LICENSE +190 -0
- data/gems/kontena-websocket-client-0.1.1/README.md +138 -0
- data/gems/kontena-websocket-client-0.1.1/Rakefile +6 -0
- data/gems/kontena-websocket-client-0.1.1/benchmark/benchmark-client.rb +45 -0
- data/gems/kontena-websocket-client-0.1.1/benchmark/benchmark-em.rb +66 -0
- data/gems/kontena-websocket-client-0.1.1/benchmark/benchmark.rb +161 -0
- data/gems/kontena-websocket-client-0.1.1/benchmark/benchmark.sh +17 -0
- data/gems/kontena-websocket-client-0.1.1/benchmark/websocket-echo-server.go +207 -0
- data/gems/kontena-websocket-client-0.1.1/examples/websocket-echo-client.rb +80 -0
- data/gems/kontena-websocket-client-0.1.1/kontena-websocket-client.gemspec +24 -0
- data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/client/connection.rb +119 -0
- data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/client/version.rb +13 -0
- data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/client.rb +848 -0
- data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/error.rb +81 -0
- data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/logging.rb +55 -0
- data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/openssl_patch.rb +10 -0
- data/gems/kontena-websocket-client-0.1.1/lib/kontena-websocket-client.rb +15 -0
- data/gems/mime-types-3.1/Code-of-Conduct.rdoc +74 -0
- data/gems/mime-types-3.1/Contributing.rdoc +130 -0
- data/gems/mime-types-3.1/History.rdoc +658 -0
- data/gems/mime-types-3.1/Licence.rdoc +25 -0
- data/gems/mime-types-3.1/Manifest.txt +31 -0
- data/gems/mime-types-3.1/README.rdoc +202 -0
- data/gems/mime-types-3.1/Rakefile +254 -0
- data/gems/mime-types-3.1/lib/mime/type/columnar.rb +55 -0
- data/gems/mime-types-3.1/lib/mime/type.rb +573 -0
- data/gems/mime-types-3.1/lib/mime/types/_columnar.rb +135 -0
- data/gems/mime-types-3.1/lib/mime/types/cache.rb +56 -0
- data/gems/mime-types-3.1/lib/mime/types/columnar.rb +1 -0
- data/gems/mime-types-3.1/lib/mime/types/container.rb +30 -0
- data/gems/mime-types-3.1/lib/mime/types/deprecations.rb +32 -0
- data/gems/mime-types-3.1/lib/mime/types/full.rb +17 -0
- data/gems/mime-types-3.1/lib/mime/types/loader.rb +148 -0
- data/gems/mime-types-3.1/lib/mime/types/logger.rb +37 -0
- data/gems/mime-types-3.1/lib/mime/types/registry.rb +81 -0
- data/gems/mime-types-3.1/lib/mime/types.rb +228 -0
- data/gems/mime-types-3.1/lib/mime-types.rb +1 -0
- data/gems/mime-types-3.1/test/bad-fixtures/malformed +9 -0
- data/gems/mime-types-3.1/test/fixture/json.json +1 -0
- data/gems/mime-types-3.1/test/fixture/old-data +9 -0
- data/gems/mime-types-3.1/test/fixture/yaml.yaml +55 -0
- data/gems/mime-types-3.1/test/minitest_helper.rb +13 -0
- data/gems/mime-types-3.1/test/test_mime_type.rb +603 -0
- data/gems/mime-types-3.1/test/test_mime_types.rb +161 -0
- data/gems/mime-types-3.1/test/test_mime_types_cache.rb +109 -0
- data/gems/mime-types-3.1/test/test_mime_types_class.rb +155 -0
- data/gems/mime-types-3.1/test/test_mime_types_lazy.rb +43 -0
- data/gems/mime-types-3.1/test/test_mime_types_loader.rb +32 -0
- data/gems/mime-types-data-3.2016.0521/Code-of-Conduct.md +75 -0
- data/gems/mime-types-data-3.2016.0521/Contributing.md +157 -0
- data/gems/mime-types-data-3.2016.0521/History.md +351 -0
- data/gems/mime-types-data-3.2016.0521/Licence.md +25 -0
- data/gems/mime-types-data-3.2016.0521/Manifest.txt +18 -0
- data/gems/mime-types-data-3.2016.0521/README.md +61 -0
- data/gems/mime-types-data-3.2016.0521/Rakefile +80 -0
- data/gems/mime-types-data-3.2016.0521/data/mime-types.json +1 -0
- data/gems/mime-types-data-3.2016.0521/data/mime.content_type.column +1964 -0
- data/gems/mime-types-data-3.2016.0521/data/mime.docs.column +1964 -0
- data/gems/mime-types-data-3.2016.0521/data/mime.encoding.column +1964 -0
- data/gems/mime-types-data-3.2016.0521/data/mime.flags.column +1964 -0
- data/gems/mime-types-data-3.2016.0521/data/mime.friendly.column +1964 -0
- data/gems/mime-types-data-3.2016.0521/data/mime.pext.column +1964 -0
- data/gems/mime-types-data-3.2016.0521/data/mime.use_instead.column +1964 -0
- data/gems/mime-types-data-3.2016.0521/data/mime.xrefs.column +1964 -0
- data/gems/mime-types-data-3.2016.0521/lib/mime/types/data.rb +21 -0
- data/gems/mime-types-data-3.2016.0521/lib/mime-types-data.rb +3 -0
- data/gems/multipart-post-2.0.0/Gemfile +14 -0
- data/gems/multipart-post-2.0.0/History.txt +60 -0
- data/gems/multipart-post-2.0.0/Manifest.txt +9 -0
- data/gems/multipart-post-2.0.0/README.md +77 -0
- data/gems/multipart-post-2.0.0/Rakefile +9 -0
- data/gems/multipart-post-2.0.0/lib/composite_io.rb +108 -0
- data/gems/multipart-post-2.0.0/lib/multipart_post.rb +9 -0
- data/gems/multipart-post-2.0.0/lib/multipartable.rb +29 -0
- data/gems/multipart-post-2.0.0/lib/net/http/post/multipart.rb +27 -0
- data/gems/multipart-post-2.0.0/lib/parts.rb +96 -0
- data/gems/multipart-post-2.0.0/multipart-post.gemspec +22 -0
- data/gems/multipart-post-2.0.0/test/multibyte.txt +1 -0
- data/gems/multipart-post-2.0.0/test/net/http/post/test_multipart.rb +110 -0
- data/gems/multipart-post-2.0.0/test/test_composite_io.rb +115 -0
- data/gems/multipart-post-2.0.0/test/test_parts.rb +86 -0
- data/gems/parallel-1.12.1/MIT-LICENSE.txt +20 -0
- data/gems/parallel-1.12.1/lib/parallel/processor_count.rb +93 -0
- data/gems/parallel-1.12.1/lib/parallel/version.rb +3 -0
- data/gems/parallel-1.12.1/lib/parallel.rb +500 -0
- data/gems/ruby-progressbar-1.9.0/LICENSE.txt +19 -0
- data/gems/ruby-progressbar-1.9.0/README.md +38 -0
- data/gems/ruby-progressbar-1.9.0/Rakefile +2 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/base.rb +183 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/calculators/length.rb +99 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/calculators/running_average.rb +9 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components/bar.rb +96 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components/percentage.rb +29 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components/rate.rb +43 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components/time.rb +107 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components/title.rb +13 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components.rb +5 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/errors/invalid_progress_error.rb +4 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/format/formatter.rb +27 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/format/molecule.rb +59 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/format/string.rb +36 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/format.rb +3 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/output.rb +68 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/outputs/non_tty.rb +47 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/outputs/null.rb +33 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/outputs/tty.rb +32 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/progress.rb +118 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/refinements/enumerator.rb +25 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/refinements.rb +1 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/throttle.rb +25 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/time.rb +30 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/timer.rb +72 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/version.rb +3 -0
- data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar.rb +18 -0
- data/gems/slugify-1.0.7/README +18 -0
- data/gems/slugify-1.0.7/lib/slugify.rb +1012 -0
- data/gems/slugify-1.0.7/lib/slugify_string.rb +11 -0
- data/gems/slugify-1.0.7/tests/slugify_test.rb +116 -0
- data/gems/slugify-1.0.7/tests/string_slugify_test.rb +23 -0
- data/gems/websocket-driver-0.6.5/CHANGELOG.md +123 -0
- data/gems/websocket-driver-0.6.5/LICENSE.md +22 -0
- data/gems/websocket-driver-0.6.5/README.md +369 -0
- data/gems/websocket-driver-0.6.5/examples/tcp_server.rb +28 -0
- data/gems/websocket-driver-0.6.5/ext/websocket-driver/Makefile +264 -0
- data/gems/websocket-driver-0.6.5/ext/websocket-driver/WebsocketMaskService.java +55 -0
- data/gems/websocket-driver-0.6.5/ext/websocket-driver/extconf.rb +4 -0
- data/gems/websocket-driver-0.6.5/ext/websocket-driver/websocket_mask.bundle +0 -0
- data/gems/websocket-driver-0.6.5/ext/websocket-driver/websocket_mask.c +41 -0
- data/gems/websocket-driver-0.6.5/ext/websocket-driver/websocket_mask.o +0 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/client.rb +140 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/draft75.rb +102 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/draft76.rb +96 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/event_emitter.rb +54 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/headers.rb +45 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/hybi/frame.rb +20 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/hybi/message.rb +31 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/hybi.rb +406 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/proxy.rb +68 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/server.rb +80 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver/stream_reader.rb +55 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/driver.rb +199 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/http/headers.rb +112 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/http/request.rb +45 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/http/response.rb +29 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/http.rb +15 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/mask.rb +14 -0
- data/gems/websocket-driver-0.6.5/lib/websocket/websocket_mask.rb +2 -0
- data/gems/websocket-driver-0.6.5/lib/websocket_mask.bundle +0 -0
- data/gems/websocket-driver-0.6.5-java/CHANGELOG.md +123 -0
- data/gems/websocket-driver-0.6.5-java/LICENSE.md +22 -0
- data/gems/websocket-driver-0.6.5-java/README.md +369 -0
- data/gems/websocket-driver-0.6.5-java/examples/tcp_server.rb +28 -0
- data/gems/websocket-driver-0.6.5-java/ext/websocket-driver/WebsocketMaskService.java +55 -0
- data/gems/websocket-driver-0.6.5-java/ext/websocket-driver/extconf.rb +4 -0
- data/gems/websocket-driver-0.6.5-java/ext/websocket-driver/websocket_mask.c +41 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/client.rb +140 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/draft75.rb +102 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/draft76.rb +96 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/event_emitter.rb +54 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/headers.rb +45 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/hybi/frame.rb +20 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/hybi/message.rb +31 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/hybi.rb +406 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/proxy.rb +68 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/server.rb +80 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/stream_reader.rb +55 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/driver.rb +199 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/http/headers.rb +112 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/http/request.rb +45 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/http/response.rb +29 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/http.rb +15 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/mask.rb +14 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket/websocket_mask.rb +2 -0
- data/gems/websocket-driver-0.6.5-java/lib/websocket_mask.jar +0 -0
- data/gems/websocket-extensions-0.1.3/CHANGELOG.md +15 -0
- data/gems/websocket-extensions-0.1.3/LICENSE.md +20 -0
- data/gems/websocket-extensions-0.1.3/README.md +313 -0
- data/gems/websocket-extensions-0.1.3/lib/websocket/extensions/parser.rb +111 -0
- data/gems/websocket-extensions-0.1.3/lib/websocket/extensions.rb +181 -0
- data/lib/kinetic-sdk.rb +1 -0
- data/lib/kinetic_sdk/bridgehub/bridgehub-sdk.rb +80 -0
- data/lib/kinetic_sdk/bridgehub/lib/access_keys.rb +67 -0
- data/lib/kinetic_sdk/bridgehub/lib/bridge.rb +69 -0
- data/lib/kinetic_sdk/discussions/discussions-sdk.rb +165 -0
- data/lib/kinetic_sdk/discussions/lib/discussions.rb +107 -0
- data/lib/kinetic_sdk/discussions/lib/invitations.rb +120 -0
- data/lib/kinetic_sdk/discussions/lib/messages.rb +190 -0
- data/lib/kinetic_sdk/discussions/lib/meta.rb +14 -0
- data/lib/kinetic_sdk/discussions/lib/participants.rb +64 -0
- data/lib/kinetic_sdk/discussions/lib/related_items.rb +54 -0
- data/lib/kinetic_sdk/discussions/lib/websockets.rb +96 -0
- data/lib/kinetic_sdk/filehub/filehub-sdk.rb +80 -0
- data/lib/kinetic_sdk/filehub/lib/access_keys.rb +67 -0
- data/lib/kinetic_sdk/filehub/lib/filestores.rb +67 -0
- data/lib/kinetic_sdk/request_ce/lib/attribute_definitions.rb +153 -0
- data/lib/kinetic_sdk/request_ce/lib/bridges.rb +66 -0
- data/lib/kinetic_sdk/request_ce/lib/categories.rb +34 -0
- data/lib/kinetic_sdk/request_ce/lib/datastore_form.rb +110 -0
- data/lib/kinetic_sdk/request_ce/lib/datastore_submissions.rb +157 -0
- data/lib/kinetic_sdk/request_ce/lib/form.rb +99 -0
- data/lib/kinetic_sdk/request_ce/lib/form_types.rb +51 -0
- data/lib/kinetic_sdk/request_ce/lib/jwt.rb +55 -0
- data/lib/kinetic_sdk/request_ce/lib/kapp.rb +93 -0
- data/lib/kinetic_sdk/request_ce/lib/meta.rb +14 -0
- data/lib/kinetic_sdk/request_ce/lib/oauth.rb +37 -0
- data/lib/kinetic_sdk/request_ce/lib/security_policy_definitions.rb +157 -0
- data/lib/kinetic_sdk/request_ce/lib/space.rb +89 -0
- data/lib/kinetic_sdk/request_ce/lib/submissions.rb +215 -0
- data/lib/kinetic_sdk/request_ce/lib/system_api.rb +69 -0
- data/lib/kinetic_sdk/request_ce/lib/teams.rb +113 -0
- data/lib/kinetic_sdk/request_ce/lib/users.rb +245 -0
- data/lib/kinetic_sdk/request_ce/lib/webhook_jobs.rb +142 -0
- data/lib/kinetic_sdk/request_ce/lib/webhooks.rb +192 -0
- data/lib/kinetic_sdk/request_ce/request-ce-sdk.rb +153 -0
- data/lib/kinetic_sdk/task/lib/access_keys.rb +94 -0
- data/lib/kinetic_sdk/task/lib/categories.rb +190 -0
- data/lib/kinetic_sdk/task/lib/config.rb +202 -0
- data/lib/kinetic_sdk/task/lib/engine.rb +42 -0
- data/lib/kinetic_sdk/task/lib/environment.rb +14 -0
- data/lib/kinetic_sdk/task/lib/errors.rb +165 -0
- data/lib/kinetic_sdk/task/lib/groups.rb +112 -0
- data/lib/kinetic_sdk/task/lib/handlers.rb +105 -0
- data/lib/kinetic_sdk/task/lib/health.rb +28 -0
- data/lib/kinetic_sdk/task/lib/license.rb +52 -0
- data/lib/kinetic_sdk/task/lib/policy_rules.rb +166 -0
- data/lib/kinetic_sdk/task/lib/setup.rb +56 -0
- data/lib/kinetic_sdk/task/lib/sources.rb +134 -0
- data/lib/kinetic_sdk/task/lib/tasks.rb +17 -0
- data/lib/kinetic_sdk/task/lib/trees.rb +274 -0
- data/lib/kinetic_sdk/task/lib/users.rb +75 -0
- data/lib/kinetic_sdk/task/task-sdk.rb +92 -0
- data/lib/kinetic_sdk/utils/kinetic-http-headers.rb +150 -0
- data/lib/kinetic_sdk/utils/kinetic-http-response.rb +75 -0
- data/lib/kinetic_sdk/utils/kinetic-http.rb +552 -0
- data/lib/kinetic_sdk/utils/logger.rb +70 -0
- data/lib/kinetic_sdk/utils/random.rb +30 -0
- data/lib/kinetic_sdk/version.rb +7 -0
- data/lib/kinetic_sdk.rb +57 -0
- metadata +414 -0
@@ -0,0 +1,552 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'erb'
|
3
|
+
require 'mime/types'
|
4
|
+
require 'net/http'
|
5
|
+
require 'net/http/post/multipart'
|
6
|
+
require 'openssl'
|
7
|
+
|
8
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "kinetic-http-headers.rb")
|
9
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "kinetic-http-response.rb")
|
10
|
+
|
11
|
+
# The KineticSdk module contains functionality to interact with Kinetic Data applications
|
12
|
+
# using their built-in REST APIs.
|
13
|
+
module KineticSdk
|
14
|
+
|
15
|
+
# A utilities module that can be used by multiple libraries.
|
16
|
+
module Utils
|
17
|
+
|
18
|
+
# The KineticHttpUtils module provides common HTTP methods, and returns a
|
19
|
+
# {KineticSdk::Utils::KineticHttpResponse} object with all methods. The raw
|
20
|
+
# Net::HTTPResponse is available by calling the
|
21
|
+
# {KineticSdk::Utils::KineticHttpResponse#response} method.
|
22
|
+
module KineticHttpUtils
|
23
|
+
|
24
|
+
# Include the Logger module
|
25
|
+
include KineticSdk::Utils::Logger
|
26
|
+
|
27
|
+
# Send an HTTP DELETE request
|
28
|
+
#
|
29
|
+
# @param url [String] url to send the request to
|
30
|
+
# @param headers [Hash] hash of headers to send
|
31
|
+
# @param redirect_limit [Fixnum] max number of times to redirect
|
32
|
+
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
33
|
+
def delete(url, headers={}, redirect_limit=max_redirects)
|
34
|
+
# parse the URL
|
35
|
+
uri = URI.parse(url)
|
36
|
+
|
37
|
+
debug("DELETE #{uri} #{headers.inspect}")
|
38
|
+
|
39
|
+
# build the http object
|
40
|
+
http = build_http(uri)
|
41
|
+
# build the request
|
42
|
+
request = Net::HTTP::Delete.new(uri.request_uri, headers)
|
43
|
+
|
44
|
+
# send the request
|
45
|
+
begin
|
46
|
+
response = http.request(request)
|
47
|
+
# handle the response
|
48
|
+
case response
|
49
|
+
when Net::HTTPRedirection then
|
50
|
+
if redirect_limit == -1
|
51
|
+
info("HTTP response code: #{response.code}") unless trace?
|
52
|
+
KineticHttpResponse.new(response)
|
53
|
+
elsif redirect_limit == 0
|
54
|
+
raise Net::HTTPFatalError.new("Too many redirects", response)
|
55
|
+
else
|
56
|
+
delete_raw(response['location'], headers, redirect_limit - 1)
|
57
|
+
end
|
58
|
+
when NilClass then
|
59
|
+
info("HTTP response code: 0") unless trace?
|
60
|
+
raise Net::HTTPFatalError.new("No response from server", response)
|
61
|
+
else
|
62
|
+
info("HTTP response code: #{response.code}") unless trace?
|
63
|
+
KineticHttpResponse.new(response)
|
64
|
+
end
|
65
|
+
rescue StandardError => e
|
66
|
+
info("HTTP response: #{response.inspect}") unless trace?
|
67
|
+
KineticHttpResponse.new(e)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Send an HTTP GET request
|
72
|
+
#
|
73
|
+
# @param url [String] url to send the request to
|
74
|
+
# @param params [Hash] Query parameters that are added to the URL, such as +include+
|
75
|
+
# @param headers [Hash] hash of headers to send
|
76
|
+
# @param redirect_limit [Fixnum] max number of times to redirect
|
77
|
+
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
78
|
+
def get(url, params={}, headers={}, redirect_limit=max_redirects)
|
79
|
+
# parse the URL
|
80
|
+
uri = URI.parse(url)
|
81
|
+
# add URL parameters
|
82
|
+
uri.query = URI.encode_www_form(params)
|
83
|
+
|
84
|
+
debug("GET #{uri} #{headers.inspect}")
|
85
|
+
|
86
|
+
# build the http object
|
87
|
+
http = build_http(uri)
|
88
|
+
# build the request
|
89
|
+
request = Net::HTTP::Get.new(uri.request_uri, headers)
|
90
|
+
|
91
|
+
# send the request
|
92
|
+
begin
|
93
|
+
response = http.request(request)
|
94
|
+
# handle the response
|
95
|
+
case response
|
96
|
+
when Net::HTTPRedirection then
|
97
|
+
if redirect_limit == -1
|
98
|
+
info("HTTP response code: #{response.code}") unless trace?
|
99
|
+
KineticHttpResponse.new(response)
|
100
|
+
elsif redirect_limit == 0
|
101
|
+
raise Net::HTTPFatalError.new("Too many redirects", response)
|
102
|
+
else
|
103
|
+
get_raw(response['location'], params, headers, redirect_limit - 1)
|
104
|
+
end
|
105
|
+
when NilClass then
|
106
|
+
info("HTTP response code: 0") unless trace?
|
107
|
+
raise Net::HTTPFatalError.new("No response from server", response)
|
108
|
+
else
|
109
|
+
info("HTTP response code: #{response.code}") unless trace?
|
110
|
+
KineticHttpResponse.new(response)
|
111
|
+
end
|
112
|
+
rescue StandardError => e
|
113
|
+
info("HTTP response: #{response.inspect}") unless trace?
|
114
|
+
KineticHttpResponse.new(e)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Send an HTTP HEAD request
|
119
|
+
#
|
120
|
+
# @param url [String] url to send the request to
|
121
|
+
# @param params [Hash] Query parameters that are added to the URL, such as +include+
|
122
|
+
# @param headers [Hash] hash of headers to send
|
123
|
+
# @param redirect_limit [Fixnum] max number of times to redirect
|
124
|
+
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
125
|
+
def head(url, params={}, headers={}, redirect_limit=max_redirects)
|
126
|
+
# parse the URL
|
127
|
+
uri = URI.parse(url)
|
128
|
+
# add URL parameters
|
129
|
+
uri.query = URI.encode_www_form(params)
|
130
|
+
|
131
|
+
debug("HEAD #{uri} #{headers.inspect}")
|
132
|
+
|
133
|
+
# build the http object
|
134
|
+
http = build_http(uri)
|
135
|
+
# build the request
|
136
|
+
request = Net::HTTP::Head.new(uri.request_uri, headers)
|
137
|
+
|
138
|
+
# send the request
|
139
|
+
begin
|
140
|
+
response = http.request(request)
|
141
|
+
# handle the response
|
142
|
+
case response
|
143
|
+
when Net::HTTPRedirection then
|
144
|
+
if redirect_limit == -1
|
145
|
+
info("HTTP response code: #{response.code}") unless trace?
|
146
|
+
KineticHttpResponse.new(response)
|
147
|
+
elsif redirect_limit == 0
|
148
|
+
raise Net::HTTPFatalError.new("Too many redirects", response)
|
149
|
+
else
|
150
|
+
head_raw(response['location'], params, headers, redirect_limit - 1)
|
151
|
+
end
|
152
|
+
when NilClass then
|
153
|
+
info("HTTP response code: 0") unless trace?
|
154
|
+
raise Net::HTTPFatalError.new("No response from server", response)
|
155
|
+
else
|
156
|
+
info("HTTP response code: #{response.code}") unless trace?
|
157
|
+
KineticHttpResponse.new(response)
|
158
|
+
end
|
159
|
+
rescue StandardError => e
|
160
|
+
info("HTTP response: #{response.inspect}") unless trace?
|
161
|
+
KineticHttpResponse.new(e)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Send an HTTP PATCH request
|
166
|
+
#
|
167
|
+
# @param url [String] url to send the request to
|
168
|
+
# @param data [Hash] the payload to send with the request
|
169
|
+
# @param headers [Hash] hash of headers to send
|
170
|
+
# @param redirect_limit [Fixnum] max number of times to redirect
|
171
|
+
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
172
|
+
def patch(url, data={}, headers={}, redirect_limit=max_redirects)
|
173
|
+
# parse the URL
|
174
|
+
uri = URI.parse(url)
|
175
|
+
|
176
|
+
debug("PATCH #{uri} #{headers.inspect}")
|
177
|
+
|
178
|
+
# unless the data is already a string, assume JSON and convert to string
|
179
|
+
data = data.to_json unless data.is_a? String
|
180
|
+
# build the http object
|
181
|
+
http = build_http(uri)
|
182
|
+
# build the request
|
183
|
+
request = Net::HTTP::Patch.new(uri.request_uri, headers)
|
184
|
+
request.body = data
|
185
|
+
|
186
|
+
# send the request
|
187
|
+
begin
|
188
|
+
response = http.request(request)
|
189
|
+
# handle the response
|
190
|
+
case response
|
191
|
+
when Net::HTTPRedirection then
|
192
|
+
if redirect_limit == -1
|
193
|
+
info("HTTP response code: #{response.code}") unless trace?
|
194
|
+
KineticHttpResponse.new(response)
|
195
|
+
elsif redirect_limit == 0
|
196
|
+
raise Net::HTTPFatalError.new("Too many redirects", response)
|
197
|
+
else
|
198
|
+
patch_raw(response['location'], data, headers, redirect_limit - 1)
|
199
|
+
end
|
200
|
+
when NilClass then
|
201
|
+
info("HTTP response code: 0") unless trace?
|
202
|
+
raise Net::HTTPFatalError.new("No response from server", response)
|
203
|
+
else
|
204
|
+
info("HTTP response code: #{response.code}") unless trace?
|
205
|
+
KineticHttpResponse.new(response)
|
206
|
+
end
|
207
|
+
rescue StandardError => e
|
208
|
+
info("HTTP response: #{response.inspect}") unless trace?
|
209
|
+
KineticHttpResponse.new(e)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
# Send an HTTP POST request
|
214
|
+
#
|
215
|
+
# @param url [String] url to send the request to
|
216
|
+
# @param data [Hash] the payload to send with the request
|
217
|
+
# @param headers [Hash] hash of headers to send
|
218
|
+
# @param redirect_limit [Fixnum] max number of times to redirect
|
219
|
+
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
220
|
+
def post(url, data={}, headers={}, redirect_limit=max_redirects)
|
221
|
+
# parse the URL
|
222
|
+
uri = URI.parse(url)
|
223
|
+
|
224
|
+
debug("POST #{uri} #{headers.inspect}")
|
225
|
+
|
226
|
+
# unless the data is already a string, assume JSON and convert to string
|
227
|
+
data = data.to_json unless data.is_a? String
|
228
|
+
# build the http object
|
229
|
+
http = build_http(uri)
|
230
|
+
# build the request
|
231
|
+
request = Net::HTTP::Post.new(uri.request_uri, headers)
|
232
|
+
request.body = data
|
233
|
+
|
234
|
+
# send the request
|
235
|
+
begin
|
236
|
+
response = http.request(request)
|
237
|
+
# handle the response
|
238
|
+
case response
|
239
|
+
when Net::HTTPRedirection then
|
240
|
+
if redirect_limit == -1
|
241
|
+
info("HTTP response code: #{response.code}") unless trace?
|
242
|
+
KineticHttpResponse.new(response)
|
243
|
+
elsif redirect_limit == 0
|
244
|
+
raise Net::HTTPFatalError.new("Too many redirects", response)
|
245
|
+
else
|
246
|
+
post_raw(response['location'], data, headers, redirect_limit - 1)
|
247
|
+
end
|
248
|
+
when NilClass then
|
249
|
+
info("HTTP response code: 0") unless trace?
|
250
|
+
raise Net::HTTPFatalError.new("No response from server", response)
|
251
|
+
else
|
252
|
+
info("HTTP response code: #{response.code}") unless trace?
|
253
|
+
KineticHttpResponse.new(response)
|
254
|
+
end
|
255
|
+
rescue StandardError => e
|
256
|
+
info("HTTP response: #{response.inspect}") unless trace?
|
257
|
+
KineticHttpResponse.new(e)
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
# Send a Multipart HTTP POST request
|
262
|
+
#
|
263
|
+
# @param url [String] url to send the request to
|
264
|
+
# @param data [Hash] payload to send with the request
|
265
|
+
# @param headers [Hash] hash of headers to send
|
266
|
+
# @param redirect_limit [Fixnum] max number of times to redirect
|
267
|
+
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
268
|
+
def post_multipart(url, data={}, headers={}, redirect_limit=max_redirects)
|
269
|
+
# the Content-Type header is handled automoatically by Net::HTTP::Post::Multipart
|
270
|
+
headers.delete_if { |k,v| k.to_s.downcase == "content-type" }
|
271
|
+
|
272
|
+
debug("POST #{url} #{headers.inspect} multi-part form content")
|
273
|
+
|
274
|
+
# parse the URL
|
275
|
+
uri = URI.parse(url)
|
276
|
+
|
277
|
+
# prepare the payload
|
278
|
+
payload = data.inject({}) do |h,(k,v)|
|
279
|
+
if v.class == File
|
280
|
+
h[k] = UploadIO.new(v, mimetype(v), File.basename(v))
|
281
|
+
elsif v.class == Array
|
282
|
+
# f = v.first
|
283
|
+
# h[k] = UploadIO.new(f, mimetype(f), File.basename(f)) unless f.nil?
|
284
|
+
h[k] = v.inject([]) do |files, part|
|
285
|
+
if part.class == File
|
286
|
+
files << UploadIO.new(part, mimetype(part), File.basename(part))
|
287
|
+
end
|
288
|
+
end
|
289
|
+
else
|
290
|
+
h[k] = v
|
291
|
+
end
|
292
|
+
h
|
293
|
+
end
|
294
|
+
|
295
|
+
# build the http object
|
296
|
+
http = build_http(uri)
|
297
|
+
# build the request
|
298
|
+
request = Net::HTTP::Post::Multipart.new(uri.request_uri, payload)
|
299
|
+
headers.each { |k,v| request.add_field(k, v) }
|
300
|
+
# send the request
|
301
|
+
begin
|
302
|
+
response = http.request(request)
|
303
|
+
# handle the response
|
304
|
+
case response
|
305
|
+
when Net::HTTPRedirection then
|
306
|
+
if redirect_limit == -1
|
307
|
+
info("HTTP response code: #{response.code}") unless trace?
|
308
|
+
KineticHttpResponse.new(response)
|
309
|
+
elsif redirect_limit == 0
|
310
|
+
raise Net::HTTPFatalError.new("Too many redirects", response)
|
311
|
+
else
|
312
|
+
post_multipart_raw(response['location'], data, headers, redirect_limit - 1)
|
313
|
+
end
|
314
|
+
when NilClass then
|
315
|
+
info("HTTP response code: 0") unless trace?
|
316
|
+
raise Net::HTTPFatalError.new("No response from server", response)
|
317
|
+
else
|
318
|
+
info("HTTP response code: #{response.code}") unless trace?
|
319
|
+
KineticHttpResponse.new(response)
|
320
|
+
end
|
321
|
+
rescue StandardError => e
|
322
|
+
info("HTTP response: #{response.inspect}") unless trace?
|
323
|
+
KineticHttpResponse.new(e)
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
# Send an HTTP PUT request
|
328
|
+
#
|
329
|
+
# @param url [String] url to send the request to
|
330
|
+
# @param data [Hash] payload to send with the request
|
331
|
+
# @param headers [Hash] hash of headers to send
|
332
|
+
# @param redirect_limit [Fixnum] max number of times to redirect
|
333
|
+
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
334
|
+
def put(url, data={}, headers={}, redirect_limit=max_redirects)
|
335
|
+
# parse the URL
|
336
|
+
uri = URI.parse(url)
|
337
|
+
|
338
|
+
debug("PUT #{uri} #{headers.inspect}")
|
339
|
+
|
340
|
+
# unless the data is already a string, assume JSON and convert to string
|
341
|
+
data = data.to_json unless data.is_a? String
|
342
|
+
# build the http object
|
343
|
+
http = build_http(uri)
|
344
|
+
# build the request
|
345
|
+
request = Net::HTTP::Put.new(uri.request_uri, headers)
|
346
|
+
request.body = data
|
347
|
+
|
348
|
+
# send the request
|
349
|
+
begin
|
350
|
+
response = http.request(request)
|
351
|
+
# handle the response
|
352
|
+
case response
|
353
|
+
when Net::HTTPRedirection then
|
354
|
+
if redirect_limit == -1
|
355
|
+
info("HTTP response code: #{response.code}") unless trace?
|
356
|
+
KineticHttpResponse.new(response)
|
357
|
+
elsif redirect_limit == 0
|
358
|
+
raise Net::HTTPFatalError.new("Too many redirects", response)
|
359
|
+
else
|
360
|
+
put_raw(response['location'], data, headers, redirect_limit - 1)
|
361
|
+
end
|
362
|
+
when NilClass then
|
363
|
+
info("HTTP response code: 0") unless trace?
|
364
|
+
raise Net::HTTPFatalError.new("No response from server", response)
|
365
|
+
else
|
366
|
+
info("HTTP response code: #{response.code}") unless trace?
|
367
|
+
KineticHttpResponse.new(response)
|
368
|
+
end
|
369
|
+
rescue StandardError => e
|
370
|
+
info("HTTP response: #{response.inspect}") unless trace?
|
371
|
+
KineticHttpResponse.new(e)
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
# Determine the final redirect location
|
376
|
+
#
|
377
|
+
# @param url [String] url to send the request to
|
378
|
+
# @param params [Hash] Query parameters that are added to the URL, such as +include+
|
379
|
+
# @param headers [Hash] hash of headers to send
|
380
|
+
# @param redirect_limit [Fixnum] max number of times to redirect
|
381
|
+
# @return [String] redirection url, or url if there is no redirection
|
382
|
+
def redirect_url(url, params={}, headers={}, redirect_limit=max_redirects)
|
383
|
+
# parse the URL
|
384
|
+
uri = URI.parse(url)
|
385
|
+
# add URL parameters
|
386
|
+
uri.query = URI.encode_www_form(params)
|
387
|
+
|
388
|
+
# build the http object
|
389
|
+
http = build_http(uri)
|
390
|
+
# build the request
|
391
|
+
request = Net::HTTP::Head.new(uri.request_uri, headers)
|
392
|
+
|
393
|
+
# send the request
|
394
|
+
response = http.request(request)
|
395
|
+
# handle the response
|
396
|
+
case response
|
397
|
+
when Net::HTTPRedirection then
|
398
|
+
if redirect_limit > 0
|
399
|
+
url = response['location']
|
400
|
+
head_raw(response['location'], params, headers, redirect_limit - 1)
|
401
|
+
end
|
402
|
+
end
|
403
|
+
url
|
404
|
+
end
|
405
|
+
|
406
|
+
# Download attachment from a URL and save to file.
|
407
|
+
#
|
408
|
+
# Streams the download to limit memory consumption. The user account
|
409
|
+
# utilizing the SDK must have write access to the file path.
|
410
|
+
#
|
411
|
+
# @param url [String] url to send the request to
|
412
|
+
# @param params [Hash] Query parameters that are added to the URL, such as +include+
|
413
|
+
# @param headers [Hash] hash of headers to send
|
414
|
+
# @param redirect_limit [Fixnum] max number of times to redirect
|
415
|
+
def stream_download_to_file(file_path, url, params={}, headers={}, redirect_limit=max_redirects)
|
416
|
+
# Determine if redirection is involved
|
417
|
+
url = redirect_url(url, params, headers, max_redirects)
|
418
|
+
# parse the URL
|
419
|
+
uri = URI.parse(url)
|
420
|
+
|
421
|
+
debug("Streaming Download #{uri} #{headers.inspect}")
|
422
|
+
|
423
|
+
# build the http object
|
424
|
+
http = build_http(uri)
|
425
|
+
|
426
|
+
# stream the attachment
|
427
|
+
file = File.open(file_path, "wb")
|
428
|
+
file_name = File.basename(file_path)
|
429
|
+
response_code = nil
|
430
|
+
message = nil
|
431
|
+
begin
|
432
|
+
http.request_get(uri.request_uri, headers) do |response|
|
433
|
+
response_code = response.code
|
434
|
+
if response_code == "200"
|
435
|
+
response.read_body { |chunk| file.write(chunk) }
|
436
|
+
else
|
437
|
+
message = response.body
|
438
|
+
break
|
439
|
+
end
|
440
|
+
end
|
441
|
+
if response_code == "200"
|
442
|
+
info("Exported file attachment: #{file_name} to #{file_path}")
|
443
|
+
else
|
444
|
+
warn("Failed to export file attachment \"#{file_name}\": #{message}")
|
445
|
+
end
|
446
|
+
rescue StandardError => e
|
447
|
+
warn("Failed to export file attachment \"#{file_name}\": (#{e})")
|
448
|
+
ensure
|
449
|
+
file.close()
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
453
|
+
# alias methods to allow wrapper modules to handle the
|
454
|
+
# response object.
|
455
|
+
alias_method :delete_raw, :delete
|
456
|
+
alias_method :get_raw, :get
|
457
|
+
alias_method :head_raw, :head
|
458
|
+
alias_method :patch_raw, :patch
|
459
|
+
alias_method :post_raw, :post
|
460
|
+
alias_method :post_multipart_raw, :post_multipart
|
461
|
+
alias_method :put_raw, :put
|
462
|
+
|
463
|
+
|
464
|
+
# Encode URI components
|
465
|
+
#
|
466
|
+
# @param parameter [String] parameter value to encode
|
467
|
+
# @return [String] URL encoded parameter value
|
468
|
+
def encode(parameter)
|
469
|
+
ERB::Util.url_encode parameter
|
470
|
+
end
|
471
|
+
|
472
|
+
# Determines the mime-type of a file
|
473
|
+
#
|
474
|
+
# @param file [File | String] file or filename to detect
|
475
|
+
# @return [Array] MIME::Type of the file
|
476
|
+
def mimetype(file)
|
477
|
+
mime_type = MIME::Types.type_for(file.class == File ? File.basename(file) : file)
|
478
|
+
if mime_type.size == 0
|
479
|
+
mime_type = MIME::Types['text/plain']
|
480
|
+
end
|
481
|
+
mime_type
|
482
|
+
end
|
483
|
+
|
484
|
+
# The maximum number of times to follow redirects.
|
485
|
+
#
|
486
|
+
# Can be passed in as an option when initializing the SDK
|
487
|
+
# with either the @options[:max_redirects] or @options['max_redirects']
|
488
|
+
# key.
|
489
|
+
#
|
490
|
+
# Expects an integer [Fixnum] value. Setting to 0 will disable redirects.
|
491
|
+
#
|
492
|
+
# @return [Fixnum] default 5
|
493
|
+
def max_redirects
|
494
|
+
limit = @options &&
|
495
|
+
(
|
496
|
+
@options[:max_redirects] ||
|
497
|
+
@options['max_redirects']
|
498
|
+
)
|
499
|
+
limit.nil? ? 5 : limit.to_i
|
500
|
+
end
|
501
|
+
|
502
|
+
private
|
503
|
+
|
504
|
+
# Build the Net::HTTP object.
|
505
|
+
#
|
506
|
+
# @param uri [URI] the URI for the HTTP request
|
507
|
+
# @return [Net::HTTP]
|
508
|
+
def build_http(uri)
|
509
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
510
|
+
http.set_debug_output($stdout) if trace?
|
511
|
+
if (uri.scheme == 'https')
|
512
|
+
http.use_ssl = true
|
513
|
+
if (@options[:ssl_verify_mode].to_s.strip.downcase == 'peer')
|
514
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
515
|
+
http.ca_file = @options[:ssl_ca_file] if @options[:ssl_ca_file]
|
516
|
+
else
|
517
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
518
|
+
end
|
519
|
+
end
|
520
|
+
http.read_timeout=60
|
521
|
+
http.open_timeout=60
|
522
|
+
http
|
523
|
+
end
|
524
|
+
|
525
|
+
end
|
526
|
+
|
527
|
+
|
528
|
+
# The KineticHttp class provides functionality to make generic HTTP requests.
|
529
|
+
class KineticHttp
|
530
|
+
|
531
|
+
include KineticSdk::Utils::KineticHttpUtils
|
532
|
+
|
533
|
+
# The username used in the Basic Authentication header
|
534
|
+
attr_reader :username
|
535
|
+
# The password used in the Basic Authentication header
|
536
|
+
attr_reader :password
|
537
|
+
|
538
|
+
# Constructor
|
539
|
+
#
|
540
|
+
# @param username [String] username for Basic Authentication
|
541
|
+
# @param password [String] password for Basic Authentication
|
542
|
+
def initialize(username=nil, password=nil)
|
543
|
+
@username = username
|
544
|
+
@password = password
|
545
|
+
@options = {}
|
546
|
+
end
|
547
|
+
|
548
|
+
end
|
549
|
+
|
550
|
+
|
551
|
+
end
|
552
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module KineticSdk
|
2
|
+
module Utils
|
3
|
+
|
4
|
+
# The Logger module provides methods to output at different levels based on
|
5
|
+
# a configuration property. The default log level is `off`, but can be
|
6
|
+
# turned on by passing in the `log_level` option.
|
7
|
+
#
|
8
|
+
# Available Levels: `trace`, `debug`, `info`, `off`
|
9
|
+
#
|
10
|
+
module Logger
|
11
|
+
|
12
|
+
# Logs the message if the log level is set to debug or lower.
|
13
|
+
#
|
14
|
+
# @param message [String] The message to log at debug level
|
15
|
+
def debug(message)
|
16
|
+
puts message if debug?
|
17
|
+
end
|
18
|
+
|
19
|
+
# Indicates if the log level is set to debug or lower.
|
20
|
+
#
|
21
|
+
# @return [Boolean] true if debug or trace, else false
|
22
|
+
def debug?
|
23
|
+
@options &&
|
24
|
+
(
|
25
|
+
@options[:log_level].to_s.downcase == "debug" ||
|
26
|
+
@options['log_level'].to_s.downcase == "debug" ||
|
27
|
+
trace?
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Logs the message if the log level is set to info or lower.
|
32
|
+
#
|
33
|
+
# @param message [String] The message to log at info level
|
34
|
+
def info(message)
|
35
|
+
puts message if info?
|
36
|
+
end
|
37
|
+
|
38
|
+
# Indicates if the log level is set to info or lower.
|
39
|
+
#
|
40
|
+
# @return [Boolean] true if info, debug or trace, else false
|
41
|
+
def info?
|
42
|
+
@options &&
|
43
|
+
(
|
44
|
+
@options[:log_level].to_s.downcase == "info" ||
|
45
|
+
@options['log_level'].to_s.downcase == "info" ||
|
46
|
+
debug?
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Logs the message if the log level is set to trace.
|
51
|
+
#
|
52
|
+
# @param message [String] The message to log at trace level
|
53
|
+
def trace(message)
|
54
|
+
puts message if trace?
|
55
|
+
end
|
56
|
+
|
57
|
+
# Indicates if the log level is set to trace.
|
58
|
+
#
|
59
|
+
# @return [Boolean] true if trace, else false
|
60
|
+
def trace?
|
61
|
+
@options &&
|
62
|
+
(
|
63
|
+
@options[:log_level].to_s.downcase == "trace" ||
|
64
|
+
@options['log_level'].to_s.downcase == "trace"
|
65
|
+
)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module KineticSdk
|
2
|
+
module Utils
|
3
|
+
|
4
|
+
# The Random module provides methods to generate random secrets of varying
|
5
|
+
# complexity.
|
6
|
+
module Random
|
7
|
+
|
8
|
+
# Symbols that are allowed by default
|
9
|
+
DEFAULT_SYMBOLS = %w( ! @ % * ( ) { } [ ] )
|
10
|
+
# Symbols that are represented as 7-bit ASCII
|
11
|
+
SEVEN_BIT_ASCII_SYMBOLS = %w(! " # $ % & ' ( ) * + - . / : ; < = > ? @ [ \ ] & _ ` { | } ~)
|
12
|
+
# Alpha-numeric characters that are respresented as 7-bit ASCII
|
13
|
+
SEVEN_BIT_ASCII_ALPHANUM =
|
14
|
+
('A'..'Z').to_a.concat(
|
15
|
+
('a'..'z').to_a).concat(
|
16
|
+
('0'..'9').to_a)
|
17
|
+
|
18
|
+
# Generates a simple secret based on ASCII alpha-numeric characters,
|
19
|
+
# and a few standard symbol characters.
|
20
|
+
#
|
21
|
+
# @param size [Fixnum] The length of the generated secret
|
22
|
+
# @param allowed_symbols [Array] symbols to allow
|
23
|
+
def self.simple(size = 20, allowed_symbols = DEFAULT_SYMBOLS)
|
24
|
+
chars = (allowed_symbols || Array.new).concat(SEVEN_BIT_ASCII_ALPHANUM)
|
25
|
+
(0...size).map { chars[rand(chars.size)] }.join
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|