apimatic-semgrep-sdk 0.0.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/LICENSE +28 -0
- data/README.md +205 -0
- data/bin/console +15 -0
- data/lib/semgrep_web_app/api_helper.rb +10 -0
- data/lib/semgrep_web_app/apis/base_api.rb +67 -0
- data/lib/semgrep_web_app/apis/deployments_service_api.rb +29 -0
- data/lib/semgrep_web_app/apis/findings_service_api.rb +107 -0
- data/lib/semgrep_web_app/apis/misc_service_api.rb +47 -0
- data/lib/semgrep_web_app/apis/policies_service_api.rb +97 -0
- data/lib/semgrep_web_app/apis/projects_service_api.rb +238 -0
- data/lib/semgrep_web_app/apis/scans_service_api.rb +65 -0
- data/lib/semgrep_web_app/apis/secrets_service_api.rb +55 -0
- data/lib/semgrep_web_app/apis/supply_chain_service_api.rb +154 -0
- data/lib/semgrep_web_app/apis/ticketing_service_api.rb +144 -0
- data/lib/semgrep_web_app/apis/triage_service_api.rb +43 -0
- data/lib/semgrep_web_app/client.rb +136 -0
- data/lib/semgrep_web_app/configuration.rb +178 -0
- data/lib/semgrep_web_app/exceptions/api_exception.rb +21 -0
- data/lib/semgrep_web_app/http/api_response.rb +19 -0
- data/lib/semgrep_web_app/http/auth/semgrep_admin_jwt.rb +53 -0
- data/lib/semgrep_web_app/http/auth/semgrep_jwt.rb +53 -0
- data/lib/semgrep_web_app/http/auth/semgrep_web_token.rb +53 -0
- data/lib/semgrep_web_app/http/http_call_back.rb +10 -0
- data/lib/semgrep_web_app/http/http_method_enum.rb +10 -0
- data/lib/semgrep_web_app/http/http_request.rb +10 -0
- data/lib/semgrep_web_app/http/http_response.rb +10 -0
- data/lib/semgrep_web_app/http/proxy_settings.rb +22 -0
- data/lib/semgrep_web_app/logging/configuration/api_logging_configuration.rb +186 -0
- data/lib/semgrep_web_app/logging/sdk_logger.rb +17 -0
- data/lib/semgrep_web_app/models/add_project_tags_request.rb +96 -0
- data/lib/semgrep_web_app/models/add_project_tags_response.rb +73 -0
- data/lib/semgrep_web_app/models/ai_powered_scan_finding.rb +426 -0
- data/lib/semgrep_web_app/models/ai_sast_findings.rb +85 -0
- data/lib/semgrep_web_app/models/api_v1_deployments_findings_response.rb +87 -0
- data/lib/semgrep_web_app/models/assistant.rb +127 -0
- data/lib/semgrep_web_app/models/autofix.rb +98 -0
- data/lib/semgrep_web_app/models/autotriage.rb +98 -0
- data/lib/semgrep_web_app/models/autotriage_verdict.rb +36 -0
- data/lib/semgrep_web_app/models/autotriage_verdict2.rb +38 -0
- data/lib/semgrep_web_app/models/base_model.rb +110 -0
- data/lib/semgrep_web_app/models/bulk_triage_request.rb +393 -0
- data/lib/semgrep_web_app/models/bulk_triage_response.rb +83 -0
- data/lib/semgrep_web_app/models/click_to_fix_failure.rb +95 -0
- data/lib/semgrep_web_app/models/click_to_fix_pr.rb +95 -0
- data/lib/semgrep_web_app/models/click_to_fix_pr_state.rb +38 -0
- data/lib/semgrep_web_app/models/component.rb +95 -0
- data/lib/semgrep_web_app/models/confidence.rb +42 -0
- data/lib/semgrep_web_app/models/confidence1.rb +40 -0
- data/lib/semgrep_web_app/models/confidence2.rb +40 -0
- data/lib/semgrep_web_app/models/confidence3.rb +40 -0
- data/lib/semgrep_web_app/models/confidence7.rb +41 -0
- data/lib/semgrep_web_app/models/confidence8.rb +42 -0
- data/lib/semgrep_web_app/models/create_sbom_export_request.rb +176 -0
- data/lib/semgrep_web_app/models/create_sbom_export_response.rb +74 -0
- data/lib/semgrep_web_app/models/create_ticket_request.rb +393 -0
- data/lib/semgrep_web_app/models/cyclonedx_version.rb +48 -0
- data/lib/semgrep_web_app/models/delete_project_response.rb +74 -0
- data/lib/semgrep_web_app/models/delete_project_tags_response.rb +73 -0
- data/lib/semgrep_web_app/models/deployment.rb +102 -0
- data/lib/semgrep_web_app/models/ecosystem.rb +91 -0
- data/lib/semgrep_web_app/models/ecosystem1.rb +92 -0
- data/lib/semgrep_web_app/models/ecosystem2.rb +76 -0
- data/lib/semgrep_web_app/models/endpoint_reference.rb +72 -0
- data/lib/semgrep_web_app/models/epss_probability.rb +45 -0
- data/lib/semgrep_web_app/models/epss_score.rb +95 -0
- data/lib/semgrep_web_app/models/exposures.rb +50 -0
- data/lib/semgrep_web_app/models/exposures2.rb +51 -0
- data/lib/semgrep_web_app/models/external_ticket.rb +116 -0
- data/lib/semgrep_web_app/models/finding_location.rb +126 -0
- data/lib/semgrep_web_app/models/finding_repository.rb +95 -0
- data/lib/semgrep_web_app/models/finding_rule.rb +158 -0
- data/lib/semgrep_web_app/models/fix_recommendation.rb +95 -0
- data/lib/semgrep_web_app/models/float_range.rb +85 -0
- data/lib/semgrep_web_app/models/format.rb +27 -0
- data/lib/semgrep_web_app/models/found_dependency.rb +128 -0
- data/lib/semgrep_web_app/models/get_project_response.rb +73 -0
- data/lib/semgrep_web_app/models/get_sbom_export_response.rb +100 -0
- data/lib/semgrep_web_app/models/guidance.rb +98 -0
- data/lib/semgrep_web_app/models/issue_type.rb +40 -0
- data/lib/semgrep_web_app/models/issue_type1.rb +40 -0
- data/lib/semgrep_web_app/models/issue_type2.rb +42 -0
- data/lib/semgrep_web_app/models/license_policy_settings.rb +42 -0
- data/lib/semgrep_web_app/models/link_ticket_request.rb +93 -0
- data/lib/semgrep_web_app/models/list_dependencies_request.rb +108 -0
- data/lib/semgrep_web_app/models/list_dependencies_response.rb +102 -0
- data/lib/semgrep_web_app/models/list_findings_response.rb +100 -0
- data/lib/semgrep_web_app/models/list_lockfiles_for_dependencies_request.rb +118 -0
- data/lib/semgrep_web_app/models/list_lockfiles_for_dependencies_response.rb +103 -0
- data/lib/semgrep_web_app/models/list_project.rb +145 -0
- data/lib/semgrep_web_app/models/list_projects_response.rb +82 -0
- data/lib/semgrep_web_app/models/list_repositories_for_dependencies_request.rb +107 -0
- data/lib/semgrep_web_app/models/list_repositories_for_dependencies_response.rb +103 -0
- data/lib/semgrep_web_app/models/managed_scan_config.rb +85 -0
- data/lib/semgrep_web_app/models/metadata_component_type.rb +101 -0
- data/lib/semgrep_web_app/models/mode.rb +48 -0
- data/lib/semgrep_web_app/models/new_triage_reason.rb +48 -0
- data/lib/semgrep_web_app/models/new_triage_state.rb +48 -0
- data/lib/semgrep_web_app/models/policy.rb +118 -0
- data/lib/semgrep_web_app/models/policy_mode.rb +48 -0
- data/lib/semgrep_web_app/models/policy_mode1.rb +40 -0
- data/lib/semgrep_web_app/models/policy_mode3.rb +51 -0
- data/lib/semgrep_web_app/models/policy_reference.rb +105 -0
- data/lib/semgrep_web_app/models/product_type.rb +38 -0
- data/lib/semgrep_web_app/models/products.rb +46 -0
- data/lib/semgrep_web_app/models/project.rb +157 -0
- data/lib/semgrep_web_app/models/protos_ai_v1_autotriage.rb +154 -0
- data/lib/semgrep_web_app/models/protos_ai_v1_autotriage_feedback.rb +98 -0
- data/lib/semgrep_web_app/models/protos_common_v1_review_comment.rb +90 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_create_ticket_response.rb +123 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_create_ticket_response_ticket_creation_failed.rb +85 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_create_ticket_response_ticket_creation_skipped.rb +85 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_create_ticket_response_ticket_creation_success.rb +106 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_delete_ticket_response.rb +76 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_diff_scan.rb +75 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_full_scan.rb +75 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_get_bootstrap_sms_vpc_response.rb +130 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_get_scan_response.rb +168 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_get_scan_response_scan_meta.rb +256 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_link_ticket_response.rb +119 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_list_deployments_response.rb +85 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_list_policies_response.rb +84 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_list_policy_rules_response.rb +104 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_list_secrets_path_response.rb +104 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_search_scans_response.rb +94 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_unlink_ticket_response.rb +77 -0
- data/lib/semgrep_web_app/models/protos_openapi_v1_update_policy_response.rb +88 -0
- data/lib/semgrep_web_app/models/protos_sca_v1_code_location.rb +144 -0
- data/lib/semgrep_web_app/models/protos_sca_v1_dependency.rb +87 -0
- data/lib/semgrep_web_app/models/protos_sca_v1_dependency_filter.rb +199 -0
- data/lib/semgrep_web_app/models/protos_sca_v1_found_dependency.rb +174 -0
- data/lib/semgrep_web_app/models/protos_sca_v1_lockfile_dependency_summary.rb +87 -0
- data/lib/semgrep_web_app/models/protos_sca_v1_package_filter.rb +124 -0
- data/lib/semgrep_web_app/models/protos_sca_v1_repository_dependency_summary.rb +111 -0
- data/lib/semgrep_web_app/models/protos_sca_v1_sbom_format_version.rb +109 -0
- data/lib/semgrep_web_app/models/protos_sca_v1_sbom_metadata_contact.rb +95 -0
- data/lib/semgrep_web_app/models/protos_sca_v1_sbom_metadata_supplier.rb +95 -0
- data/lib/semgrep_web_app/models/protos_scan_v1_scan_findings_counts.rb +105 -0
- data/lib/semgrep_web_app/models/protos_scan_v1_scan_public.rb +228 -0
- data/lib/semgrep_web_app/models/protos_secrets_v1_historical_info.rb +116 -0
- data/lib/semgrep_web_app/models/protos_secrets_v1_secrets_finding.rb +320 -0
- data/lib/semgrep_web_app/models/protos_secrets_v1_secrets_finding_repository.rb +121 -0
- data/lib/semgrep_web_app/models/protos_ticketing_v1_external_ticket.rb +106 -0
- data/lib/semgrep_web_app/models/rating.rb +38 -0
- data/lib/semgrep_web_app/models/reachability.rb +48 -0
- data/lib/semgrep_web_app/models/repository_visibility.rb +40 -0
- data/lib/semgrep_web_app/models/review_comment.rb +100 -0
- data/lib/semgrep_web_app/models/risk.rb +40 -0
- data/lib/semgrep_web_app/models/rule.rb +292 -0
- data/lib/semgrep_web_app/models/rule_explanation.rb +98 -0
- data/lib/semgrep_web_app/models/sast_finding.rb +426 -0
- data/lib/semgrep_web_app/models/sast_findings.rb +84 -0
- data/lib/semgrep_web_app/models/sbom_output_format.rb +37 -0
- data/lib/semgrep_web_app/models/sca_finding.rb +458 -0
- data/lib/semgrep_web_app/models/sca_findings.rb +85 -0
- data/lib/semgrep_web_app/models/scm_type.rb +70 -0
- data/lib/semgrep_web_app/models/search_scans_request.rb +202 -0
- data/lib/semgrep_web_app/models/severities.rb +44 -0
- data/lib/semgrep_web_app/models/severities2.rb +45 -0
- data/lib/semgrep_web_app/models/severity.rb +46 -0
- data/lib/semgrep_web_app/models/severity1.rb +45 -0
- data/lib/semgrep_web_app/models/severity4.rb +46 -0
- data/lib/semgrep_web_app/models/severity5.rb +48 -0
- data/lib/semgrep_web_app/models/source.rb +42 -0
- data/lib/semgrep_web_app/models/state.rb +42 -0
- data/lib/semgrep_web_app/models/status.rb +55 -0
- data/lib/semgrep_web_app/models/status1.rb +52 -0
- data/lib/semgrep_web_app/models/status3.rb +44 -0
- data/lib/semgrep_web_app/models/status6.rb +55 -0
- data/lib/semgrep_web_app/models/status7.rb +59 -0
- data/lib/semgrep_web_app/models/status8.rb +61 -0
- data/lib/semgrep_web_app/models/status9.rb +55 -0
- data/lib/semgrep_web_app/models/statuses.rb +63 -0
- data/lib/semgrep_web_app/models/toggle_project_managed_scan_request.rb +108 -0
- data/lib/semgrep_web_app/models/toggle_project_managed_scan_response.rb +73 -0
- data/lib/semgrep_web_app/models/transitivities.rb +40 -0
- data/lib/semgrep_web_app/models/transitivities2.rb +42 -0
- data/lib/semgrep_web_app/models/transitivity.rb +41 -0
- data/lib/semgrep_web_app/models/transitivity1.rb +42 -0
- data/lib/semgrep_web_app/models/transitivity2.rb +40 -0
- data/lib/semgrep_web_app/models/triage_reason.rb +48 -0
- data/lib/semgrep_web_app/models/triage_reasons.rb +48 -0
- data/lib/semgrep_web_app/models/triage_reasons2.rb +50 -0
- data/lib/semgrep_web_app/models/triage_state.rb +54 -0
- data/lib/semgrep_web_app/models/unlink_ticket_request.rb +83 -0
- data/lib/semgrep_web_app/models/update_policy_request.rb +113 -0
- data/lib/semgrep_web_app/models/update_project_request.rb +121 -0
- data/lib/semgrep_web_app/models/update_project_response.rb +73 -0
- data/lib/semgrep_web_app/models/usage.rb +99 -0
- data/lib/semgrep_web_app/models/validation_state.rb +45 -0
- data/lib/semgrep_web_app/models/validation_state2.rb +47 -0
- data/lib/semgrep_web_app/models/validation_state3.rb +48 -0
- data/lib/semgrep_web_app/models/verdict.rb +41 -0
- data/lib/semgrep_web_app/models/verdict1.rb +38 -0
- data/lib/semgrep_web_app/models/visibility.rb +42 -0
- data/lib/semgrep_web_app/utilities/date_time_helper.rb +11 -0
- data/lib/semgrep_web_app/utilities/file_wrapper.rb +28 -0
- data/lib/semgrep_web_app/utilities/union_type_lookup.rb +34 -0
- data/lib/semgrep_web_app.rb +245 -0
- metadata +283 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# semgrep_web_app
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated by APIMATIC v3.0 (
|
|
4
|
+
# https://www.apimatic.io ).
|
|
5
|
+
|
|
6
|
+
module SemgrepWebApp
|
|
7
|
+
# TriageServiceApi
|
|
8
|
+
class TriageServiceApi < BaseApi
|
|
9
|
+
# Bulk triage your findings. You can select the findings to triage by
|
|
10
|
+
# passing in a list of finding IDs as issue_ids, or by passing in filter
|
|
11
|
+
# query parameters. You must specify the issue_type of the findings you want
|
|
12
|
+
# to bulk triage. One of new_triage_state or new_note is required. If
|
|
13
|
+
# specifying a new_triage_reason, you must also use
|
|
14
|
+
# new_triage_state=ignored. Some filters only apply for findings associated
|
|
15
|
+
# with a given product.
|
|
16
|
+
# @param [String] deployment_slug Required parameter: TODO: type description
|
|
17
|
+
# here
|
|
18
|
+
# @param [BulkTriageRequest] body Required parameter: TODO: type description
|
|
19
|
+
# here
|
|
20
|
+
# @return [ApiResponse] Complete http response with raw body and status code.
|
|
21
|
+
def triage_service_bulk_triage(deployment_slug,
|
|
22
|
+
body)
|
|
23
|
+
@api_call
|
|
24
|
+
.request(new_request_builder(HttpMethodEnum::POST,
|
|
25
|
+
'/api/v1/deployments/{deploymentSlug}/triage',
|
|
26
|
+
Server::SEMGREP)
|
|
27
|
+
.template_param(new_parameter(deployment_slug, key: 'deploymentSlug')
|
|
28
|
+
.is_required(true)
|
|
29
|
+
.should_encode(true))
|
|
30
|
+
.header_param(new_parameter('application/json', key: 'Content-Type'))
|
|
31
|
+
.body_param(new_parameter(body)
|
|
32
|
+
.is_required(true))
|
|
33
|
+
.header_param(new_parameter('application/json', key: 'accept'))
|
|
34
|
+
.body_serializer(proc do |param| param.to_json unless param.nil? end)
|
|
35
|
+
.auth(Single.new('SemgrepWebToken')))
|
|
36
|
+
.response(new_response_handler
|
|
37
|
+
.deserializer(APIHelper.method(:custom_type_deserializer))
|
|
38
|
+
.deserialize_into(BulkTriageResponse.method(:from_hash))
|
|
39
|
+
.is_api_response(true))
|
|
40
|
+
.execute
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# semgrep_web_app
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated by APIMATIC v3.0 (
|
|
4
|
+
# https://www.apimatic.io ).
|
|
5
|
+
|
|
6
|
+
module SemgrepWebApp
|
|
7
|
+
# semgrep_web_app client class.
|
|
8
|
+
class Client
|
|
9
|
+
include CoreLibrary
|
|
10
|
+
attr_reader :config, :auth_managers
|
|
11
|
+
|
|
12
|
+
def user_agent_detail
|
|
13
|
+
config.user_agent_detail
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Access to deployments_service controller.
|
|
17
|
+
# @return [DeploymentsServiceApi] Returns the controller instance.
|
|
18
|
+
def deployments_service
|
|
19
|
+
@deployments_service ||= DeploymentsServiceApi.new @global_configuration
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Access to findings_service controller.
|
|
23
|
+
# @return [FindingsServiceApi] Returns the controller instance.
|
|
24
|
+
def findings_service
|
|
25
|
+
@findings_service ||= FindingsServiceApi.new @global_configuration
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Access to misc_service controller.
|
|
29
|
+
# @return [MiscServiceApi] Returns the controller instance.
|
|
30
|
+
def misc_service
|
|
31
|
+
@misc_service ||= MiscServiceApi.new @global_configuration
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Access to policies_service controller.
|
|
35
|
+
# @return [PoliciesServiceApi] Returns the controller instance.
|
|
36
|
+
def policies_service
|
|
37
|
+
@policies_service ||= PoliciesServiceApi.new @global_configuration
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Access to projects_service controller.
|
|
41
|
+
# @return [ProjectsServiceApi] Returns the controller instance.
|
|
42
|
+
def projects_service
|
|
43
|
+
@projects_service ||= ProjectsServiceApi.new @global_configuration
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Access to scans_service controller.
|
|
47
|
+
# @return [ScansServiceApi] Returns the controller instance.
|
|
48
|
+
def scans_service
|
|
49
|
+
@scans_service ||= ScansServiceApi.new @global_configuration
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Access to secrets_service controller.
|
|
53
|
+
# @return [SecretsServiceApi] Returns the controller instance.
|
|
54
|
+
def secrets_service
|
|
55
|
+
@secrets_service ||= SecretsServiceApi.new @global_configuration
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Access to supply_chain_service controller.
|
|
59
|
+
# @return [SupplyChainServiceApi] Returns the controller instance.
|
|
60
|
+
def supply_chain_service
|
|
61
|
+
@supply_chain_service ||= SupplyChainServiceApi.new @global_configuration
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Access to ticketing_service controller.
|
|
65
|
+
# @return [TicketingServiceApi] Returns the controller instance.
|
|
66
|
+
def ticketing_service
|
|
67
|
+
@ticketing_service ||= TicketingServiceApi.new @global_configuration
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Access to triage_service controller.
|
|
71
|
+
# @return [TriageServiceApi] Returns the controller instance.
|
|
72
|
+
def triage_service
|
|
73
|
+
@triage_service ||= TriageServiceApi.new @global_configuration
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def initialize(
|
|
77
|
+
connection: nil, adapter: :net_http_persistent, timeout: 30,
|
|
78
|
+
max_retries: 0, retry_interval: 1, backoff_factor: 2,
|
|
79
|
+
retry_statuses: [408, 413, 429, 500, 502, 503, 504, 521, 522, 524],
|
|
80
|
+
retry_methods: %i[get put], http_callback: nil, proxy_settings: nil,
|
|
81
|
+
logging_configuration: nil, environment: Environment::PRODUCTION,
|
|
82
|
+
semgrep_admin_jwt_credentials: nil, semgrep_jwt_credentials: nil,
|
|
83
|
+
semgrep_web_token_credentials: nil, config: nil
|
|
84
|
+
)
|
|
85
|
+
@config = if config.nil?
|
|
86
|
+
Configuration.new(
|
|
87
|
+
connection: connection, adapter: adapter, timeout: timeout,
|
|
88
|
+
max_retries: max_retries, retry_interval: retry_interval,
|
|
89
|
+
backoff_factor: backoff_factor,
|
|
90
|
+
retry_statuses: retry_statuses,
|
|
91
|
+
retry_methods: retry_methods, http_callback: http_callback,
|
|
92
|
+
proxy_settings: proxy_settings,
|
|
93
|
+
logging_configuration: logging_configuration,
|
|
94
|
+
environment: environment,
|
|
95
|
+
semgrep_admin_jwt_credentials: semgrep_admin_jwt_credentials,
|
|
96
|
+
semgrep_jwt_credentials: semgrep_jwt_credentials,
|
|
97
|
+
semgrep_web_token_credentials: semgrep_web_token_credentials
|
|
98
|
+
)
|
|
99
|
+
else
|
|
100
|
+
config
|
|
101
|
+
end
|
|
102
|
+
user_agent_params = BaseApi.user_agent_parameters
|
|
103
|
+
|
|
104
|
+
@global_configuration = GlobalConfiguration.new(client_configuration: @config)
|
|
105
|
+
.base_uri_executor(@config.method(:get_base_uri))
|
|
106
|
+
.global_errors(BaseApi::GLOBAL_ERRORS)
|
|
107
|
+
.user_agent(BaseApi.user_agent,
|
|
108
|
+
agent_parameters: user_agent_params)
|
|
109
|
+
|
|
110
|
+
initialize_auth_managers(@global_configuration)
|
|
111
|
+
@global_configuration = @global_configuration.auth_managers(@auth_managers)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Initializes the auth managers hash used for authenticating API calls.
|
|
115
|
+
# @param [GlobalConfiguration] global_config The global configuration of the SDK)
|
|
116
|
+
def initialize_auth_managers(global_config)
|
|
117
|
+
@auth_managers = {}
|
|
118
|
+
http_client_config = global_config.client_configuration
|
|
119
|
+
%w[SemgrepAdminJWT SemgrepJWT SemgrepWebToken].each { |auth| @auth_managers[auth] = nil }
|
|
120
|
+
@auth_managers['SemgrepAdminJWT'] = SemgrepAdminJwt.new(
|
|
121
|
+
http_client_config.semgrep_admin_jwt_credentials
|
|
122
|
+
)
|
|
123
|
+
@auth_managers['SemgrepJWT'] = SemgrepJwt.new(http_client_config.semgrep_jwt_credentials)
|
|
124
|
+
@auth_managers['SemgrepWebToken'] = SemgrepWebToken.new(
|
|
125
|
+
http_client_config.semgrep_web_token_credentials
|
|
126
|
+
)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Creates a client directly from environment variables.
|
|
130
|
+
def self.from_env(**overrides)
|
|
131
|
+
default_config = Configuration.build_default_config_from_env
|
|
132
|
+
new_config = default_config.clone_with(**overrides)
|
|
133
|
+
new(config: new_config)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# semgrep_web_app
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated by APIMATIC v3.0 (
|
|
4
|
+
# https://www.apimatic.io ).
|
|
5
|
+
|
|
6
|
+
module SemgrepWebApp
|
|
7
|
+
# An enum for SDK environments.
|
|
8
|
+
class Environment
|
|
9
|
+
ENVIRONMENT = [
|
|
10
|
+
PRODUCTION = 'Production'.freeze
|
|
11
|
+
].freeze
|
|
12
|
+
|
|
13
|
+
# Converts a string or symbol into a valid Environment constant.
|
|
14
|
+
def self.from_value(value, default_value = PRODUCTION)
|
|
15
|
+
return default_value if value.nil?
|
|
16
|
+
|
|
17
|
+
default_value
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# An enum for API servers.
|
|
22
|
+
class Server
|
|
23
|
+
SERVER = [
|
|
24
|
+
SEMGREP = 'semgrep'.freeze
|
|
25
|
+
].freeze
|
|
26
|
+
|
|
27
|
+
# Converts a string or symbol into a valid Server constant.
|
|
28
|
+
def self.from_value(value, default_value = SEMGREP)
|
|
29
|
+
return default_value if value.nil?
|
|
30
|
+
|
|
31
|
+
default_value
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# All configuration including auth info and base URI for the API access
|
|
36
|
+
# are configured in this class.
|
|
37
|
+
class Configuration < CoreLibrary::HttpClientConfiguration
|
|
38
|
+
# The attribute readers for properties.
|
|
39
|
+
attr_reader :environment, :semgrep_admin_jwt_credentials,
|
|
40
|
+
:semgrep_jwt_credentials, :semgrep_web_token_credentials
|
|
41
|
+
|
|
42
|
+
class << self
|
|
43
|
+
attr_reader :environments
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def initialize(
|
|
47
|
+
connection: nil, adapter: :net_http_persistent, timeout: 30,
|
|
48
|
+
max_retries: 0, retry_interval: 1, backoff_factor: 2,
|
|
49
|
+
retry_statuses: [408, 413, 429, 500, 502, 503, 504, 521, 522, 524],
|
|
50
|
+
retry_methods: %i[get put], http_callback: nil, proxy_settings: nil,
|
|
51
|
+
logging_configuration: nil, environment: Environment::PRODUCTION,
|
|
52
|
+
semgrep_admin_jwt_credentials: nil, semgrep_jwt_credentials: nil,
|
|
53
|
+
semgrep_web_token_credentials: nil
|
|
54
|
+
)
|
|
55
|
+
super connection: connection, adapter: adapter, timeout: timeout,
|
|
56
|
+
max_retries: max_retries, retry_interval: retry_interval,
|
|
57
|
+
backoff_factor: backoff_factor, retry_statuses: retry_statuses,
|
|
58
|
+
retry_methods: retry_methods, http_callback: http_callback,
|
|
59
|
+
proxy_settings: proxy_settings,
|
|
60
|
+
logging_configuration: logging_configuration
|
|
61
|
+
|
|
62
|
+
# Current API environment
|
|
63
|
+
@environment = String(environment)
|
|
64
|
+
|
|
65
|
+
# The object holding OAuth 2 Bearer token credentials
|
|
66
|
+
@semgrep_admin_jwt_credentials = semgrep_admin_jwt_credentials
|
|
67
|
+
|
|
68
|
+
# The object holding OAuth 2 Bearer token credentials
|
|
69
|
+
@semgrep_jwt_credentials = semgrep_jwt_credentials
|
|
70
|
+
|
|
71
|
+
# The object holding OAuth 2 Bearer token credentials
|
|
72
|
+
@semgrep_web_token_credentials = semgrep_web_token_credentials
|
|
73
|
+
|
|
74
|
+
# The Http Client to use for making requests.
|
|
75
|
+
set_http_client CoreLibrary::FaradayClient.new(self)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def clone_with(connection: nil, adapter: nil, timeout: nil,
|
|
79
|
+
max_retries: nil, retry_interval: nil, backoff_factor: nil,
|
|
80
|
+
retry_statuses: nil, retry_methods: nil, http_callback: nil,
|
|
81
|
+
proxy_settings: nil, logging_configuration: nil,
|
|
82
|
+
environment: nil, semgrep_admin_jwt_credentials: nil,
|
|
83
|
+
semgrep_jwt_credentials: nil,
|
|
84
|
+
semgrep_web_token_credentials: nil)
|
|
85
|
+
connection ||= self.connection
|
|
86
|
+
adapter ||= self.adapter
|
|
87
|
+
timeout ||= self.timeout
|
|
88
|
+
max_retries ||= self.max_retries
|
|
89
|
+
retry_interval ||= self.retry_interval
|
|
90
|
+
backoff_factor ||= self.backoff_factor
|
|
91
|
+
retry_statuses ||= self.retry_statuses
|
|
92
|
+
retry_methods ||= self.retry_methods
|
|
93
|
+
http_callback ||= self.http_callback
|
|
94
|
+
proxy_settings ||= self.proxy_settings
|
|
95
|
+
logging_configuration ||= self.logging_configuration
|
|
96
|
+
environment ||= self.environment
|
|
97
|
+
semgrep_admin_jwt_credentials ||= self.semgrep_admin_jwt_credentials
|
|
98
|
+
semgrep_jwt_credentials ||= self.semgrep_jwt_credentials
|
|
99
|
+
semgrep_web_token_credentials ||= self.semgrep_web_token_credentials
|
|
100
|
+
|
|
101
|
+
Configuration.new(
|
|
102
|
+
connection: connection, adapter: adapter, timeout: timeout,
|
|
103
|
+
max_retries: max_retries, retry_interval: retry_interval,
|
|
104
|
+
backoff_factor: backoff_factor, retry_statuses: retry_statuses,
|
|
105
|
+
retry_methods: retry_methods, http_callback: http_callback,
|
|
106
|
+
proxy_settings: proxy_settings,
|
|
107
|
+
logging_configuration: logging_configuration, environment: environment,
|
|
108
|
+
semgrep_admin_jwt_credentials: semgrep_admin_jwt_credentials,
|
|
109
|
+
semgrep_jwt_credentials: semgrep_jwt_credentials,
|
|
110
|
+
semgrep_web_token_credentials: semgrep_web_token_credentials
|
|
111
|
+
)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
# All the environments the SDK can run in.
|
|
116
|
+
ENVIRONMENTS = {
|
|
117
|
+
Environment::PRODUCTION => {
|
|
118
|
+
Server::SEMGREP => 'https://semgrep.dev'
|
|
119
|
+
}
|
|
120
|
+
}.freeze
|
|
121
|
+
|
|
122
|
+
# Generates the appropriate base URI for the environment and the server.
|
|
123
|
+
# @param [Configuration::Server] server The server enum for which the base URI is
|
|
124
|
+
# required.
|
|
125
|
+
# @return [String] The base URI.
|
|
126
|
+
def get_base_uri(server = Server::SEMGREP)
|
|
127
|
+
ENVIRONMENTS[environment][server].clone
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Builds a Configuration instance using environment variables.
|
|
131
|
+
def self.build_default_config_from_env
|
|
132
|
+
# === Core environment ===
|
|
133
|
+
environment = Environment.from_value(ENV.fetch('ENVIRONMENT', 'production'))
|
|
134
|
+
timeout = (ENV['TIMEOUT'] || 30).to_f
|
|
135
|
+
max_retries = (ENV['MAX_RETRIES'] || 0).to_i
|
|
136
|
+
retry_interval = (ENV['RETRY_INTERVAL'] || 1).to_f
|
|
137
|
+
backoff_factor = (ENV['BACKOFF_FACTOR'] || 2).to_f
|
|
138
|
+
retry_statuses = ENV.fetch('RETRY_STATUSES',
|
|
139
|
+
'[408, 413, 429, 500, 502, 503, 504, 521, 522, 524]').gsub(/[\[\]]/, '')
|
|
140
|
+
.split(',')
|
|
141
|
+
.map(&:strip)
|
|
142
|
+
.map do |item|
|
|
143
|
+
item.match?(/\A\d+\z/) ? item.to_i : item.downcase
|
|
144
|
+
end
|
|
145
|
+
retry_methods = ENV.fetch('RETRY_METHODS', '%i[get put]').gsub(/[\[\]]/, '')
|
|
146
|
+
.split(',')
|
|
147
|
+
.map(&:strip)
|
|
148
|
+
.map do |item|
|
|
149
|
+
item.match?(/\A\d+\z/) ? item.to_i : item.downcase
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# === Authentication credentials ===
|
|
153
|
+
semgrep_admin_jwt_credentials = SemgrepAdminJwtCredentials.from_env
|
|
154
|
+
semgrep_jwt_credentials = SemgrepJwtCredentials.from_env
|
|
155
|
+
semgrep_web_token_credentials = SemgrepWebTokenCredentials.from_env
|
|
156
|
+
|
|
157
|
+
# === Proxy settings ===
|
|
158
|
+
proxy_settings = ProxySettings.from_env
|
|
159
|
+
# === Logging Configuration ===
|
|
160
|
+
logging_configuration = LoggingConfiguration.from_env if LoggingConfiguration.any_logging_configured?
|
|
161
|
+
|
|
162
|
+
Configuration.new(
|
|
163
|
+
environment: environment,
|
|
164
|
+
timeout: timeout,
|
|
165
|
+
max_retries: max_retries,
|
|
166
|
+
retry_interval: retry_interval,
|
|
167
|
+
backoff_factor: backoff_factor,
|
|
168
|
+
retry_statuses: retry_statuses,
|
|
169
|
+
retry_methods: retry_methods,
|
|
170
|
+
semgrep_admin_jwt_credentials: semgrep_admin_jwt_credentials,
|
|
171
|
+
semgrep_jwt_credentials: semgrep_jwt_credentials,
|
|
172
|
+
semgrep_web_token_credentials: semgrep_web_token_credentials,
|
|
173
|
+
proxy_settings: proxy_settings,
|
|
174
|
+
logging_configuration: logging_configuration
|
|
175
|
+
)
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# semgrep_web_app
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated by APIMATIC v3.0 (
|
|
4
|
+
# https://www.apimatic.io ).
|
|
5
|
+
|
|
6
|
+
module SemgrepWebApp
|
|
7
|
+
# Class for exceptions when there is a network error, status code error, etc.
|
|
8
|
+
class APIException < CoreLibrary::ApiException
|
|
9
|
+
# Provides a human-readable string representation of the object.
|
|
10
|
+
def to_s
|
|
11
|
+
class_name = self.class.name.split('::').last
|
|
12
|
+
"<#{class_name} status_code: #{@response_code}, reason: #{@reason}>"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Provides a debugging-friendly string with detailed object information.
|
|
16
|
+
def inspect
|
|
17
|
+
class_name = self.class.name.split('::').last
|
|
18
|
+
"<#{class_name} status_code: #{@response_code.inspect}, reason: #{@reason.inspect}>"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# semgrep_web_app
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated by APIMATIC v3.0 (
|
|
4
|
+
# https://www.apimatic.io ).
|
|
5
|
+
|
|
6
|
+
module SemgrepWebApp
|
|
7
|
+
# Http response received.
|
|
8
|
+
class ApiResponse < CoreLibrary::ApiResponse
|
|
9
|
+
# The constructor
|
|
10
|
+
# @param [HttpResponse] http_response The original, raw response from the api.
|
|
11
|
+
# @param [Object] data The data field specified for the response.
|
|
12
|
+
# @param [Array<String>] errors Any errors returned by the server.
|
|
13
|
+
def initialize(http_response,
|
|
14
|
+
data: nil,
|
|
15
|
+
errors: nil)
|
|
16
|
+
super
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# semgrep_web_app
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated by APIMATIC v3.0 (
|
|
4
|
+
# https://www.apimatic.io ).
|
|
5
|
+
|
|
6
|
+
module SemgrepWebApp
|
|
7
|
+
# Utility class for OAuth 2 authorization and token management.
|
|
8
|
+
class SemgrepAdminJwt < CoreLibrary::HeaderAuth
|
|
9
|
+
include CoreLibrary
|
|
10
|
+
# Display error message on occurrence of authentication failure.
|
|
11
|
+
# @returns [String] The oAuth error message.
|
|
12
|
+
def error_message
|
|
13
|
+
'SemgrepAdminJwt: access_token is undefined.'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Initialization constructor.
|
|
17
|
+
def initialize(semgrep_admin_jwt_credentials)
|
|
18
|
+
auth_params = {}
|
|
19
|
+
@_access_token = semgrep_admin_jwt_credentials.access_token unless
|
|
20
|
+
semgrep_admin_jwt_credentials.nil? || semgrep_admin_jwt_credentials.access_token.nil?
|
|
21
|
+
auth_params[:Authorization] = "Bearer #{@_access_token}" unless @_access_token.nil?
|
|
22
|
+
|
|
23
|
+
super auth_params
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Data class for SemgrepAdminJwtCredentials.
|
|
28
|
+
class SemgrepAdminJwtCredentials
|
|
29
|
+
attr_reader :access_token
|
|
30
|
+
|
|
31
|
+
def initialize(access_token:)
|
|
32
|
+
raise ArgumentError, 'access_token cannot be nil' if access_token.nil?
|
|
33
|
+
|
|
34
|
+
@access_token = access_token
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.from_env
|
|
38
|
+
access_token = ENV['SEMGREP_ADMIN_JWT_ACCESS_TOKEN']
|
|
39
|
+
all_nil = [
|
|
40
|
+
access_token
|
|
41
|
+
].all?(&:nil?)
|
|
42
|
+
return nil if all_nil
|
|
43
|
+
|
|
44
|
+
new(access_token: access_token)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def clone_with(access_token: nil)
|
|
48
|
+
access_token ||= self.access_token
|
|
49
|
+
|
|
50
|
+
SemgrepAdminJwtCredentials.new(access_token: access_token)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# semgrep_web_app
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated by APIMATIC v3.0 (
|
|
4
|
+
# https://www.apimatic.io ).
|
|
5
|
+
|
|
6
|
+
module SemgrepWebApp
|
|
7
|
+
# Utility class for OAuth 2 authorization and token management.
|
|
8
|
+
class SemgrepJwt < CoreLibrary::HeaderAuth
|
|
9
|
+
include CoreLibrary
|
|
10
|
+
# Display error message on occurrence of authentication failure.
|
|
11
|
+
# @returns [String] The oAuth error message.
|
|
12
|
+
def error_message
|
|
13
|
+
'SemgrepJwt: access_token is undefined.'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Initialization constructor.
|
|
17
|
+
def initialize(semgrep_jwt_credentials)
|
|
18
|
+
auth_params = {}
|
|
19
|
+
@_access_token = semgrep_jwt_credentials.access_token unless
|
|
20
|
+
semgrep_jwt_credentials.nil? || semgrep_jwt_credentials.access_token.nil?
|
|
21
|
+
auth_params[:Authorization] = "Bearer #{@_access_token}" unless @_access_token.nil?
|
|
22
|
+
|
|
23
|
+
super auth_params
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Data class for SemgrepJwtCredentials.
|
|
28
|
+
class SemgrepJwtCredentials
|
|
29
|
+
attr_reader :access_token
|
|
30
|
+
|
|
31
|
+
def initialize(access_token:)
|
|
32
|
+
raise ArgumentError, 'access_token cannot be nil' if access_token.nil?
|
|
33
|
+
|
|
34
|
+
@access_token = access_token
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.from_env
|
|
38
|
+
access_token = ENV['SEMGREP_JWT_ACCESS_TOKEN']
|
|
39
|
+
all_nil = [
|
|
40
|
+
access_token
|
|
41
|
+
].all?(&:nil?)
|
|
42
|
+
return nil if all_nil
|
|
43
|
+
|
|
44
|
+
new(access_token: access_token)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def clone_with(access_token: nil)
|
|
48
|
+
access_token ||= self.access_token
|
|
49
|
+
|
|
50
|
+
SemgrepJwtCredentials.new(access_token: access_token)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# semgrep_web_app
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated by APIMATIC v3.0 (
|
|
4
|
+
# https://www.apimatic.io ).
|
|
5
|
+
|
|
6
|
+
module SemgrepWebApp
|
|
7
|
+
# Utility class for OAuth 2 authorization and token management.
|
|
8
|
+
class SemgrepWebToken < CoreLibrary::HeaderAuth
|
|
9
|
+
include CoreLibrary
|
|
10
|
+
# Display error message on occurrence of authentication failure.
|
|
11
|
+
# @returns [String] The oAuth error message.
|
|
12
|
+
def error_message
|
|
13
|
+
'SemgrepWebToken: access_token is undefined.'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Initialization constructor.
|
|
17
|
+
def initialize(semgrep_web_token_credentials)
|
|
18
|
+
auth_params = {}
|
|
19
|
+
@_access_token = semgrep_web_token_credentials.access_token unless
|
|
20
|
+
semgrep_web_token_credentials.nil? || semgrep_web_token_credentials.access_token.nil?
|
|
21
|
+
auth_params[:Authorization] = "Bearer #{@_access_token}" unless @_access_token.nil?
|
|
22
|
+
|
|
23
|
+
super auth_params
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Data class for SemgrepWebTokenCredentials.
|
|
28
|
+
class SemgrepWebTokenCredentials
|
|
29
|
+
attr_reader :access_token
|
|
30
|
+
|
|
31
|
+
def initialize(access_token:)
|
|
32
|
+
raise ArgumentError, 'access_token cannot be nil' if access_token.nil?
|
|
33
|
+
|
|
34
|
+
@access_token = access_token
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.from_env
|
|
38
|
+
access_token = ENV['SEMGREP_WEB_TOKEN_ACCESS_TOKEN']
|
|
39
|
+
all_nil = [
|
|
40
|
+
access_token
|
|
41
|
+
].all?(&:nil?)
|
|
42
|
+
return nil if all_nil
|
|
43
|
+
|
|
44
|
+
new(access_token: access_token)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def clone_with(access_token: nil)
|
|
48
|
+
access_token ||= self.access_token
|
|
49
|
+
|
|
50
|
+
SemgrepWebTokenCredentials.new(access_token: access_token)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# semgrep_web_app
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated by APIMATIC v3.0 (
|
|
4
|
+
# https://www.apimatic.io ).
|
|
5
|
+
|
|
6
|
+
module SemgrepWebApp
|
|
7
|
+
# HttpCallBack allows defining callables for pre and post API calls.
|
|
8
|
+
class HttpCallBack < CoreLibrary::HttpCallback
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# semgrep_web_app
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated by APIMATIC v3.0 (
|
|
4
|
+
# https://www.apimatic.io ).
|
|
5
|
+
|
|
6
|
+
module SemgrepWebApp
|
|
7
|
+
##
|
|
8
|
+
# ProxySettings encapsulates HTTP proxy configuration for Faraday,
|
|
9
|
+
# including optional basic authentication.
|
|
10
|
+
#
|
|
11
|
+
class ProxySettings < CoreLibrary::ProxySettings
|
|
12
|
+
def self.from_env
|
|
13
|
+
address = ENV['PROXY_ADDRESS']
|
|
14
|
+
port = ENV['PROXY_PORT']
|
|
15
|
+
username = ENV['PROXY_USERNAME']
|
|
16
|
+
password = ENV['PROXY_PASSWORD']
|
|
17
|
+
return nil if address.nil? || address.strip.empty?
|
|
18
|
+
|
|
19
|
+
new(address: address, port: port, username: username, password: password)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|