azure-kusto-ruby 0.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 825e171c28ef4a5b0f5a133cbffa427623e5e28a71519eda8d523f373ed76c58
4
+ data.tar.gz: 415378a81832dc2369b495da8302f85b1bb1b941704fe72df18020e2f56ae84c
5
+ SHA512:
6
+ metadata.gz: e1fd7e66bea05a43e7ed11db5c83aed4e742cc16aa8e9cee9c4f99cd39e79e1a9203fe266ee65f9ac77c143a2738e35145b1f299805308f28f8611384c94f226
7
+ data.tar.gz: f0abd0dbf4138e2bd681738b094b2a2e869243dfc8aaf8da47ad980de05e1eca6be8d1fd6a91bbb765f58c8b7f7a39e0586c418c02c596b349579da98e5c453d
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "faraday"
4
+ require_relative "../result/data_set"
5
+
6
+ module Kusto
7
+ module Rest
8
+ class Context
9
+ attr_reader :path
10
+
11
+ class Error < StandardError; end
12
+
13
+ def initialize(url:, token:)
14
+ @url = url
15
+ @token = token
16
+ @connector = Faraday.new(url:)
17
+ end
18
+
19
+ def post(query)
20
+ response = @connector.post(@path) do |req|
21
+ req.headers["Content-Type"] = "application/json"
22
+ req.headers["Authorization"] = "Bearer #{@token}"
23
+ req.body = query.request_body.to_json
24
+ end
25
+
26
+ unless response.success?
27
+ raise Error, "Request failed with status #{response.status} - #{response.reason_phrase} #{response.body}"
28
+ end
29
+
30
+ if response.body.empty? || response.body.nil?
31
+ raise Error, "Request with status #{response.status} returned an empty response body"
32
+ end
33
+
34
+ Kusto::Rest::DataSet.new(response.body)
35
+ end
36
+
37
+ def endpoint
38
+ @connector.url_prefix.to_s + @path
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "context"
4
+
5
+ module Kusto
6
+ module Rest
7
+ class ManagementContext < Context
8
+ attr_reader :path
9
+
10
+ class Error < StandardError; end
11
+
12
+ def initialize(url:, token:)
13
+ super(url:, token:)
14
+ @path = "v1/rest/mgmt"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "context"
4
+
5
+ module Kusto
6
+ module Rest
7
+ class QueryContext < Context
8
+ attr_reader :path
9
+
10
+ class Error < StandardError; end
11
+
12
+ def initialize(url:, token:)
13
+ super(url:, token:)
14
+ @path = "v2/rest/query"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "context/query_context"
4
+ require_relative "context/management_context"
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+ require_relative "query"
5
+
6
+ module Kusto
7
+ module Rest
8
+ class DataQuery < Query
9
+ def initialize(db:, statement:, parameters: {}, options: {}, request_id: nil)
10
+ default_options = { "results_progressive_enabled": false }
11
+ @options = default_options.merge!(options)
12
+ @parameters = parameters
13
+ @db = db
14
+ super(statement:, request_id:)
15
+ end
16
+
17
+ def request_body
18
+ @request_body ||= {
19
+ db: @db,
20
+ properties:,
21
+ csl: @statement
22
+ }
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+
5
+ module Kusto
6
+ module Rest
7
+ class Query
8
+ def initialize(statement:, options: {}, parameters: {}, request_id: nil)
9
+ @options = options
10
+ @parameters = parameters
11
+ @request_id = request_id || get_request_id
12
+ @statement = statement
13
+ end
14
+
15
+ def properties
16
+ @properties ||= {
17
+ "Options": @options,
18
+ "Parameters": @parameters,
19
+ "ClientRequestId": @request_id
20
+ }
21
+ end
22
+
23
+ def request_body
24
+ @request_body ||= {
25
+ properties:,
26
+ csl: @statement
27
+ }
28
+ end
29
+
30
+ private
31
+
32
+ def get_request_id
33
+ @request_id ||= "#{self.class.name}::#{SecureRandom.uuid}"
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "query/query"
4
+ require_relative "query/data"
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "date"
4
+
5
+ module Kusto
6
+ module Rest
7
+ class DataFrame
8
+ def initialize(data)
9
+ @data = data
10
+ end
11
+
12
+ def type
13
+ @data["FrameType"]
14
+ end
15
+
16
+ def kind
17
+ @data["TableKind"]
18
+ end
19
+
20
+ def name
21
+ @data["TableName"]
22
+ end
23
+
24
+ def cast(value, type)
25
+ case type
26
+ when "datetime"
27
+ value ? DateTime.parse(value) : nil
28
+ else
29
+ value
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require_relative "data_set_completion"
5
+ require_relative "data_set_header"
6
+ require_relative "data_table"
7
+
8
+ module Kusto
9
+ module Rest
10
+ class DataSet
11
+ attr_reader :data
12
+
13
+ def initialize(response)
14
+ @data = JSON.parse(response)
15
+ end
16
+
17
+ def rows
18
+ primary_result.rows
19
+ end
20
+
21
+ def primary_result
22
+ @primary_result ||= frames.find_all do |frame|
23
+ frame.type == "DataTable" &&
24
+ frame.kind == "PrimaryResult" &&
25
+ frame.name == "PrimaryResult"
26
+ end.first
27
+ end
28
+
29
+ def header
30
+ @header ||= frames.find_all { |frame| frame.type == "DataSetHeader" }.first
31
+ end
32
+
33
+ def completion
34
+ @completion ||= frames.find_all do |frame|
35
+ frame.type == "DataSetCompletion"
36
+ end.first
37
+ end
38
+
39
+ def self.parse_frame(frame)
40
+ case frame["FrameType"]
41
+ when "DataSetHeader"
42
+ Kusto::Rest::DataSetHeader.new(frame)
43
+ when "DataTable"
44
+ Kusto::Rest::DataTable.new(frame)
45
+ when "DataSetCompletion"
46
+ Kusto::Rest::DataSetCompletion.new(frame)
47
+ else
48
+ Kusto::Result::DataFrame.new(frame)
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def frames
55
+ @frames ||= @data.map do |frame|
56
+ self.class.parse_frame(frame)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "data_frame"
4
+
5
+ module Kusto
6
+ module Rest
7
+ class DataSetCompletion < DataFrame
8
+ def errors?
9
+ @data["HasErrors"]
10
+ end
11
+
12
+ def cancelled?
13
+ @data["Cancelled"]
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "data_frame"
4
+
5
+ module Kusto
6
+ module Rest
7
+ class DataSetHeader < DataFrame
8
+ def progressive?
9
+ @data["IsProgressive"]
10
+ end
11
+
12
+ def fragmented?
13
+ @data["IsFragmented"]
14
+ end
15
+
16
+ def version
17
+ @data["Version"]
18
+ end
19
+
20
+ def error_reporting_placement
21
+ @data["ErrorReportingPlacement"]
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "data_frame"
4
+
5
+ module Kusto
6
+ module Rest
7
+ class DataTable < DataFrame
8
+ def rows
9
+ columns = @data["Columns"]
10
+ row_data = @data["Rows"]
11
+ row_data.map do |row|
12
+ columns.each_with_index.to_h do |column, index|
13
+ [column["ColumnName"], cast(row[index], column["ColumnType"])]
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "result/data_frame"
4
+ require_relative "result/data_set"
5
+ require_relative "result/data_set_completion"
6
+ require_relative "result/data_set_header"
7
+ require_relative "result/data_table"
data/lib/kusto/rest.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kusto
4
+ module Rest
5
+ require_relative "rest/context"
6
+ require_relative "rest/query"
7
+ require_relative "rest/result"
8
+ end
9
+ end
data/lib/version.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azure
4
+ module Kusto
5
+ module Ruby
6
+ VERSION = "0.0.5"
7
+ end
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: azure-kusto-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ platform: ruby
6
+ authors:
7
+ - Carlton Brown
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-05-17 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email:
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/kusto/rest.rb
20
+ - lib/kusto/rest/context.rb
21
+ - lib/kusto/rest/context/context.rb
22
+ - lib/kusto/rest/context/management_context.rb
23
+ - lib/kusto/rest/context/query_context.rb
24
+ - lib/kusto/rest/query.rb
25
+ - lib/kusto/rest/query/data.rb
26
+ - lib/kusto/rest/query/query.rb
27
+ - lib/kusto/rest/result.rb
28
+ - lib/kusto/rest/result/data_frame.rb
29
+ - lib/kusto/rest/result/data_set.rb
30
+ - lib/kusto/rest/result/data_set_completion.rb
31
+ - lib/kusto/rest/result/data_set_header.rb
32
+ - lib/kusto/rest/result/data_table.rb
33
+ - lib/version.rb
34
+ homepage: https://github.com/carltonbrown/azure-kusto-ruby
35
+ licenses:
36
+ - MIT
37
+ metadata:
38
+ github_repo: https://github.com/carltonbrown/azure-kusto-ruby
39
+ rubygems_mfa_required: 'true'
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 3.1.0
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirements: []
55
+ rubygems_version: 3.5.3
56
+ signing_key:
57
+ specification_version: 4
58
+ summary: A client for the Kusto REST API
59
+ test_files: []