rapitapir 0.1.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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +57 -0
- data/CHANGELOG.md +94 -0
- data/CLEANUP_SUMMARY.md +155 -0
- data/CONTRIBUTING.md +280 -0
- data/LICENSE +21 -0
- data/README.md +485 -0
- data/debug_hash.rb +20 -0
- data/docs/EXTENSION_COMPARISON.md +388 -0
- data/docs/SINATRA_EXTENSION.md +467 -0
- data/docs/archive/PHASE_1_2_COMPLETE.md +77 -0
- data/docs/archive/PHASE_1_3_COMPLETE.md +152 -0
- data/docs/archive/PHASE_2_1_OBSERVABILITY_COMPLETED.md +203 -0
- data/docs/archive/PHASE_2_SUMMARY.md +209 -0
- data/docs/archive/REFACTORING_SUMMARY.md +184 -0
- data/docs/archive/phase_1_3_plan.md +136 -0
- data/docs/archive/sinatra_extension_summary.md +188 -0
- data/docs/archive/sinatra_working_solution.md +113 -0
- data/docs/archive/typescript-client-generator-summary.md +259 -0
- data/docs/auto-derivation.md +146 -0
- data/docs/blueprint.md +1091 -0
- data/docs/endpoint-definition.md +211 -0
- data/docs/github_pages_fix.md +52 -0
- data/docs/github_pages_setup.md +49 -0
- data/docs/implementation-status.md +357 -0
- data/docs/observability.md +647 -0
- data/docs/phase3-plan.md +108 -0
- data/docs/sinatra_rapitapir.md +87 -0
- data/docs/type_shortcuts.md +146 -0
- data/examples/README_ENTERPRISE.md +202 -0
- data/examples/authentication_example.rb +192 -0
- data/examples/auto_derivation_ruby_friendly.rb +163 -0
- data/examples/cli/user_api_endpoints.rb +56 -0
- data/examples/client/typescript_client_example.rb +102 -0
- data/examples/client/user-api-client.ts +193 -0
- data/examples/demo_api.rb +41 -0
- data/examples/docs/documentation_example.rb +112 -0
- data/examples/docs/user-api-docs.html +789 -0
- data/examples/docs/user-api-docs.md +403 -0
- data/examples/enhanced_auto_derivation_test.rb +83 -0
- data/examples/enterprise_extension_demo.rb +417 -0
- data/examples/enterprise_rapitapir_api.rb +662 -0
- data/examples/getting_started_extension.rb +218 -0
- data/examples/hello_world.rb +74 -0
- data/examples/oauth2/.env.example +19 -0
- data/examples/oauth2/README.md +205 -0
- data/examples/oauth2/generic_oauth2_api.rb +226 -0
- data/examples/oauth2/get_token.rb +72 -0
- data/examples/oauth2/songs_api_with_auth0.rb +320 -0
- data/examples/oauth2/test_api.sh +16 -0
- data/examples/oauth2/test_songs_api.sh +110 -0
- data/examples/observability/.env.example +35 -0
- data/examples/observability/README.md +230 -0
- data/examples/observability/README_HONEYCOMB.md +332 -0
- data/examples/observability/advanced_setup.rb +384 -0
- data/examples/observability/basic_setup.rb +192 -0
- data/examples/observability/complete_test.rb +121 -0
- data/examples/observability/honeycomb_example.rb +523 -0
- data/examples/observability/honeycomb_rapitapir_clean.rb +488 -0
- data/examples/observability/honeycomb_rapitapir_example.rb +523 -0
- data/examples/observability/honeycomb_working_example.rb +489 -0
- data/examples/observability/quick_test.rb +78 -0
- data/examples/observability/simple_test.rb +14 -0
- data/examples/observability/test_honeycomb_demo.rb +354 -0
- data/examples/observability/test_live_honeycomb.rb +111 -0
- data/examples/observability/test_validation.rb +78 -0
- data/examples/observability/test_working_validation.rb +66 -0
- data/examples/openapi/user_api_schema.rb +132 -0
- data/examples/production_ready_example.rb +105 -0
- data/examples/rails/users_controller.rb +146 -0
- data/examples/readme/basic_sinatra_example.rb +128 -0
- data/examples/server/user_api.rb +179 -0
- data/examples/simple_auto_derivation_demo.rb +44 -0
- data/examples/simple_demo_api.rb +18 -0
- data/examples/sinatra/user_app.rb +127 -0
- data/examples/t_shortcut_demo.rb +59 -0
- data/examples/user_api.rb +190 -0
- data/examples/working_getting_started.rb +184 -0
- data/examples/working_simple_example.rb +195 -0
- data/lib/rapitapir/auth/configuration.rb +129 -0
- data/lib/rapitapir/auth/context.rb +122 -0
- data/lib/rapitapir/auth/errors.rb +104 -0
- data/lib/rapitapir/auth/middleware.rb +324 -0
- data/lib/rapitapir/auth/oauth2.rb +350 -0
- data/lib/rapitapir/auth/schemes.rb +420 -0
- data/lib/rapitapir/auth.rb +113 -0
- data/lib/rapitapir/cli/command.rb +535 -0
- data/lib/rapitapir/cli/server.rb +243 -0
- data/lib/rapitapir/cli/validator.rb +373 -0
- data/lib/rapitapir/client/generator_base.rb +272 -0
- data/lib/rapitapir/client/typescript_generator.rb +350 -0
- data/lib/rapitapir/core/endpoint.rb +158 -0
- data/lib/rapitapir/core/enhanced_endpoint.rb +235 -0
- data/lib/rapitapir/core/input.rb +182 -0
- data/lib/rapitapir/core/output.rb +164 -0
- data/lib/rapitapir/core/request.rb +19 -0
- data/lib/rapitapir/core/response.rb +17 -0
- data/lib/rapitapir/docs/html_generator.rb +780 -0
- data/lib/rapitapir/docs/markdown_generator.rb +464 -0
- data/lib/rapitapir/dsl/endpoint_dsl.rb +116 -0
- data/lib/rapitapir/dsl/enhanced_endpoint_dsl.rb +62 -0
- data/lib/rapitapir/dsl/enhanced_input.rb +73 -0
- data/lib/rapitapir/dsl/enhanced_output.rb +63 -0
- data/lib/rapitapir/dsl/enhanced_structures.rb +393 -0
- data/lib/rapitapir/dsl/fluent_dsl.rb +72 -0
- data/lib/rapitapir/dsl/fluent_endpoint_builder.rb +316 -0
- data/lib/rapitapir/dsl/http_verbs.rb +77 -0
- data/lib/rapitapir/dsl/input_methods.rb +47 -0
- data/lib/rapitapir/dsl/observability_methods.rb +81 -0
- data/lib/rapitapir/dsl/output_methods.rb +43 -0
- data/lib/rapitapir/dsl/type_resolution.rb +43 -0
- data/lib/rapitapir/observability/configuration.rb +108 -0
- data/lib/rapitapir/observability/health_check.rb +236 -0
- data/lib/rapitapir/observability/logging.rb +270 -0
- data/lib/rapitapir/observability/metrics.rb +203 -0
- data/lib/rapitapir/observability/middleware.rb +243 -0
- data/lib/rapitapir/observability/tracing.rb +143 -0
- data/lib/rapitapir/observability.rb +28 -0
- data/lib/rapitapir/openapi/schema_generator.rb +403 -0
- data/lib/rapitapir/schema.rb +136 -0
- data/lib/rapitapir/server/enhanced_rack_adapter.rb +379 -0
- data/lib/rapitapir/server/middleware.rb +120 -0
- data/lib/rapitapir/server/path_matcher.rb +45 -0
- data/lib/rapitapir/server/rack_adapter.rb +215 -0
- data/lib/rapitapir/server/rails_adapter.rb +17 -0
- data/lib/rapitapir/server/rails_adapter_class.rb +53 -0
- data/lib/rapitapir/server/rails_controller.rb +72 -0
- data/lib/rapitapir/server/rails_input_processor.rb +73 -0
- data/lib/rapitapir/server/rails_response_handler.rb +29 -0
- data/lib/rapitapir/server/sinatra_adapter.rb +200 -0
- data/lib/rapitapir/server/sinatra_integration.rb +93 -0
- data/lib/rapitapir/sinatra/configuration.rb +91 -0
- data/lib/rapitapir/sinatra/extension.rb +214 -0
- data/lib/rapitapir/sinatra/oauth2_helpers.rb +236 -0
- data/lib/rapitapir/sinatra/resource_builder.rb +152 -0
- data/lib/rapitapir/sinatra/swagger_ui_generator.rb +166 -0
- data/lib/rapitapir/sinatra_rapitapir.rb +40 -0
- data/lib/rapitapir/types/array.rb +163 -0
- data/lib/rapitapir/types/auto_derivation.rb +265 -0
- data/lib/rapitapir/types/base.rb +146 -0
- data/lib/rapitapir/types/boolean.rb +46 -0
- data/lib/rapitapir/types/date.rb +92 -0
- data/lib/rapitapir/types/datetime.rb +98 -0
- data/lib/rapitapir/types/email.rb +32 -0
- data/lib/rapitapir/types/float.rb +134 -0
- data/lib/rapitapir/types/hash.rb +161 -0
- data/lib/rapitapir/types/integer.rb +143 -0
- data/lib/rapitapir/types/object.rb +156 -0
- data/lib/rapitapir/types/optional.rb +65 -0
- data/lib/rapitapir/types/string.rb +185 -0
- data/lib/rapitapir/types/uuid.rb +32 -0
- data/lib/rapitapir/types.rb +155 -0
- data/lib/rapitapir/version.rb +5 -0
- data/lib/rapitapir.rb +173 -0
- data/rapitapir.gemspec +66 -0
- metadata +387 -0
@@ -0,0 +1,146 @@
|
|
1
|
+
# RapiTapir Auto-Derivation Feature
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
RapiTapir's Auto-Derivation feature automatically generates type schemas from structured data sources that have explicit type information. This addresses Ruby's lack of built-in type declarations by focusing on reliable sources.
|
6
|
+
|
7
|
+
## Supported Sources
|
8
|
+
|
9
|
+
### 1. JSON Schema (Primary Use Case)
|
10
|
+
Perfect for API contracts and external service integration.
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
# API response schema
|
14
|
+
user_schema = {
|
15
|
+
"type" => "object",
|
16
|
+
"properties" => {
|
17
|
+
"id" => { "type" => "integer" },
|
18
|
+
"name" => { "type" => "string" },
|
19
|
+
"email" => { "type" => "string", "format" => "email" },
|
20
|
+
"active" => { "type" => "boolean" },
|
21
|
+
"tags" => { "type" => "array", "items" => { "type" => "string" } }
|
22
|
+
},
|
23
|
+
"required" => ["id", "name", "email"]
|
24
|
+
}
|
25
|
+
|
26
|
+
# Auto-derive RapiTapir schema
|
27
|
+
USER_SCHEMA = RapiTapir::Types.from_json_schema(user_schema)
|
28
|
+
```
|
29
|
+
|
30
|
+
### 2. OpenStruct (Configuration Objects)
|
31
|
+
Great for configuration objects and dynamic data structures.
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
require 'ostruct'
|
35
|
+
|
36
|
+
# Configuration object
|
37
|
+
config = OpenStruct.new(
|
38
|
+
host: "api.example.com",
|
39
|
+
port: 443,
|
40
|
+
ssl: true,
|
41
|
+
timeout: 30.5,
|
42
|
+
features: ["auth", "logging"]
|
43
|
+
)
|
44
|
+
|
45
|
+
# Auto-derive RapiTapir schema
|
46
|
+
CONFIG_SCHEMA = RapiTapir::Types.from_open_struct(config)
|
47
|
+
```
|
48
|
+
|
49
|
+
### 3. Protobuf Messages (When Available)
|
50
|
+
Excellent for gRPC services and binary protocols.
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
# Requires google-protobuf gem
|
54
|
+
USER_SCHEMA = RapiTapir::Types.from_protobuf(UserProto)
|
55
|
+
```
|
56
|
+
|
57
|
+
## Field Filtering
|
58
|
+
|
59
|
+
All methods support field filtering:
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
# Include only specific fields
|
63
|
+
schema = RapiTapir::Types.from_json_schema(json_schema, only: [:id, :name])
|
64
|
+
|
65
|
+
# Exclude specific fields
|
66
|
+
schema = RapiTapir::Types.from_json_schema(json_schema, except: [:internal_id])
|
67
|
+
```
|
68
|
+
|
69
|
+
## Supported JSON Schema Features
|
70
|
+
|
71
|
+
- **Basic Types**: string, integer, number, boolean, array, object
|
72
|
+
- **String Formats**: email, uuid, date, date-time
|
73
|
+
- **Required Fields**: Automatically handled with optional types
|
74
|
+
- **Nested Objects**: Converted to hash types
|
75
|
+
- **Arrays**: With typed items
|
76
|
+
|
77
|
+
## Type Mappings
|
78
|
+
|
79
|
+
### JSON Schema → RapiTapir
|
80
|
+
- `string` → `RapiTapir::Types.string`
|
81
|
+
- `string` (format: email) → `RapiTapir::Types.email`
|
82
|
+
- `string` (format: uuid) → `RapiTapir::Types.uuid`
|
83
|
+
- `string` (format: date) → `RapiTapir::Types.date`
|
84
|
+
- `string` (format: date-time) → `RapiTapir::Types.datetime`
|
85
|
+
- `integer` → `RapiTapir::Types.integer`
|
86
|
+
- `number` → `RapiTapir::Types.float`
|
87
|
+
- `boolean` → `RapiTapir::Types.boolean`
|
88
|
+
- `array` → `RapiTapir::Types.array(item_type)`
|
89
|
+
- `object` → `RapiTapir::Types.hash({})`
|
90
|
+
|
91
|
+
### Ruby Values → RapiTapir (OpenStruct)
|
92
|
+
- `String` → `RapiTapir::Types.string`
|
93
|
+
- `Integer` → `RapiTapir::Types.integer`
|
94
|
+
- `Float` → `RapiTapir::Types.float`
|
95
|
+
- `TrueClass/FalseClass` → `RapiTapir::Types.boolean`
|
96
|
+
- `Date` → `RapiTapir::Types.date`
|
97
|
+
- `Time/DateTime` → `RapiTapir::Types.datetime`
|
98
|
+
- `Array` → `RapiTapir::Types.array(inferred_item_type)`
|
99
|
+
- `Hash` → `RapiTapir::Types.hash({})`
|
100
|
+
|
101
|
+
## Integration Examples
|
102
|
+
|
103
|
+
### API Endpoint with JSON Schema
|
104
|
+
```ruby
|
105
|
+
# Define endpoint with auto-derived input/output schemas
|
106
|
+
api.post('/users') do |endpoint|
|
107
|
+
endpoint
|
108
|
+
.in(json_body(RapiTapir::Types.from_json_schema(create_user_schema)))
|
109
|
+
.out(json_body(RapiTapir::Types.from_json_schema(user_response_schema)))
|
110
|
+
.handle do |input|
|
111
|
+
# Handle user creation
|
112
|
+
end
|
113
|
+
end
|
114
|
+
```
|
115
|
+
|
116
|
+
### Configuration Validation
|
117
|
+
```ruby
|
118
|
+
# Validate configuration objects
|
119
|
+
config_schema = RapiTapir::Types.from_open_struct(default_config)
|
120
|
+
|
121
|
+
api.post('/configure') do |endpoint|
|
122
|
+
endpoint
|
123
|
+
.in(json_body(config_schema))
|
124
|
+
.handle do |config|
|
125
|
+
# Apply configuration
|
126
|
+
end
|
127
|
+
end
|
128
|
+
```
|
129
|
+
|
130
|
+
## Benefits
|
131
|
+
|
132
|
+
1. **Reliable Type Information**: Uses sources with explicit types
|
133
|
+
2. **Reduced Boilerplate**: No manual schema definition needed
|
134
|
+
3. **External Integration**: Perfect for API contracts and third-party schemas
|
135
|
+
4. **Field Control**: Flexible filtering with only/except
|
136
|
+
5. **Error Safety**: Proper validation and error handling
|
137
|
+
|
138
|
+
## Limitations
|
139
|
+
|
140
|
+
- Ruby classes without explicit types are not supported (by design)
|
141
|
+
- Constraint validation from JSON Schema is mapped to basic types
|
142
|
+
- Protobuf support requires the google-protobuf gem
|
143
|
+
|
144
|
+
## Why This Approach?
|
145
|
+
|
146
|
+
Unlike languages with built-in type systems, Ruby's dynamic nature makes type inference unreliable. This feature focuses on sources that provide explicit type information, making auto-derivation practical and dependable for real-world use cases.
|