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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 21bd11a44ed7c45fa04b218346fda20d946b97ec8f7025c2cfb8c8f92321d6a3
4
- data.tar.gz: b388f972974f32c59d719b809975229125e293045dd35559546fefe5485e1fc3
3
+ metadata.gz: 929c0ce8ad8eaf2ab34849ee4f0b476c37e5cfe12994bf73aa183be58c350213
4
+ data.tar.gz: 9e7189b26959b4bb74e097a6e0a2effb3ade9a0b730dbccee5c23f5d0cedebd1
5
5
  SHA512:
6
- metadata.gz: 88aa76506d6f2af049ea2a2ff54797270cef692319dd9ca647d33903a9fb3bb8bb274d9d99a3f94fe4d54cfce1722b31d63203cd157b627ccf3b2ca541b63523
7
- data.tar.gz: 3faf8e16b18c0abd4f13fa988de8a6bb03e95bce5738389f132748fc17a230a9e516eb8b9f898d60aeb8a869f1ad1dadbb8606178e01be7d9ccc63ca98dcf681
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:, ensure_fresh_auth: nil)
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
- ::FaradayMiddleware::FollowRedirects,
47
- [ConnectorsShared::Middleware::RestrictHostnames, { :allowed_hosts => [base_url, MEDIA_API_BASE_URL] }],
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' => 'client_id',
44
- 'label' => 'Client ID'
40
+ 'key' => 'confluence_user_email',
41
+ 'label' => 'Confluence user email'
45
42
  },
46
43
  {
47
- 'key' => 'client_secret',
48
- 'label' => 'Client Secret'
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(:base_url => base_url(params[:cloud_id]), :access_token => params[:access_token])
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(:base_url => "#{params[:external_connector_base_url]}/wiki", :cursors => params.fetch(:cursors, {}) || {})
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.download("#{client.base_url}/wiki/rest/api/content/#{parent_id}/child/attachment/#{content['id']}/download").body
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.0.0
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-05-25 00:00:00.000000000 Z
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: 8fe65b05c8d8c89d62d73e7d717238a5393d42f5
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