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.
Files changed (157) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +57 -0
  4. data/CHANGELOG.md +94 -0
  5. data/CLEANUP_SUMMARY.md +155 -0
  6. data/CONTRIBUTING.md +280 -0
  7. data/LICENSE +21 -0
  8. data/README.md +485 -0
  9. data/debug_hash.rb +20 -0
  10. data/docs/EXTENSION_COMPARISON.md +388 -0
  11. data/docs/SINATRA_EXTENSION.md +467 -0
  12. data/docs/archive/PHASE_1_2_COMPLETE.md +77 -0
  13. data/docs/archive/PHASE_1_3_COMPLETE.md +152 -0
  14. data/docs/archive/PHASE_2_1_OBSERVABILITY_COMPLETED.md +203 -0
  15. data/docs/archive/PHASE_2_SUMMARY.md +209 -0
  16. data/docs/archive/REFACTORING_SUMMARY.md +184 -0
  17. data/docs/archive/phase_1_3_plan.md +136 -0
  18. data/docs/archive/sinatra_extension_summary.md +188 -0
  19. data/docs/archive/sinatra_working_solution.md +113 -0
  20. data/docs/archive/typescript-client-generator-summary.md +259 -0
  21. data/docs/auto-derivation.md +146 -0
  22. data/docs/blueprint.md +1091 -0
  23. data/docs/endpoint-definition.md +211 -0
  24. data/docs/github_pages_fix.md +52 -0
  25. data/docs/github_pages_setup.md +49 -0
  26. data/docs/implementation-status.md +357 -0
  27. data/docs/observability.md +647 -0
  28. data/docs/phase3-plan.md +108 -0
  29. data/docs/sinatra_rapitapir.md +87 -0
  30. data/docs/type_shortcuts.md +146 -0
  31. data/examples/README_ENTERPRISE.md +202 -0
  32. data/examples/authentication_example.rb +192 -0
  33. data/examples/auto_derivation_ruby_friendly.rb +163 -0
  34. data/examples/cli/user_api_endpoints.rb +56 -0
  35. data/examples/client/typescript_client_example.rb +102 -0
  36. data/examples/client/user-api-client.ts +193 -0
  37. data/examples/demo_api.rb +41 -0
  38. data/examples/docs/documentation_example.rb +112 -0
  39. data/examples/docs/user-api-docs.html +789 -0
  40. data/examples/docs/user-api-docs.md +403 -0
  41. data/examples/enhanced_auto_derivation_test.rb +83 -0
  42. data/examples/enterprise_extension_demo.rb +417 -0
  43. data/examples/enterprise_rapitapir_api.rb +662 -0
  44. data/examples/getting_started_extension.rb +218 -0
  45. data/examples/hello_world.rb +74 -0
  46. data/examples/oauth2/.env.example +19 -0
  47. data/examples/oauth2/README.md +205 -0
  48. data/examples/oauth2/generic_oauth2_api.rb +226 -0
  49. data/examples/oauth2/get_token.rb +72 -0
  50. data/examples/oauth2/songs_api_with_auth0.rb +320 -0
  51. data/examples/oauth2/test_api.sh +16 -0
  52. data/examples/oauth2/test_songs_api.sh +110 -0
  53. data/examples/observability/.env.example +35 -0
  54. data/examples/observability/README.md +230 -0
  55. data/examples/observability/README_HONEYCOMB.md +332 -0
  56. data/examples/observability/advanced_setup.rb +384 -0
  57. data/examples/observability/basic_setup.rb +192 -0
  58. data/examples/observability/complete_test.rb +121 -0
  59. data/examples/observability/honeycomb_example.rb +523 -0
  60. data/examples/observability/honeycomb_rapitapir_clean.rb +488 -0
  61. data/examples/observability/honeycomb_rapitapir_example.rb +523 -0
  62. data/examples/observability/honeycomb_working_example.rb +489 -0
  63. data/examples/observability/quick_test.rb +78 -0
  64. data/examples/observability/simple_test.rb +14 -0
  65. data/examples/observability/test_honeycomb_demo.rb +354 -0
  66. data/examples/observability/test_live_honeycomb.rb +111 -0
  67. data/examples/observability/test_validation.rb +78 -0
  68. data/examples/observability/test_working_validation.rb +66 -0
  69. data/examples/openapi/user_api_schema.rb +132 -0
  70. data/examples/production_ready_example.rb +105 -0
  71. data/examples/rails/users_controller.rb +146 -0
  72. data/examples/readme/basic_sinatra_example.rb +128 -0
  73. data/examples/server/user_api.rb +179 -0
  74. data/examples/simple_auto_derivation_demo.rb +44 -0
  75. data/examples/simple_demo_api.rb +18 -0
  76. data/examples/sinatra/user_app.rb +127 -0
  77. data/examples/t_shortcut_demo.rb +59 -0
  78. data/examples/user_api.rb +190 -0
  79. data/examples/working_getting_started.rb +184 -0
  80. data/examples/working_simple_example.rb +195 -0
  81. data/lib/rapitapir/auth/configuration.rb +129 -0
  82. data/lib/rapitapir/auth/context.rb +122 -0
  83. data/lib/rapitapir/auth/errors.rb +104 -0
  84. data/lib/rapitapir/auth/middleware.rb +324 -0
  85. data/lib/rapitapir/auth/oauth2.rb +350 -0
  86. data/lib/rapitapir/auth/schemes.rb +420 -0
  87. data/lib/rapitapir/auth.rb +113 -0
  88. data/lib/rapitapir/cli/command.rb +535 -0
  89. data/lib/rapitapir/cli/server.rb +243 -0
  90. data/lib/rapitapir/cli/validator.rb +373 -0
  91. data/lib/rapitapir/client/generator_base.rb +272 -0
  92. data/lib/rapitapir/client/typescript_generator.rb +350 -0
  93. data/lib/rapitapir/core/endpoint.rb +158 -0
  94. data/lib/rapitapir/core/enhanced_endpoint.rb +235 -0
  95. data/lib/rapitapir/core/input.rb +182 -0
  96. data/lib/rapitapir/core/output.rb +164 -0
  97. data/lib/rapitapir/core/request.rb +19 -0
  98. data/lib/rapitapir/core/response.rb +17 -0
  99. data/lib/rapitapir/docs/html_generator.rb +780 -0
  100. data/lib/rapitapir/docs/markdown_generator.rb +464 -0
  101. data/lib/rapitapir/dsl/endpoint_dsl.rb +116 -0
  102. data/lib/rapitapir/dsl/enhanced_endpoint_dsl.rb +62 -0
  103. data/lib/rapitapir/dsl/enhanced_input.rb +73 -0
  104. data/lib/rapitapir/dsl/enhanced_output.rb +63 -0
  105. data/lib/rapitapir/dsl/enhanced_structures.rb +393 -0
  106. data/lib/rapitapir/dsl/fluent_dsl.rb +72 -0
  107. data/lib/rapitapir/dsl/fluent_endpoint_builder.rb +316 -0
  108. data/lib/rapitapir/dsl/http_verbs.rb +77 -0
  109. data/lib/rapitapir/dsl/input_methods.rb +47 -0
  110. data/lib/rapitapir/dsl/observability_methods.rb +81 -0
  111. data/lib/rapitapir/dsl/output_methods.rb +43 -0
  112. data/lib/rapitapir/dsl/type_resolution.rb +43 -0
  113. data/lib/rapitapir/observability/configuration.rb +108 -0
  114. data/lib/rapitapir/observability/health_check.rb +236 -0
  115. data/lib/rapitapir/observability/logging.rb +270 -0
  116. data/lib/rapitapir/observability/metrics.rb +203 -0
  117. data/lib/rapitapir/observability/middleware.rb +243 -0
  118. data/lib/rapitapir/observability/tracing.rb +143 -0
  119. data/lib/rapitapir/observability.rb +28 -0
  120. data/lib/rapitapir/openapi/schema_generator.rb +403 -0
  121. data/lib/rapitapir/schema.rb +136 -0
  122. data/lib/rapitapir/server/enhanced_rack_adapter.rb +379 -0
  123. data/lib/rapitapir/server/middleware.rb +120 -0
  124. data/lib/rapitapir/server/path_matcher.rb +45 -0
  125. data/lib/rapitapir/server/rack_adapter.rb +215 -0
  126. data/lib/rapitapir/server/rails_adapter.rb +17 -0
  127. data/lib/rapitapir/server/rails_adapter_class.rb +53 -0
  128. data/lib/rapitapir/server/rails_controller.rb +72 -0
  129. data/lib/rapitapir/server/rails_input_processor.rb +73 -0
  130. data/lib/rapitapir/server/rails_response_handler.rb +29 -0
  131. data/lib/rapitapir/server/sinatra_adapter.rb +200 -0
  132. data/lib/rapitapir/server/sinatra_integration.rb +93 -0
  133. data/lib/rapitapir/sinatra/configuration.rb +91 -0
  134. data/lib/rapitapir/sinatra/extension.rb +214 -0
  135. data/lib/rapitapir/sinatra/oauth2_helpers.rb +236 -0
  136. data/lib/rapitapir/sinatra/resource_builder.rb +152 -0
  137. data/lib/rapitapir/sinatra/swagger_ui_generator.rb +166 -0
  138. data/lib/rapitapir/sinatra_rapitapir.rb +40 -0
  139. data/lib/rapitapir/types/array.rb +163 -0
  140. data/lib/rapitapir/types/auto_derivation.rb +265 -0
  141. data/lib/rapitapir/types/base.rb +146 -0
  142. data/lib/rapitapir/types/boolean.rb +46 -0
  143. data/lib/rapitapir/types/date.rb +92 -0
  144. data/lib/rapitapir/types/datetime.rb +98 -0
  145. data/lib/rapitapir/types/email.rb +32 -0
  146. data/lib/rapitapir/types/float.rb +134 -0
  147. data/lib/rapitapir/types/hash.rb +161 -0
  148. data/lib/rapitapir/types/integer.rb +143 -0
  149. data/lib/rapitapir/types/object.rb +156 -0
  150. data/lib/rapitapir/types/optional.rb +65 -0
  151. data/lib/rapitapir/types/string.rb +185 -0
  152. data/lib/rapitapir/types/uuid.rb +32 -0
  153. data/lib/rapitapir/types.rb +155 -0
  154. data/lib/rapitapir/version.rb +5 -0
  155. data/lib/rapitapir.rb +173 -0
  156. data/rapitapir.gemspec +66 -0
  157. 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.