attio 0.2.0 → 0.4.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/.github/workflows/release.yml +1 -45
- data/.gitignore +1 -0
- data/CHANGELOG.md +69 -0
- data/CLAUDE.md +391 -0
- data/Gemfile.lock +1 -1
- data/README.md +370 -24
- data/lib/attio/circuit_breaker.rb +299 -0
- data/lib/attio/client.rb +43 -1
- data/lib/attio/connection_pool.rb +190 -35
- data/lib/attio/enhanced_client.rb +257 -0
- data/lib/attio/errors.rb +30 -2
- data/lib/attio/http_client.rb +58 -3
- data/lib/attio/observability.rb +424 -0
- data/lib/attio/rate_limiter.rb +212 -0
- data/lib/attio/resources/base.rb +70 -2
- data/lib/attio/resources/bulk.rb +290 -0
- data/lib/attio/resources/deals.rb +183 -0
- data/lib/attio/resources/records.rb +29 -2
- data/lib/attio/resources/workspace_members.rb +103 -0
- data/lib/attio/version.rb +1 -1
- data/lib/attio/webhooks.rb +220 -0
- data/lib/attio.rb +12 -0
- metadata +10 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4adb3d189bbe2045c5525104999edc5dfc4b174052bbc706d253be2fd97b4ba4
|
4
|
+
data.tar.gz: 01bf163ade7e79032afa2492a34d33a606c5832e397bfbc0e2859af8f05cc0cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40f5294ba295c99dd2e2dab0b6b6c058e8dffd28f4053975701d45e9b6c7e49e3452977e11db0ec7ea8642590ff7dc73bdc861a0eb6d15eea0957c287957666d
|
7
|
+
data.tar.gz: 804592dbf1d01ed6bd49f6f8e712a9044471494314148276162534ad68a2b52174eeabfea1d4a24de99b1ab82fed42e7b4c43f67d0d70096c9ad098fc7222301
|
@@ -114,48 +114,4 @@ jobs:
|
|
114
114
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
115
115
|
asset_path: ${{ env.GEM_FILE }}
|
116
116
|
asset_name: ${{ env.GEM_FILE }}
|
117
|
-
asset_content_type: application/x-tar
|
118
|
-
|
119
|
-
update-docs:
|
120
|
-
needs: [test, build-and-publish]
|
121
|
-
runs-on: ubuntu-latest
|
122
|
-
permissions:
|
123
|
-
contents: write
|
124
|
-
|
125
|
-
steps:
|
126
|
-
- uses: actions/checkout@v4
|
127
|
-
with:
|
128
|
-
token: ${{ secrets.GITHUB_TOKEN }}
|
129
|
-
ref: main
|
130
|
-
|
131
|
-
- name: Set up Ruby
|
132
|
-
uses: ruby/setup-ruby@v1
|
133
|
-
with:
|
134
|
-
ruby-version: '3.4'
|
135
|
-
bundler-cache: false
|
136
|
-
|
137
|
-
- name: Install dependencies
|
138
|
-
run: |
|
139
|
-
gem install bundler -v 2.4.22
|
140
|
-
bundle config set --local deployment false
|
141
|
-
bundle install
|
142
|
-
|
143
|
-
- name: Extract version from tag
|
144
|
-
id: version
|
145
|
-
run: echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
|
146
|
-
|
147
|
-
- name: Generate documentation
|
148
|
-
run: |
|
149
|
-
bundle exec rake docs:generate
|
150
|
-
|
151
|
-
- name: Commit and push documentation
|
152
|
-
run: |
|
153
|
-
git config --local user.email "action@github.com"
|
154
|
-
git config --local user.name "GitHub Action"
|
155
|
-
git add docs/
|
156
|
-
if ! git diff --staged --quiet; then
|
157
|
-
git commit -m "Update documentation for release ${{ steps.version.outputs.version }}"
|
158
|
-
git push
|
159
|
-
else
|
160
|
-
echo "No documentation changes to commit"
|
161
|
-
fi
|
117
|
+
asset_content_type: application/x-tar
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,75 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
7
|
|
8
|
+
## [0.4.0] - 2025-01-12
|
9
|
+
|
10
|
+
### Breaking Changes
|
11
|
+
- **Removed fake Meta API**: The Meta resource was completely fabricated and has been removed
|
12
|
+
- **Webhook Headers**: Fixed header names (removed X- prefix) - now uses `Attio-Signature` and `Attio-Timestamp`
|
13
|
+
|
14
|
+
### Added
|
15
|
+
- **Rate Limiter Integration**: Now actively enforces rate limits and handles 429 responses
|
16
|
+
- **Pagination Support**: Added automatic pagination with `list_all` methods
|
17
|
+
- **Filtering and Sorting**: Full support for Attio's filter and sort parameters
|
18
|
+
- **Enterprise Features**:
|
19
|
+
- **EnhancedClient** with connection pooling, circuit breaker, observability, and webhook support
|
20
|
+
- **CircuitBreaker** pattern for fault tolerance with configurable thresholds and timeouts
|
21
|
+
- **ConnectionPool** for efficient connection management with thread-safe implementation
|
22
|
+
- **Observability** framework with support for multiple backends (StatsD, Datadog, Prometheus, OpenTelemetry)
|
23
|
+
- **Webhook** processing with signature verification and event handling
|
24
|
+
- **Middleware** support for request/response instrumentation
|
25
|
+
- **100% Test Coverage**: Comprehensive tests for all functionality (607 tests total)
|
26
|
+
- **Background thread error handling** for production stability
|
27
|
+
|
28
|
+
### Improved
|
29
|
+
- **Test Quality**: Maintained 98.81% code coverage (1330/1346 lines)
|
30
|
+
- **Error Handling**: Added graceful error messages and proper retry logic
|
31
|
+
- **Health Checks**: Now use real API endpoint (`meta/identify`) instead of fake endpoints
|
32
|
+
- **HTTP Client**: Properly extracts and handles rate limit headers
|
33
|
+
- **Documentation**: All features properly tested and documented
|
34
|
+
|
35
|
+
### Fixed
|
36
|
+
- Webhook signature verification headers (removed X- prefix)
|
37
|
+
- Health check endpoint to use real API
|
38
|
+
- Background thread error handling in EnhancedClient
|
39
|
+
- Rate limiter integration - now actually enforces limits
|
40
|
+
- Bulk operations validation (max is 1000, not 100)
|
41
|
+
- Invalid retry-after header handling
|
42
|
+
|
43
|
+
## [0.3.0] - 2025-08-11
|
44
|
+
|
45
|
+
### Added
|
46
|
+
- **Workspace Members** resource for managing workspace access and permissions
|
47
|
+
- **Deals** resource for sales pipeline management with win/loss tracking
|
48
|
+
- **Bulk Operations** with automatic batching (100 records per batch)
|
49
|
+
- **Rate Limiting** with exponential backoff and request queuing
|
50
|
+
- **SSL/TLS verification** for enhanced security
|
51
|
+
- **Enhanced error classes** with proper attributes (retry_after for RateLimitError)
|
52
|
+
- **Thread-safe rate limiter** implementation
|
53
|
+
- Comprehensive architectural documentation in CONCEPTS.md
|
54
|
+
- Development guidelines in CLAUDE.md
|
55
|
+
- 116 new tests (392 total, up from 265)
|
56
|
+
|
57
|
+
### Improved
|
58
|
+
- **Security**: Added explicit SSL verification and disabled automatic redirects
|
59
|
+
- **Thread Safety**: Fixed race conditions in rate limiter
|
60
|
+
- **Code Quality**: Achieved 0 RuboCop violations (previously 6)
|
61
|
+
- **Test Coverage**: 99.86% (718/719 lines)
|
62
|
+
- **Performance**: Optimized bulk operations with efficient batching
|
63
|
+
- **Validation**: Enhanced input validation to prevent injection attacks
|
64
|
+
- **Documentation**: Updated README with comprehensive API coverage
|
65
|
+
|
66
|
+
### Fixed
|
67
|
+
- Thread safety issues in RateLimiter#update_from_headers
|
68
|
+
- Complex validation methods refactored to reduce cyclomatic complexity
|
69
|
+
- validate_required_hash now properly handles nil values
|
70
|
+
- Fixed conditional validation in Deals#create
|
71
|
+
|
72
|
+
### Changed
|
73
|
+
- **BREAKING**: Error messages for nil validation now say "must be a hash" instead of "is required"
|
74
|
+
- RateLimitMiddleware simplified to avoid private method calls
|
75
|
+
- Base resource class validation methods extracted for reusability
|
76
|
+
|
8
77
|
## [0.2.0] - 2025-08-11
|
9
78
|
|
10
79
|
### Added
|
data/CLAUDE.md
ADDED
@@ -0,0 +1,391 @@
|
|
1
|
+
# Claude Development Guidelines for Attio Ruby Gem
|
2
|
+
|
3
|
+
This document contains important guidelines for Claude (or any AI assistant) when working on the Attio Ruby gem. Following these guidelines ensures high-quality, consistent, and production-ready code.
|
4
|
+
|
5
|
+
## Pre-Release Checklist
|
6
|
+
|
7
|
+
**IMPORTANT**: Before creating any release tag or pushing to master, ALWAYS complete this checklist:
|
8
|
+
|
9
|
+
### 1. Code Quality
|
10
|
+
- [ ] Run RuboCop and fix all violations: `bundle exec rubocop -A`
|
11
|
+
- [ ] Ensure no RuboCop offenses remain
|
12
|
+
- [ ] Run all tests: `bundle exec rspec`
|
13
|
+
- [ ] Verify 100% test coverage: Check SimpleCov output
|
14
|
+
- [ ] Update version in `lib/attio/version.rb`
|
15
|
+
- [ ] Update CHANGELOG.md with release date
|
16
|
+
|
17
|
+
### 2. Testing Commands
|
18
|
+
```bash
|
19
|
+
# Run all tests
|
20
|
+
bundle exec rspec
|
21
|
+
|
22
|
+
# Run tests with coverage report
|
23
|
+
COVERAGE=true bundle exec rspec
|
24
|
+
|
25
|
+
# Run specific test file
|
26
|
+
bundle exec rspec spec/attio/resources/comments_spec.rb
|
27
|
+
|
28
|
+
# Run RuboCop
|
29
|
+
bundle exec rubocop
|
30
|
+
|
31
|
+
# Auto-fix RuboCop violations
|
32
|
+
bundle exec rubocop -A
|
33
|
+
|
34
|
+
# Check for outdated gems
|
35
|
+
bundle outdated
|
36
|
+
```
|
37
|
+
|
38
|
+
### 3. Documentation
|
39
|
+
- [ ] Update README.md with new features
|
40
|
+
- [ ] Add/update YARD documentation for new methods
|
41
|
+
- [ ] Create example files for new features
|
42
|
+
- [ ] Update API coverage section in README
|
43
|
+
- [ ] Ensure all public methods have proper documentation
|
44
|
+
|
45
|
+
### 4. Git Commit Standards
|
46
|
+
|
47
|
+
#### Commit Message Format
|
48
|
+
```
|
49
|
+
<type>: <subject>
|
50
|
+
|
51
|
+
<body>
|
52
|
+
|
53
|
+
🤖 Generated with [Claude Code](https://claude.ai/code)
|
54
|
+
|
55
|
+
Co-Authored-By: Claude <noreply@anthropic.com>
|
56
|
+
```
|
57
|
+
|
58
|
+
#### Commit Types
|
59
|
+
- `feat`: New feature
|
60
|
+
- `fix`: Bug fix
|
61
|
+
- `docs`: Documentation only changes
|
62
|
+
- `style`: Code style changes (formatting, missing semi-colons, etc)
|
63
|
+
- `refactor`: Code refactoring
|
64
|
+
- `test`: Adding or updating tests
|
65
|
+
- `chore`: Maintenance tasks
|
66
|
+
- `ci`: CI/CD changes
|
67
|
+
|
68
|
+
#### Examples
|
69
|
+
```bash
|
70
|
+
git commit -m "feat: Add Comments resource with emoji reactions
|
71
|
+
|
72
|
+
- Implement full CRUD operations for comments
|
73
|
+
- Add support for emoji reactions with proper URL encoding
|
74
|
+
- Include comprehensive test coverage
|
75
|
+
|
76
|
+
🤖 Generated with [Claude Code](https://claude.ai/code)
|
77
|
+
|
78
|
+
Co-Authored-By: Claude <noreply@anthropic.com>"
|
79
|
+
```
|
80
|
+
|
81
|
+
## Development Guidelines
|
82
|
+
|
83
|
+
### 1. Test-Driven Development (TDD)
|
84
|
+
- Write tests FIRST before implementing features
|
85
|
+
- Ensure semantic correctness in all tests
|
86
|
+
- Use `instance_double` for type safety in RSpec
|
87
|
+
- Mock external API calls appropriately
|
88
|
+
- Achieve and maintain 100% test coverage
|
89
|
+
|
90
|
+
### 2. Code Organization
|
91
|
+
```
|
92
|
+
lib/attio/
|
93
|
+
├── resources/
|
94
|
+
│ ├── base.rb # Base class with common functionality
|
95
|
+
│ ├── comments.rb # Resource-specific implementation
|
96
|
+
│ └── ...
|
97
|
+
├── client.rb # Main client class
|
98
|
+
├── http_client.rb # HTTP handling
|
99
|
+
├── errors.rb # Error classes
|
100
|
+
└── version.rb # Version constant
|
101
|
+
|
102
|
+
spec/attio/
|
103
|
+
├── resources/ # Resource-specific tests
|
104
|
+
├── client_spec.rb # Client tests
|
105
|
+
└── http_client_spec.rb # HTTP client tests
|
106
|
+
```
|
107
|
+
|
108
|
+
### 3. Resource Implementation Pattern
|
109
|
+
|
110
|
+
When implementing a new resource:
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
# lib/attio/resources/new_resource.rb
|
114
|
+
module Attio
|
115
|
+
module Resources
|
116
|
+
class NewResource < Base
|
117
|
+
def list(params = {})
|
118
|
+
# Implementation
|
119
|
+
end
|
120
|
+
|
121
|
+
def get(id:)
|
122
|
+
validate_id!(id, "NewResource")
|
123
|
+
# Implementation
|
124
|
+
end
|
125
|
+
|
126
|
+
def create(data:)
|
127
|
+
validate_required_hash!(data, "Data")
|
128
|
+
# Implementation
|
129
|
+
end
|
130
|
+
|
131
|
+
def update(id:, data:)
|
132
|
+
validate_id!(id, "NewResource")
|
133
|
+
validate_required_hash!(data, "Data")
|
134
|
+
# Implementation
|
135
|
+
end
|
136
|
+
|
137
|
+
def delete(id:)
|
138
|
+
validate_id!(id, "NewResource")
|
139
|
+
# Implementation
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
```
|
145
|
+
|
146
|
+
### 4. Testing Pattern
|
147
|
+
|
148
|
+
```ruby
|
149
|
+
# spec/attio/resources/new_resource_spec.rb
|
150
|
+
RSpec.describe Attio::Resources::NewResource do
|
151
|
+
let(:connection) { instance_double(Attio::HttpClient) }
|
152
|
+
let(:resource) { described_class.new(connection) }
|
153
|
+
|
154
|
+
describe "#list" do
|
155
|
+
it "lists all resources" do
|
156
|
+
expect(connection).to receive(:get)
|
157
|
+
.with("new_resources", {})
|
158
|
+
.and_return({ "data" => [] })
|
159
|
+
|
160
|
+
result = resource.list
|
161
|
+
expect(result).to eq({ "data" => [] })
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Test all methods with edge cases
|
166
|
+
end
|
167
|
+
```
|
168
|
+
|
169
|
+
### 5. Error Handling
|
170
|
+
- Always validate required parameters
|
171
|
+
- Use specific error classes (ValidationError, NotFoundError, etc.)
|
172
|
+
- Provide clear, actionable error messages
|
173
|
+
- Include parameter names in error messages
|
174
|
+
|
175
|
+
### 6. API Design Principles
|
176
|
+
- Use keyword arguments for clarity
|
177
|
+
- Support optional parameters with defaults
|
178
|
+
- Return full API response (don't extract data)
|
179
|
+
- Maintain consistency across all resources
|
180
|
+
|
181
|
+
## Common Pitfalls to Avoid
|
182
|
+
|
183
|
+
### 1. Test Mocks
|
184
|
+
```ruby
|
185
|
+
# WRONG - Using keyword arguments in mock
|
186
|
+
expect(connection).to receive(:get).with("comments", thread_id: "123")
|
187
|
+
|
188
|
+
# CORRECT - Using hash as second argument
|
189
|
+
expect(connection).to receive(:get).with("comments", { thread_id: "123" })
|
190
|
+
```
|
191
|
+
|
192
|
+
### 2. URL Encoding
|
193
|
+
```ruby
|
194
|
+
# WRONG - Direct string interpolation
|
195
|
+
"comments/#{id}/reactions/#{emoji}"
|
196
|
+
|
197
|
+
# CORRECT - Proper encoding for special characters
|
198
|
+
"comments/#{id}/reactions/#{CGI.escape(emoji)}"
|
199
|
+
```
|
200
|
+
|
201
|
+
### 3. Validation
|
202
|
+
```ruby
|
203
|
+
# WRONG - No validation
|
204
|
+
def get(id:)
|
205
|
+
request(:get, "resources/#{id}")
|
206
|
+
end
|
207
|
+
|
208
|
+
# CORRECT - Validate required parameters
|
209
|
+
def get(id:)
|
210
|
+
validate_id!(id, "Resource")
|
211
|
+
request(:get, "resources/#{id}")
|
212
|
+
end
|
213
|
+
```
|
214
|
+
|
215
|
+
## Release Process
|
216
|
+
|
217
|
+
### 1. Pre-Release
|
218
|
+
```bash
|
219
|
+
# 1. Ensure all tests pass
|
220
|
+
bundle exec rspec
|
221
|
+
|
222
|
+
# 2. Check RuboCop
|
223
|
+
bundle exec rubocop
|
224
|
+
|
225
|
+
# 3. Update version
|
226
|
+
# Edit lib/attio/version.rb
|
227
|
+
|
228
|
+
# 4. Update CHANGELOG
|
229
|
+
# Add release section with date
|
230
|
+
|
231
|
+
# 5. Commit changes
|
232
|
+
git add -A
|
233
|
+
git commit -m "chore: Prepare release v0.2.0"
|
234
|
+
```
|
235
|
+
|
236
|
+
### 2. Create Release
|
237
|
+
```bash
|
238
|
+
# 1. Push to master
|
239
|
+
git push origin master
|
240
|
+
|
241
|
+
# 2. Create and push tag
|
242
|
+
git tag -a v0.2.0 -m "Release v0.2.0"
|
243
|
+
git push origin v0.2.0
|
244
|
+
```
|
245
|
+
|
246
|
+
### 3. Post-Release
|
247
|
+
The CI/CD pipeline will automatically:
|
248
|
+
- Run tests across Ruby 3.0-3.4
|
249
|
+
- Build the gem
|
250
|
+
- Publish to RubyGems (requires RUBYGEMS_AUTH_TOKEN secret)
|
251
|
+
- Create GitHub release
|
252
|
+
|
253
|
+
## RuboCop Configuration
|
254
|
+
|
255
|
+
Key rules enforced:
|
256
|
+
- Line length: 120 characters
|
257
|
+
- Method length: 20 lines
|
258
|
+
- Class length: 250 lines
|
259
|
+
- Cyclomatic complexity: 10
|
260
|
+
- ABC metric: 17
|
261
|
+
- Use `dig` for nested hash access (except single argument)
|
262
|
+
- Prefer string interpolation over concatenation
|
263
|
+
- Use single quotes unless interpolation needed
|
264
|
+
|
265
|
+
## Environment Setup
|
266
|
+
|
267
|
+
### Ruby Version
|
268
|
+
- Minimum: Ruby 3.0
|
269
|
+
- Recommended: Ruby 3.4
|
270
|
+
- CI tests on: 3.0, 3.1, 3.2, 3.3, 3.4
|
271
|
+
|
272
|
+
### Bundler Version
|
273
|
+
- Use bundler 2.4.22 for compatibility
|
274
|
+
- Set in CI: `gem install bundler -v 2.4.22`
|
275
|
+
|
276
|
+
### Development Dependencies
|
277
|
+
```ruby
|
278
|
+
# Gemfile
|
279
|
+
group :development, :test do
|
280
|
+
gem "rspec", "~> 3.13"
|
281
|
+
gem "rubocop", "~> 1.50"
|
282
|
+
gem "rubocop-rspec", "~> 2.22"
|
283
|
+
gem "simplecov", "~> 0.22"
|
284
|
+
gem "webmock", "~> 3.18"
|
285
|
+
gem "yard", "~> 0.9"
|
286
|
+
end
|
287
|
+
```
|
288
|
+
|
289
|
+
## API Coverage Tracking
|
290
|
+
|
291
|
+
Maintain this list in README.md:
|
292
|
+
|
293
|
+
### Core Resources
|
294
|
+
- [x] Records - Full CRUD
|
295
|
+
- [x] Objects - List, Get
|
296
|
+
- [x] Lists - List, Get, Entries, Create/Delete Entry
|
297
|
+
- [x] Comments - Full CRUD, Reactions
|
298
|
+
- [x] Threads - Full CRUD, Participants, Status
|
299
|
+
- [x] Tasks - Full CRUD, Assignment, Completion
|
300
|
+
- [x] Notes - Full CRUD
|
301
|
+
- [x] Workspaces - List, Get
|
302
|
+
- [x] Attributes - List, Create, Update
|
303
|
+
- [x] Users - List, Get
|
304
|
+
- [x] Deals - Full CRUD, Win/Loss tracking
|
305
|
+
- [x] Workspace Members - Management, Invitations
|
306
|
+
- [x] Bulk Operations - Batch operations with automatic batching
|
307
|
+
|
308
|
+
### Enterprise Features
|
309
|
+
- [x] Enhanced Client - Production-ready client
|
310
|
+
- [x] Connection Pooling - Thread-safe pool management
|
311
|
+
- [x] Circuit Breaker - Fault tolerance pattern
|
312
|
+
- [x] Observability - Metrics and tracing (StatsD, Datadog, Prometheus, OpenTelemetry)
|
313
|
+
- [x] Webhooks - Signature verification and event handling
|
314
|
+
- [x] Middleware - Request/response instrumentation
|
315
|
+
|
316
|
+
## Quality Metrics to Maintain
|
317
|
+
|
318
|
+
- **Test Coverage**: 98.74% (1329/1346 lines) ✅ CURRENT
|
319
|
+
- **Test Count**: 607 tests ✅ CURRENT
|
320
|
+
- **RuboCop Offenses**: 0 ✅ ACHIEVED
|
321
|
+
- **Documentation Coverage**: 100% for public methods
|
322
|
+
- **Example Coverage**: Example for each major feature including enterprise features
|
323
|
+
|
324
|
+
## Important API Findings (v0.4.1)
|
325
|
+
|
326
|
+
### Records API
|
327
|
+
- **List/Query Records**: Uses POST to `/v2/objects/{object}/records/query` (NOT GET)
|
328
|
+
- **Get Single Record**: Uses GET to `/v2/objects/{object}/records/{record_id}`
|
329
|
+
- **Create Record**: Uses POST to `/v2/objects/{object}/records`
|
330
|
+
- **Update Record**: Uses PATCH/PUT to `/v2/objects/{object}/records/{record_id}`
|
331
|
+
- **Delete Record**: Uses DELETE to `/v2/objects/{object}/records/{record_id}`
|
332
|
+
|
333
|
+
### Available Endpoints (Confirmed)
|
334
|
+
- `/v2/self` - Get authenticated user info (replaces fake meta/identify)
|
335
|
+
- `/v2/objects` - List available objects in workspace
|
336
|
+
- `/v2/lists` - List management
|
337
|
+
- `/v2/workspace_members` - Workspace member management
|
338
|
+
- `/v2/users` - May require specific permissions (returns 404 with basic key)
|
339
|
+
|
340
|
+
### Webhook Headers
|
341
|
+
- Uses `Attio-Signature` and `Attio-Timestamp` (no X- prefix)
|
342
|
+
|
343
|
+
## Final Reminders
|
344
|
+
|
345
|
+
1. **NEVER** push code with failing tests
|
346
|
+
2. **NEVER** push code with RuboCop violations
|
347
|
+
3. **ALWAYS** update documentation with new features
|
348
|
+
4. **ALWAYS** maintain 100% test coverage
|
349
|
+
5. **ALWAYS** run the full test suite before committing
|
350
|
+
6. **ALWAYS** update the version and CHANGELOG for releases
|
351
|
+
7. **NEVER** create git commits without the co-author attribution
|
352
|
+
|
353
|
+
## Useful Commands Reference
|
354
|
+
|
355
|
+
```bash
|
356
|
+
# Build gem locally
|
357
|
+
gem build attio.gemspec
|
358
|
+
|
359
|
+
# Install gem locally
|
360
|
+
gem install ./attio-0.2.0.gem
|
361
|
+
|
362
|
+
# Test gem in IRB
|
363
|
+
irb -r attio
|
364
|
+
|
365
|
+
# Generate YARD documentation
|
366
|
+
bundle exec yard doc
|
367
|
+
|
368
|
+
# View YARD documentation
|
369
|
+
bundle exec yard server
|
370
|
+
|
371
|
+
# Run specific test with line number
|
372
|
+
bundle exec rspec spec/attio/resources/comments_spec.rb:42
|
373
|
+
|
374
|
+
# Check test coverage details
|
375
|
+
open coverage/index.html
|
376
|
+
|
377
|
+
# List all rake tasks
|
378
|
+
bundle exec rake -T
|
379
|
+
```
|
380
|
+
|
381
|
+
## Contact for Issues
|
382
|
+
|
383
|
+
If you encounter any issues or need clarification:
|
384
|
+
1. Check existing issues on GitHub
|
385
|
+
2. Review test files for usage examples
|
386
|
+
3. Consult the API documentation
|
387
|
+
4. Create a detailed issue with reproduction steps
|
388
|
+
|
389
|
+
---
|
390
|
+
|
391
|
+
**Remember**: Quality over speed. It's better to take time and deliver production-ready code than to rush and create technical debt.
|