keeper_secrets_manager 17.0.4 → 17.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/CHANGELOG.md +100 -16
- data/Gemfile +6 -3
- data/README.md +75 -270
- data/Rakefile +1 -1
- data/bin/console +47 -0
- data/keeper_secrets_manager.gemspec +36 -0
- data/lib/keeper_secrets_manager/cache.rb +139 -0
- data/lib/keeper_secrets_manager/config_keys.rb +4 -2
- data/lib/keeper_secrets_manager/core.rb +993 -452
- data/lib/keeper_secrets_manager/crypto.rb +101 -116
- data/lib/keeper_secrets_manager/dto/payload.rb +7 -6
- data/lib/keeper_secrets_manager/dto.rb +374 -38
- data/lib/keeper_secrets_manager/errors.rb +13 -2
- data/lib/keeper_secrets_manager/field_types.rb +3 -3
- data/lib/keeper_secrets_manager/folder_manager.rb +25 -29
- data/lib/keeper_secrets_manager/keeper_globals.rb +11 -17
- data/lib/keeper_secrets_manager/notation.rb +202 -93
- data/lib/keeper_secrets_manager/notation_enhancements.rb +24 -24
- data/lib/keeper_secrets_manager/storage.rb +38 -38
- data/lib/keeper_secrets_manager/totp.rb +27 -27
- data/lib/keeper_secrets_manager/utils.rb +85 -18
- data/lib/keeper_secrets_manager/version.rb +2 -2
- data/lib/keeper_secrets_manager.rb +11 -3
- metadata +39 -22
- data/DEVELOPER_SETUP.md +0 -0
- data/MANUAL_TESTING_GUIDE.md +0 -332
- data/RUBY_SDK_COMPLETE_DOCUMENTATION.md +0 -354
- data/RUBY_SDK_COMPREHENSIVE_SUMMARY.md +0 -192
- data/examples/01_quick_start.rb +0 -45
- data/examples/02_authentication.rb +0 -82
- data/examples/03_retrieve_secrets.rb +0 -81
- data/examples/04_create_update_delete.rb +0 -104
- data/examples/05_field_types.rb +0 -135
- data/examples/06_files.rb +0 -137
- data/examples/07_folders.rb +0 -145
- data/examples/08_notation.rb +0 -103
- data/examples/09_totp.rb +0 -100
- data/examples/README.md +0 -89
metadata
CHANGED
|
@@ -1,15 +1,43 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: keeper_secrets_manager
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 17.0
|
|
4
|
+
version: 17.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Keeper Security
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
11
|
+
date: 2026-07-20 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: base64
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: logger
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
13
41
|
description: Ruby SDK for Keeper Secrets Manager - A zero-knowledge platform for managing
|
|
14
42
|
and protecting infrastructure secrets
|
|
15
43
|
email:
|
|
@@ -21,25 +49,14 @@ files:
|
|
|
21
49
|
- ".rspec"
|
|
22
50
|
- ".ruby-version"
|
|
23
51
|
- CHANGELOG.md
|
|
24
|
-
- DEVELOPER_SETUP.md
|
|
25
52
|
- Gemfile
|
|
26
53
|
- LICENSE
|
|
27
|
-
- MANUAL_TESTING_GUIDE.md
|
|
28
54
|
- README.md
|
|
29
|
-
- RUBY_SDK_COMPLETE_DOCUMENTATION.md
|
|
30
|
-
- RUBY_SDK_COMPREHENSIVE_SUMMARY.md
|
|
31
55
|
- Rakefile
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
- examples/03_retrieve_secrets.rb
|
|
35
|
-
- examples/04_create_update_delete.rb
|
|
36
|
-
- examples/05_field_types.rb
|
|
37
|
-
- examples/06_files.rb
|
|
38
|
-
- examples/07_folders.rb
|
|
39
|
-
- examples/08_notation.rb
|
|
40
|
-
- examples/09_totp.rb
|
|
41
|
-
- examples/README.md
|
|
56
|
+
- bin/console
|
|
57
|
+
- keeper_secrets_manager.gemspec
|
|
42
58
|
- lib/keeper_secrets_manager.rb
|
|
59
|
+
- lib/keeper_secrets_manager/cache.rb
|
|
43
60
|
- lib/keeper_secrets_manager/config_keys.rb
|
|
44
61
|
- lib/keeper_secrets_manager/core.rb
|
|
45
62
|
- lib/keeper_secrets_manager/crypto.rb
|
|
@@ -63,7 +80,7 @@ metadata:
|
|
|
63
80
|
homepage_uri: https://github.com/Keeper-Security/secrets-manager
|
|
64
81
|
source_code_uri: https://github.com/Keeper-Security/secrets-manager
|
|
65
82
|
changelog_uri: https://github.com/Keeper-Security/secrets-manager/blob/master/CHANGELOG.md
|
|
66
|
-
post_install_message:
|
|
83
|
+
post_install_message:
|
|
67
84
|
rdoc_options: []
|
|
68
85
|
require_paths:
|
|
69
86
|
- lib
|
|
@@ -71,15 +88,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
71
88
|
requirements:
|
|
72
89
|
- - ">="
|
|
73
90
|
- !ruby/object:Gem::Version
|
|
74
|
-
version:
|
|
91
|
+
version: 3.1.0
|
|
75
92
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
93
|
requirements:
|
|
77
94
|
- - ">="
|
|
78
95
|
- !ruby/object:Gem::Version
|
|
79
96
|
version: '0'
|
|
80
97
|
requirements: []
|
|
81
|
-
rubygems_version: 3.
|
|
82
|
-
signing_key:
|
|
98
|
+
rubygems_version: 3.5.22
|
|
99
|
+
signing_key:
|
|
83
100
|
specification_version: 4
|
|
84
101
|
summary: Keeper Secrets Manager SDK for Ruby
|
|
85
102
|
test_files: []
|
data/DEVELOPER_SETUP.md
DELETED
|
File without changes
|
data/MANUAL_TESTING_GUIDE.md
DELETED
|
@@ -1,332 +0,0 @@
|
|
|
1
|
-
# Manual Testing Guide for Ruby SDK - Non-Ruby Developers
|
|
2
|
-
|
|
3
|
-
This guide will walk you through testing the Keeper Secrets Manager Ruby SDK step-by-step, even if you're not familiar with Ruby.
|
|
4
|
-
|
|
5
|
-
## Prerequisites
|
|
6
|
-
|
|
7
|
-
### 1. Install Ruby
|
|
8
|
-
```bash
|
|
9
|
-
# Check if Ruby is installed
|
|
10
|
-
ruby --version
|
|
11
|
-
|
|
12
|
-
# If not installed:
|
|
13
|
-
# On macOS with Homebrew:
|
|
14
|
-
brew install ruby
|
|
15
|
-
|
|
16
|
-
# On Ubuntu/Debian:
|
|
17
|
-
sudo apt-get install ruby-full
|
|
18
|
-
|
|
19
|
-
# On Windows:
|
|
20
|
-
# Download from https://rubyinstaller.org/
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
**Required**: Ruby 2.7 or higher
|
|
24
|
-
|
|
25
|
-
### 2. Install Dependencies
|
|
26
|
-
```bash
|
|
27
|
-
# Navigate to the Ruby SDK directory
|
|
28
|
-
cd /Users/mustinov/Source/secrets-manager/sdk/ruby
|
|
29
|
-
|
|
30
|
-
# Install bundler (Ruby's package manager)
|
|
31
|
-
gem install bundler
|
|
32
|
-
|
|
33
|
-
# Install SDK dependencies
|
|
34
|
-
bundle install
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
### 3. Get Your Keeper Token
|
|
38
|
-
You need a one-time token from Keeper. It looks like:
|
|
39
|
-
```
|
|
40
|
-
US:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Step-by-Step Testing
|
|
44
|
-
|
|
45
|
-
### Step 1: Create Test Script
|
|
46
|
-
Create a new file called `my_test.rb` in the SDK directory:
|
|
47
|
-
|
|
48
|
-
```ruby
|
|
49
|
-
#!/usr/bin/env ruby
|
|
50
|
-
|
|
51
|
-
# Load the SDK
|
|
52
|
-
require_relative 'lib/keeper_secrets_manager'
|
|
53
|
-
|
|
54
|
-
# Your token from Keeper
|
|
55
|
-
TOKEN = 'US:YOUR_ONE_TIME_TOKEN_HERE'
|
|
56
|
-
|
|
57
|
-
# Initialize the SDK
|
|
58
|
-
puts "Initializing Keeper SDK..."
|
|
59
|
-
sm = KeeperSecretsManager::SecretsManager.new(token: TOKEN)
|
|
60
|
-
|
|
61
|
-
puts "\n=== Step 1: List All Secrets ==="
|
|
62
|
-
begin
|
|
63
|
-
secrets = sm.get_secrets()
|
|
64
|
-
puts "Found #{secrets.length} secrets:"
|
|
65
|
-
secrets.each do |secret|
|
|
66
|
-
puts " - #{secret.title} (UID: #{secret.uid})"
|
|
67
|
-
end
|
|
68
|
-
rescue => e
|
|
69
|
-
puts "Error: #{e.message}"
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# Save a secret UID for later tests
|
|
73
|
-
if secrets.any?
|
|
74
|
-
test_secret_uid = secrets.first.uid
|
|
75
|
-
puts "\nUsing secret '#{secrets.first.title}' for testing"
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
puts "\n=== Step 2: Get Secret Details ==="
|
|
79
|
-
if test_secret_uid
|
|
80
|
-
secret = sm.get_secrets([test_secret_uid]).first
|
|
81
|
-
puts "Title: #{secret.title}"
|
|
82
|
-
puts "Type: #{secret.type}"
|
|
83
|
-
puts "Fields:"
|
|
84
|
-
secret.fields.each do |field|
|
|
85
|
-
puts " - #{field['type']}: #{field['value'].first rescue 'N/A'}"
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
puts "\n=== Step 3: Test Notation ==="
|
|
90
|
-
# Test notation to get password
|
|
91
|
-
notation = "keeper://#{test_secret_uid}/field/password"
|
|
92
|
-
password = sm.get_notation(notation)
|
|
93
|
-
puts "Password via notation: #{password}"
|
|
94
|
-
|
|
95
|
-
puts "\n=== Step 4: List Folders ==="
|
|
96
|
-
folders = sm.get_folders()
|
|
97
|
-
puts "Found #{folders.length} folders:"
|
|
98
|
-
folders.each do |folder|
|
|
99
|
-
puts " - #{folder.name} (UID: #{folder.uid})"
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Save folder UID for record creation
|
|
103
|
-
if folders.any?
|
|
104
|
-
test_folder_uid = folders.first.uid
|
|
105
|
-
puts "\nWill use folder '#{folders.first.name}' for new records"
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
puts "\n=== Step 5: Create New Secret ==="
|
|
109
|
-
if test_folder_uid
|
|
110
|
-
new_record = KeeperSecretsManager::Dto::KeeperRecord.new(
|
|
111
|
-
title: "Test Record - #{Time.now.strftime('%Y-%m-%d %H:%M')}",
|
|
112
|
-
type: 'login',
|
|
113
|
-
fields: [
|
|
114
|
-
{ 'type' => 'login', 'value' => ['testuser@example.com'] },
|
|
115
|
-
{ 'type' => 'password', 'value' => ['MySecurePassword123!'] },
|
|
116
|
-
{ 'type' => 'url', 'value' => ['https://example.com'] }
|
|
117
|
-
],
|
|
118
|
-
notes: 'Created by Ruby SDK test'
|
|
119
|
-
)
|
|
120
|
-
|
|
121
|
-
options = KeeperSecretsManager::Dto::CreateOptions.new
|
|
122
|
-
options.folder_uid = test_folder_uid
|
|
123
|
-
|
|
124
|
-
new_uid = sm.create_secret(new_record, options)
|
|
125
|
-
puts "Created new secret with UID: #{new_uid}"
|
|
126
|
-
|
|
127
|
-
# Save for cleanup
|
|
128
|
-
created_uid = new_uid
|
|
129
|
-
else
|
|
130
|
-
puts "No folders found - skipping record creation"
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
puts "\n=== Step 6: Update Secret ==="
|
|
134
|
-
if created_uid
|
|
135
|
-
# Fetch the created record
|
|
136
|
-
record = sm.get_secrets([created_uid]).first
|
|
137
|
-
|
|
138
|
-
# Update password
|
|
139
|
-
record.set_field('password', 'UpdatedPassword456!')
|
|
140
|
-
record.notes = "Updated at #{Time.now}"
|
|
141
|
-
|
|
142
|
-
sm.update_secret(record)
|
|
143
|
-
puts "Updated secret successfully"
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
puts "\n=== Step 7: File Operations ==="
|
|
147
|
-
if created_uid
|
|
148
|
-
# Create a test file
|
|
149
|
-
test_content = "This is a test file created at #{Time.now}"
|
|
150
|
-
File.write('test_upload.txt', test_content)
|
|
151
|
-
|
|
152
|
-
# Upload file
|
|
153
|
-
file_data = File.read('test_upload.txt', mode: 'rb')
|
|
154
|
-
file_uid = sm.upload_file(created_uid, 'test_upload.txt', file_data)
|
|
155
|
-
puts "Uploaded file with UID: #{file_uid}"
|
|
156
|
-
|
|
157
|
-
# Download file
|
|
158
|
-
downloaded = sm.download_file(file_uid)
|
|
159
|
-
puts "Downloaded file: #{downloaded['name']} (#{downloaded['size']} bytes)"
|
|
160
|
-
|
|
161
|
-
# Save downloaded file
|
|
162
|
-
File.write('test_download.txt', downloaded['data'], mode: 'wb')
|
|
163
|
-
puts "Saved to test_download.txt"
|
|
164
|
-
|
|
165
|
-
# Cleanup
|
|
166
|
-
File.delete('test_upload.txt') if File.exist?('test_upload.txt')
|
|
167
|
-
File.delete('test_download.txt') if File.exist?('test_download.txt')
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
puts "\n=== Step 8: Test TOTP ==="
|
|
171
|
-
# Look for a record with TOTP
|
|
172
|
-
secrets.each do |secret|
|
|
173
|
-
totp_url = sm.get_notation("keeper://#{secret.uid}/field/oneTimeCode") rescue nil
|
|
174
|
-
if totp_url && totp_url.start_with?('otpauth://')
|
|
175
|
-
puts "Found TOTP in '#{secret.title}'"
|
|
176
|
-
params = KeeperSecretsManager::TOTP.parse_url(totp_url)
|
|
177
|
-
code = KeeperSecretsManager::TOTP.generate_code(params['secret'])
|
|
178
|
-
puts "Current TOTP code: #{code}"
|
|
179
|
-
break
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
puts "\n=== Step 9: Cleanup ==="
|
|
184
|
-
if created_uid
|
|
185
|
-
print "Delete test record? (y/n): "
|
|
186
|
-
if gets.chomp.downcase == 'y'
|
|
187
|
-
sm.delete_secret([created_uid])
|
|
188
|
-
puts "Deleted test record"
|
|
189
|
-
else
|
|
190
|
-
puts "Kept test record"
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
puts "\n=== Testing Complete! ==="
|
|
195
|
-
puts "All basic operations tested successfully"
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
### Step 2: Run the Test
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
# Make sure you're in the Ruby SDK directory
|
|
202
|
-
cd /Users/mustinov/Source/secrets-manager/sdk/ruby
|
|
203
|
-
|
|
204
|
-
# Run the test
|
|
205
|
-
ruby my_test.rb
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
## Common Issues and Solutions
|
|
209
|
-
|
|
210
|
-
### Issue 1: "No such file or directory"
|
|
211
|
-
```bash
|
|
212
|
-
# Make sure you're in the right directory
|
|
213
|
-
pwd # Should show: /Users/mustinov/Source/secrets-manager/sdk/ruby
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### Issue 2: "Missing gems"
|
|
217
|
-
```bash
|
|
218
|
-
# Install missing gems
|
|
219
|
-
bundle install
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### Issue 3: "Invalid token"
|
|
223
|
-
- Make sure your token starts with region code (e.g., `US:`)
|
|
224
|
-
- Token is one-time use only - get a new one if it fails
|
|
225
|
-
|
|
226
|
-
### Issue 4: "No folders found"
|
|
227
|
-
- The SDK requires folders to create records
|
|
228
|
-
- Create a folder in Keeper first, or use existing ones
|
|
229
|
-
|
|
230
|
-
## Quick Test Commands
|
|
231
|
-
|
|
232
|
-
### Test 1: Basic Connection
|
|
233
|
-
```ruby
|
|
234
|
-
ruby -e "require_relative 'lib/keeper_secrets_manager'; sm = KeeperSecretsManager::SecretsManager.new(token: 'YOUR_TOKEN'); puts sm.get_secrets.length"
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### Test 2: List Secret Titles
|
|
238
|
-
```ruby
|
|
239
|
-
ruby -e "require_relative 'lib/keeper_secrets_manager'; sm = KeeperSecretsManager::SecretsManager.new(token: 'YOUR_TOKEN'); sm.get_secrets.each { |s| puts s.title }"
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
### Test 3: Using Config File
|
|
243
|
-
First run saves config, subsequent runs use saved config:
|
|
244
|
-
```ruby
|
|
245
|
-
# First run with token
|
|
246
|
-
ruby -e "require_relative 'lib/keeper_secrets_manager'; config = KeeperSecretsManager::FileStorage.new('my-config.json'); sm = KeeperSecretsManager::SecretsManager.new(token: 'YOUR_TOKEN', config: config); puts 'Config saved!'"
|
|
247
|
-
|
|
248
|
-
# Subsequent runs without token
|
|
249
|
-
ruby -e "require_relative 'lib/keeper_secrets_manager'; config = KeeperSecretsManager::FileStorage.new('my-config.json'); sm = KeeperSecretsManager::SecretsManager.new(config: config); puts sm.get_secrets.length"
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
## Interactive Ruby Console
|
|
253
|
-
|
|
254
|
-
For exploring the SDK interactively:
|
|
255
|
-
|
|
256
|
-
```bash
|
|
257
|
-
# Start Ruby console
|
|
258
|
-
irb
|
|
259
|
-
|
|
260
|
-
# In the console, type:
|
|
261
|
-
require_relative 'lib/keeper_secrets_manager'
|
|
262
|
-
sm = KeeperSecretsManager::SecretsManager.new(token: 'YOUR_TOKEN')
|
|
263
|
-
secrets = sm.get_secrets
|
|
264
|
-
secrets.first.title
|
|
265
|
-
secrets.first.fields
|
|
266
|
-
exit
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
## What to Test
|
|
270
|
-
|
|
271
|
-
1. **Authentication**: Token works and connects to Keeper
|
|
272
|
-
2. **Read Operations**: Can list and read secrets
|
|
273
|
-
3. **Notation**: Can use keeper:// URIs
|
|
274
|
-
4. **Create**: Can create new records (requires folder)
|
|
275
|
-
5. **Update**: Can modify existing records
|
|
276
|
-
6. **Delete**: Can remove records
|
|
277
|
-
7. **Files**: Can upload/download attachments
|
|
278
|
-
8. **TOTP**: Can generate one-time codes
|
|
279
|
-
9. **Folders**: Can list and manage folders
|
|
280
|
-
|
|
281
|
-
## Expected Output
|
|
282
|
-
|
|
283
|
-
Successful run should show:
|
|
284
|
-
```
|
|
285
|
-
Initializing Keeper SDK...
|
|
286
|
-
|
|
287
|
-
=== Step 1: List All Secrets ===
|
|
288
|
-
Found 5 secrets:
|
|
289
|
-
- My Login (UID: xxxxx)
|
|
290
|
-
- API Keys (UID: xxxxx)
|
|
291
|
-
...
|
|
292
|
-
|
|
293
|
-
=== Step 2: Get Secret Details ===
|
|
294
|
-
Title: My Login
|
|
295
|
-
Type: login
|
|
296
|
-
Fields:
|
|
297
|
-
- login: user@example.com
|
|
298
|
-
- password: ********
|
|
299
|
-
...
|
|
300
|
-
|
|
301
|
-
[continues through all steps]
|
|
302
|
-
|
|
303
|
-
=== Testing Complete! ===
|
|
304
|
-
All basic operations tested successfully
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
## Cleanup
|
|
308
|
-
|
|
309
|
-
After testing:
|
|
310
|
-
```bash
|
|
311
|
-
# Remove any test files
|
|
312
|
-
rm -f my_test.rb test_upload.txt test_download.txt my-config.json
|
|
313
|
-
|
|
314
|
-
# Remove any test records created in Keeper
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
## Next Steps
|
|
318
|
-
|
|
319
|
-
1. Try modifying the test script to test specific features
|
|
320
|
-
2. Use the examples in the `examples/` directory
|
|
321
|
-
3. Check `test/integration/` for more test scenarios
|
|
322
|
-
4. Review the README.md for API documentation
|
|
323
|
-
|
|
324
|
-
## Need Help?
|
|
325
|
-
|
|
326
|
-
- Check error messages - they usually indicate what's wrong
|
|
327
|
-
- Ensure Ruby version is 2.7 or higher
|
|
328
|
-
- Make sure you're in the correct directory
|
|
329
|
-
- Token must be valid and unused
|
|
330
|
-
- Records need to be in folders for creation
|
|
331
|
-
|
|
332
|
-
Good luck with your testing!
|