connectors_sdk 8.3.0.0 → 8.3.2.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.
- checksums.yaml +4 -4
- data/lib/connectors_sdk/atlassian/custom_client.rb +15 -6
- data/lib/connectors_sdk/base/registry.rb +2 -0
- data/lib/connectors_sdk/confluence_cloud/connector.rb +37 -11
- data/lib/connectors_sdk/confluence_cloud/extractor.rb +2 -1
- data/lib/connectors_sdk/gitlab/adapter.rb +42 -0
- data/lib/connectors_sdk/gitlab/config.rb +26 -0
- data/lib/connectors_sdk/gitlab/connector.rb +71 -0
- data/lib/connectors_sdk/gitlab/custom_client.rb +40 -0
- data/lib/connectors_sdk/gitlab/extractor.rb +123 -0
- metadata +121 -5
- data/lib/stubs/enterprise_search/exception_tracking.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 929c0ce8ad8eaf2ab34849ee4f0b476c37e5cfe12994bf73aa183be58c350213
|
4
|
+
data.tar.gz: 9e7189b26959b4bb74e097a6e0a2effb3ade9a0b730dbccee5c23f5d0cedebd1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ea84dda6c9c5980b2fa089e2ac049a8ce1d27ff98761f20bb5e760dbbf6851c452cdcb35e40d274cff0c692da37e9a77be029fd286bc38672ea3597ab013db7
|
7
|
+
data.tar.gz: 837884527017d23bb33a1370f6500db9b8d37afee351ffd6243d852309120f69d2dd1bcf18a70556785d2b460e011276b8d7b621d09c631519c7aa95603b32e9
|
@@ -9,6 +9,7 @@
|
|
9
9
|
require 'faraday_middleware'
|
10
10
|
|
11
11
|
require 'connectors_shared/middleware/bearer_auth'
|
12
|
+
require 'connectors_shared/middleware/basic_auth'
|
12
13
|
require 'connectors_shared/middleware/restrict_hostnames'
|
13
14
|
require 'connectors_sdk/base/custom_client'
|
14
15
|
|
@@ -30,10 +31,12 @@ module ConnectorsSdk
|
|
30
31
|
|
31
32
|
MEDIA_API_BASE_URL = 'https://api.media.atlassian.com'
|
32
33
|
|
33
|
-
attr_reader :base_url, :access_token
|
34
|
+
attr_reader :base_url, :access_token, :basic_auth_token
|
34
35
|
|
35
|
-
def initialize(base_url:, access_token
|
36
|
+
def initialize(base_url:, access_token: nil, basic_auth_token: nil, ensure_fresh_auth: nil)
|
37
|
+
raise 'Either access_token or basic_auth_token must be provided' unless access_token.present? || basic_auth_token.present?
|
36
38
|
@access_token = access_token
|
39
|
+
@basic_auth_token = basic_auth_token
|
37
40
|
super(:base_url => base_url, :ensure_fresh_auth => ensure_fresh_auth)
|
38
41
|
end
|
39
42
|
|
@@ -42,11 +45,17 @@ module ConnectorsSdk
|
|
42
45
|
end
|
43
46
|
|
44
47
|
def additional_middleware
|
45
|
-
[
|
46
|
-
|
47
|
-
|
48
|
-
[ConnectorsShared::Middleware::BearerAuth, { :bearer_auth_token => @access_token }]
|
48
|
+
result = [
|
49
|
+
FaradayMiddleware::FollowRedirects,
|
50
|
+
[ConnectorsShared::Middleware::RestrictHostnames, { :allowed_hosts => [base_url, MEDIA_API_BASE_URL] }]
|
49
51
|
]
|
52
|
+
if @access_token.present?
|
53
|
+
result.append([ConnectorsShared::Middleware::BearerAuth, { :bearer_auth_token => @access_token }])
|
54
|
+
elsif @basic_auth_token.present?
|
55
|
+
result.append([ConnectorsShared::Middleware::BasicAuth, { :basic_auth_token => @basic_auth_token }])
|
56
|
+
else
|
57
|
+
raise 'Either access token or basic auth must be provided'
|
58
|
+
end
|
50
59
|
end
|
51
60
|
|
52
61
|
def update_auth_data!(new_access_token)
|
@@ -30,8 +30,10 @@ module ConnectorsSdk
|
|
30
30
|
# loading plugins (might replace this with a directory scan and conventions on names)
|
31
31
|
require_relative '../share_point/connector'
|
32
32
|
require_relative '../confluence_cloud/connector'
|
33
|
+
require_relative '../gitlab/connector'
|
33
34
|
|
34
35
|
REGISTRY.register(ConnectorsSdk::SharePoint::Connector::SERVICE_TYPE, ConnectorsSdk::SharePoint::Connector)
|
35
36
|
REGISTRY.register(ConnectorsSdk::ConfluenceCloud::Connector::SERVICE_TYPE, ConnectorsSdk::ConfluenceCloud::Connector)
|
37
|
+
REGISTRY.register(ConnectorsSdk::GitLab::Connector::SERVICE_TYPE, ConnectorsSdk::GitLab::Connector)
|
36
38
|
end
|
37
39
|
end
|
@@ -6,6 +6,7 @@
|
|
6
6
|
|
7
7
|
# frozen_string_literal: true
|
8
8
|
|
9
|
+
require 'base64'
|
9
10
|
require 'connectors_sdk/atlassian/config'
|
10
11
|
require 'connectors_sdk/confluence_cloud/extractor'
|
11
12
|
require 'connectors_sdk/confluence_cloud/authorization'
|
@@ -29,23 +30,19 @@ module ConnectorsSdk
|
|
29
30
|
'Confluence Cloud'
|
30
31
|
end
|
31
32
|
|
32
|
-
def connection_requires_redirect
|
33
|
-
true
|
34
|
-
end
|
35
|
-
|
36
33
|
def configurable_fields
|
37
34
|
[
|
38
35
|
{
|
39
36
|
'key' => 'base_url',
|
40
|
-
'label' => 'Base URL'
|
37
|
+
'label' => 'Confluence Cloud Base URL'
|
41
38
|
},
|
42
39
|
{
|
43
|
-
'key' => '
|
44
|
-
'label' => '
|
40
|
+
'key' => 'confluence_user_email',
|
41
|
+
'label' => 'Confluence user email'
|
45
42
|
},
|
46
43
|
{
|
47
|
-
'key' => '
|
48
|
-
'label' => '
|
44
|
+
'key' => 'confluence_api_token',
|
45
|
+
'label' => 'Confluence user REST API Token'
|
49
46
|
},
|
50
47
|
]
|
51
48
|
end
|
@@ -61,7 +58,10 @@ module ConnectorsSdk
|
|
61
58
|
end
|
62
59
|
|
63
60
|
def client(params)
|
64
|
-
ConnectorsSdk::ConfluenceCloud::CustomClient.new(
|
61
|
+
ConnectorsSdk::ConfluenceCloud::CustomClient.new(
|
62
|
+
:base_url => extract_base_url(params),
|
63
|
+
:basic_auth_token => extract_basic_auth_token(params)
|
64
|
+
)
|
65
65
|
end
|
66
66
|
|
67
67
|
def custom_client_error
|
@@ -69,7 +69,11 @@ module ConnectorsSdk
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def config(params)
|
72
|
-
ConnectorsSdk::Atlassian::Config.new(
|
72
|
+
ConnectorsSdk::Atlassian::Config.new(
|
73
|
+
:base_url => extract_base_url(params),
|
74
|
+
:cursors => params.fetch(:cursors, {}) || {},
|
75
|
+
:index_permissions => params[:index_permissions] || false
|
76
|
+
)
|
73
77
|
end
|
74
78
|
|
75
79
|
def health_check(params)
|
@@ -79,6 +83,28 @@ module ConnectorsSdk
|
|
79
83
|
def base_url(cloud_id)
|
80
84
|
"https://api.atlassian.com/ex/confluence/#{cloud_id}"
|
81
85
|
end
|
86
|
+
|
87
|
+
def is_basic_auth(params)
|
88
|
+
login = params.fetch('confluence_user_email', nil)
|
89
|
+
api_token = params.fetch('confluence_api_token', nil)
|
90
|
+
login.present? && api_token.present?
|
91
|
+
end
|
92
|
+
|
93
|
+
def extract_basic_auth_token(params)
|
94
|
+
login = params.fetch('confluence_user_email', nil)
|
95
|
+
api_token = params.fetch('confluence_api_token', nil)
|
96
|
+
nil unless login.present? && api_token.present?
|
97
|
+
Base64.strict_encode64("#{login}:#{api_token}")
|
98
|
+
end
|
99
|
+
|
100
|
+
def extract_base_url(params)
|
101
|
+
# From Confluence API documentation:
|
102
|
+
# Requests that use OAuth 2.0 (3LO) are made via api.atlassian.com (not https://your-domain.atlassian.net).
|
103
|
+
if is_basic_auth(params)
|
104
|
+
return params[:base_url].end_with?('/wiki') ? params[:base_url] : "#{params[:base_url]}/wiki"
|
105
|
+
end
|
106
|
+
base_url(params[:cloud_id])
|
107
|
+
end
|
82
108
|
end
|
83
109
|
end
|
84
110
|
end
|
@@ -52,7 +52,8 @@ module ConnectorsSdk
|
|
52
52
|
def download(item)
|
53
53
|
content = item[:content]
|
54
54
|
parent_id = content.dig('container', 'id')
|
55
|
-
client.
|
55
|
+
base_url = client.base_url.end_with?('/wiki') ? client.base_url : "#{client.base_url}/wiki"
|
56
|
+
client.download("#{base_url}/rest/api/content/#{parent_id}/child/attachment/#{content['id']}/download").body
|
56
57
|
end
|
57
58
|
end
|
58
59
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
5
|
+
# or more contributor license agreements. Licensed under the Elastic License;
|
6
|
+
# you may not use this file except in compliance with the Elastic License.
|
7
|
+
#
|
8
|
+
require 'hashie/mash'
|
9
|
+
require 'connectors_sdk/base/adapter'
|
10
|
+
|
11
|
+
module ConnectorsSdk
|
12
|
+
module GitLab
|
13
|
+
class Adapter < ConnectorsSdk::Base::Adapter
|
14
|
+
# it's important to have this to generate ID converters between the GitLab ID and the
|
15
|
+
# Enterprise Search document ID. The Enterprise Search document ID will be prefixed with the service type,
|
16
|
+
# in our case - `gitlab`.
|
17
|
+
generate_id_helpers :gitlab, 'gitlab'
|
18
|
+
|
19
|
+
def self.to_es_document(type, source_doc)
|
20
|
+
result = {
|
21
|
+
:id => gitlab_id_to_es_id(source_doc[:id]),
|
22
|
+
:type => type,
|
23
|
+
:url => source_doc[:web_url],
|
24
|
+
:body => source_doc[:description],
|
25
|
+
:title => source_doc[:name],
|
26
|
+
:created_at => source_doc[:created_at],
|
27
|
+
:last_modified_at => source_doc[:last_activity_at],
|
28
|
+
:visibility => source_doc[:visibility],
|
29
|
+
:namespace => if source_doc[:namespace].nil?
|
30
|
+
nil
|
31
|
+
else
|
32
|
+
source_doc[:namespace][:name]
|
33
|
+
end
|
34
|
+
}
|
35
|
+
if source_doc[:_allow_permissions].present?
|
36
|
+
result[:_allow_permissions] = source_doc[:_allow_permissions]
|
37
|
+
end
|
38
|
+
result
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
3
|
+
# or more contributor license agreements. Licensed under the Elastic License;
|
4
|
+
# you may not use this file except in compliance with the Elastic License.
|
5
|
+
#
|
6
|
+
|
7
|
+
# frozen_string_literal: true
|
8
|
+
|
9
|
+
require 'connectors_sdk/base/config'
|
10
|
+
|
11
|
+
module ConnectorsSdk
|
12
|
+
module GitLab
|
13
|
+
class Config < ConnectorsSdk::Base::Config
|
14
|
+
attr_reader :index_permissions
|
15
|
+
|
16
|
+
def initialize(cursors:, index_permissions: false)
|
17
|
+
super(:cursors => cursors)
|
18
|
+
@index_permissions = index_permissions || false
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_h
|
22
|
+
super.merge(:index_permissions => index_permissions)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#
|
2
|
+
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
3
|
+
# or more contributor license agreements. Licensed under the Elastic License;
|
4
|
+
# you may not use this file except in compliance with the Elastic License.
|
5
|
+
#
|
6
|
+
|
7
|
+
# frozen_string_literal: true
|
8
|
+
|
9
|
+
require 'connectors_sdk/base/connector'
|
10
|
+
require 'connectors_sdk/gitlab/custom_client'
|
11
|
+
require 'connectors_sdk/gitlab/adapter'
|
12
|
+
require 'connectors_sdk/gitlab/config'
|
13
|
+
require 'connectors_sdk/gitlab/extractor'
|
14
|
+
require 'rack/utils'
|
15
|
+
|
16
|
+
module ConnectorsSdk
|
17
|
+
module GitLab
|
18
|
+
class Connector < ConnectorsSdk::Base::Connector
|
19
|
+
SERVICE_TYPE = 'gitlab'
|
20
|
+
|
21
|
+
def display_name
|
22
|
+
'GitLab Connector'
|
23
|
+
end
|
24
|
+
|
25
|
+
def configurable_fields
|
26
|
+
[
|
27
|
+
{
|
28
|
+
'key' => 'api_token',
|
29
|
+
'label' => 'API Token'
|
30
|
+
},
|
31
|
+
{
|
32
|
+
'key' => 'base_url',
|
33
|
+
'label' => 'Base URL'
|
34
|
+
}
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def client(params)
|
41
|
+
ConnectorsSdk::GitLab::CustomClient.new(
|
42
|
+
:base_url => params[:base_url] || ConnectorsSdk::GitLab::API_BASE_URL,
|
43
|
+
:api_token => params[:api_token]
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
def config(params)
|
48
|
+
ConnectorsSdk::GitLab::Config.new(
|
49
|
+
:cursors => params.fetch(:cursors, {}) || {},
|
50
|
+
:index_permissions => params.fetch(:index_permissions, false)
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
def extractor_class
|
55
|
+
ConnectorsSdk::GitLab::Extractor
|
56
|
+
end
|
57
|
+
|
58
|
+
def custom_client_error
|
59
|
+
ConnectorsSdk::GitLab::CustomClient::ClientError
|
60
|
+
end
|
61
|
+
|
62
|
+
def health_check(params)
|
63
|
+
# let's do a simple call
|
64
|
+
response = client(params).get('user')
|
65
|
+
unless response.present? && response.status == 200
|
66
|
+
raise "Health check failed with response status #{response.status} and body #{response.body}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#
|
2
|
+
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
3
|
+
# or more contributor license agreements. Licensed under the Elastic License;
|
4
|
+
# you may not use this file except in compliance with the Elastic License.
|
5
|
+
#
|
6
|
+
require 'faraday_middleware/response/follow_redirects'
|
7
|
+
require 'connectors_sdk/base/custom_client'
|
8
|
+
require 'connectors_shared/middleware/bearer_auth'
|
9
|
+
require 'connectors_shared/middleware/basic_auth'
|
10
|
+
require 'connectors_shared/middleware/restrict_hostnames'
|
11
|
+
|
12
|
+
module ConnectorsSdk
|
13
|
+
module GitLab
|
14
|
+
API_BASE_URL = 'https://gitlab.com/api/v4'
|
15
|
+
|
16
|
+
class CustomClient < ConnectorsSdk::Base::CustomClient
|
17
|
+
class ClientError < ConnectorsShared::ClientError
|
18
|
+
attr_reader :status_code, :endpoint
|
19
|
+
|
20
|
+
def initialize(status_code, endpoint)
|
21
|
+
@status_code = status_code
|
22
|
+
@endpoint = endpoint
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(base_url:, api_token:, ensure_fresh_auth: nil)
|
27
|
+
@api_token = api_token
|
28
|
+
super(:base_url => base_url, :ensure_fresh_auth => ensure_fresh_auth)
|
29
|
+
end
|
30
|
+
|
31
|
+
def additional_middleware
|
32
|
+
[
|
33
|
+
::FaradayMiddleware::FollowRedirects,
|
34
|
+
[ConnectorsShared::Middleware::RestrictHostnames, { :allowed_hosts => [base_url, API_BASE_URL] }],
|
35
|
+
[ConnectorsShared::Middleware::BearerAuth, { :bearer_auth_token => @api_token }]
|
36
|
+
]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
#
|
2
|
+
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
3
|
+
# or more contributor license agreements. Licensed under the Elastic License;
|
4
|
+
# you may not use this file except in compliance with the Elastic License.
|
5
|
+
#
|
6
|
+
|
7
|
+
# frozen_string_literal: true
|
8
|
+
|
9
|
+
require 'connectors_sdk/base/extractor'
|
10
|
+
require 'connectors_sdk/gitlab/custom_client'
|
11
|
+
require 'connectors_sdk/gitlab/adapter'
|
12
|
+
require 'connectors_sdk/gitlab/config'
|
13
|
+
require 'rack/utils'
|
14
|
+
|
15
|
+
module ConnectorsSdk
|
16
|
+
module GitLab
|
17
|
+
class Extractor < ConnectorsSdk::Base::Extractor
|
18
|
+
PAGE_SIZE = 100 # max is 100
|
19
|
+
|
20
|
+
def yield_document_changes(modified_since: nil)
|
21
|
+
query_params = {
|
22
|
+
:pagination => :keyset,
|
23
|
+
:per_page => PAGE_SIZE,
|
24
|
+
:order_by => :id,
|
25
|
+
:sort => :desc
|
26
|
+
}
|
27
|
+
# looks like it's an incremental sync
|
28
|
+
if modified_since.present?
|
29
|
+
date_since = modified_since.is_a?(Time) ? modified_since : Time.new(modified_since)
|
30
|
+
query_params[:last_activity_after] = date_since.iso8601
|
31
|
+
end
|
32
|
+
|
33
|
+
next_page_link = nil
|
34
|
+
|
35
|
+
loop do
|
36
|
+
if next_page_link.present?
|
37
|
+
if (matcher = /(https?:[^>]*)/.match(next_page_link))
|
38
|
+
clean_query = URI.parse(matcher.captures[0]).query
|
39
|
+
query_params = Rack::Utils.parse_query(clean_query)
|
40
|
+
else
|
41
|
+
raise "Next page link has unexpected format: #{next_page_link}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
response = client.get('projects', query_params)
|
45
|
+
|
46
|
+
JSON.parse(response.body).map do |doc|
|
47
|
+
doc = doc.with_indifferent_access
|
48
|
+
if config.index_permissions
|
49
|
+
doc = doc.merge(project_permissions(doc[:id], doc[:visibility]))
|
50
|
+
end
|
51
|
+
yield :create_or_update, ConnectorsSdk::GitLab::Adapter.to_es_document(:project, doc), nil
|
52
|
+
end
|
53
|
+
|
54
|
+
next_page_link = response.headers['Link'] || nil
|
55
|
+
break unless next_page_link.present?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def yield_deleted_ids(ids)
|
60
|
+
if ids.present?
|
61
|
+
ids.each do |id|
|
62
|
+
response = client.get("projects/#{id}")
|
63
|
+
if response.status == 404
|
64
|
+
# not found - assume deleted
|
65
|
+
yield id
|
66
|
+
else
|
67
|
+
unless response.success?
|
68
|
+
raise "Could not get a project by ID: #{id}, response code: #{response.status}, response: #{response.body}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def yield_permissions(source_user_id)
|
76
|
+
result = []
|
77
|
+
if source_user_id.present?
|
78
|
+
result.push("user:#{source_user_id}")
|
79
|
+
|
80
|
+
user_response = client.get("users/#{source_user_id}")
|
81
|
+
if user_response.success?
|
82
|
+
username = JSON.parse(user_response.body).with_indifferent_access[:username]
|
83
|
+
query = { :external => true, :username => username }
|
84
|
+
external_response = client.get('users', query)
|
85
|
+
if external_response.success?
|
86
|
+
external_users = Hashie::Array.new(JSON.parse(external_response.body))
|
87
|
+
if external_users.empty?
|
88
|
+
# the user is not external
|
89
|
+
result.push('type:internal')
|
90
|
+
end
|
91
|
+
else
|
92
|
+
raise "Could not check external user status by ID: #{source_user_id}"
|
93
|
+
end
|
94
|
+
else
|
95
|
+
raise "User isn't found by ID: #{source_user_id}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
yield result
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def project_permissions(id, visibility)
|
104
|
+
result = []
|
105
|
+
if visibility.to_sym == :public || !config.index_permissions
|
106
|
+
# visible-to-all
|
107
|
+
return {}
|
108
|
+
end
|
109
|
+
if visibility.to_sym == :internal
|
110
|
+
result.push('type:internal')
|
111
|
+
end
|
112
|
+
response = client.get("projects/#{id}/members/all")
|
113
|
+
if response.success?
|
114
|
+
members = Hashie::Array.new(JSON.parse(response.body))
|
115
|
+
result.concat(members.map { |user| "user:#{user[:id]}" })
|
116
|
+
else
|
117
|
+
raise "Could not get project members by project ID: #{id}, response code: #{response.status}, response: #{response.body}"
|
118
|
+
end
|
119
|
+
{ :_allow_permissions => result }
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: connectors_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.3.
|
4
|
+
version: 8.3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -52,6 +52,118 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: nokogiri
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: tzinfo-data
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: faraday
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: faraday_middleware
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: forwardable
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: hashie
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: httpclient
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: signet
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
55
167
|
description: ''
|
56
168
|
email: ent-search-dev@elastic.co
|
57
169
|
executables: []
|
@@ -77,6 +189,11 @@ files:
|
|
77
189
|
- lib/connectors_sdk/confluence_cloud/connector.rb
|
78
190
|
- lib/connectors_sdk/confluence_cloud/custom_client.rb
|
79
191
|
- lib/connectors_sdk/confluence_cloud/extractor.rb
|
192
|
+
- lib/connectors_sdk/gitlab/adapter.rb
|
193
|
+
- lib/connectors_sdk/gitlab/config.rb
|
194
|
+
- lib/connectors_sdk/gitlab/connector.rb
|
195
|
+
- lib/connectors_sdk/gitlab/custom_client.rb
|
196
|
+
- lib/connectors_sdk/gitlab/extractor.rb
|
80
197
|
- lib/connectors_sdk/helpers/atlassian_time_formatter.rb
|
81
198
|
- lib/connectors_sdk/office365/adapter.rb
|
82
199
|
- lib/connectors_sdk/office365/config.rb
|
@@ -99,13 +216,12 @@ files:
|
|
99
216
|
- lib/connectors_shared/middleware/bearer_auth.rb
|
100
217
|
- lib/connectors_shared/middleware/restrict_hostnames.rb
|
101
218
|
- lib/connectors_shared/monitor.rb
|
102
|
-
- lib/stubs/enterprise_search/exception_tracking.rb
|
103
219
|
homepage: https://github.com/elastic/connectors
|
104
220
|
licenses:
|
105
221
|
- Elastic-2.0
|
106
222
|
metadata:
|
107
|
-
revision:
|
108
|
-
repository: git@github.com:elastic/connectors.git
|
223
|
+
revision: ae98106feeebb94ba10c0f52dc49f3054eaa36c0
|
224
|
+
repository: git@github.com:elastic/ent-search-connectors.git
|
109
225
|
post_install_message:
|
110
226
|
rdoc_options: []
|
111
227
|
require_paths:
|
@@ -1,43 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
3
|
-
# or more contributor license agreements. Licensed under the Elastic License;
|
4
|
-
# you may not use this file except in compliance with the Elastic License.
|
5
|
-
#
|
6
|
-
|
7
|
-
module EnterpriseSearch
|
8
|
-
class ExceptionTracking
|
9
|
-
def self.capture_message(message, context = {})
|
10
|
-
AppConfig.connectors_logger.error { "Error: #{message}. Context: #{context.inspect}" }
|
11
|
-
|
12
|
-
# When the method is called from a rescue block, our return value may leak outside of its
|
13
|
-
# intended scope, so let's explicitly return nil here to be safe.
|
14
|
-
nil
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.log_exception(exception, message = nil, context: nil, logger: AppConfig.connectors_logger)
|
18
|
-
logger.error { message } if message
|
19
|
-
logger.error { generate_stack_trace(exception) }
|
20
|
-
logger.error { "Context: #{context.inspect}" } if context
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.generate_error_message(exception, message, context)
|
24
|
-
context = { :message_id => exception.id }.merge(context || {}) if exception.respond_to?(:id)
|
25
|
-
context_message = context && "Context: #{context.inspect}"
|
26
|
-
['Exception', message, exception.class.to_s, exception.message, context_message]
|
27
|
-
.compact
|
28
|
-
.map { |part| part.to_s.dup.force_encoding('UTF-8') }
|
29
|
-
.join(': ')
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.generate_stack_trace(exception)
|
33
|
-
full_message = exception.full_message
|
34
|
-
|
35
|
-
cause = exception
|
36
|
-
while cause.cause != cause && (cause = cause.cause)
|
37
|
-
full_message << "Cause:\n#{cause.full_message}"
|
38
|
-
end
|
39
|
-
|
40
|
-
full_message.dup.force_encoding('UTF-8')
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|