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,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/rapitapir'
|
4
|
+
include RapiTapir::DSL
|
5
|
+
|
6
|
+
# Sample API endpoints for demonstration
|
7
|
+
RapiTapir.get('/users')
|
8
|
+
.out(json_body([{ id: :integer, name: :string, email: :string }]))
|
9
|
+
.summary('List all users')
|
10
|
+
.description('Retrieve a paginated list of all users in the system')
|
11
|
+
|
12
|
+
RapiTapir.get('/users/:id')
|
13
|
+
.in(path_param(:id, :integer))
|
14
|
+
.out(json_body({ id: :integer, name: :string, email: :string, created_at: :string }))
|
15
|
+
.error_out(404, json_body({ error: :string, message: :string }))
|
16
|
+
.summary('Get user by ID')
|
17
|
+
.description('Retrieve detailed information about a specific user')
|
18
|
+
|
19
|
+
RapiTapir.post('/users')
|
20
|
+
.in(json_body({ name: :string, email: :string, password: :string }))
|
21
|
+
.out(status_code(201), json_body({ id: :integer, name: :string, email: :string }))
|
22
|
+
.error_out(400, json_body({ error: :string, validation_errors: [:string] }))
|
23
|
+
.error_out(422, json_body({ error: :string, message: :string }))
|
24
|
+
.summary('Create new user')
|
25
|
+
.description('Create a new user account with the provided information')
|
26
|
+
|
27
|
+
RapiTapir.put('/users/:id')
|
28
|
+
.in(path_param(:id, :integer))
|
29
|
+
.in(json_body({ name: :string, email: :string }))
|
30
|
+
.out(json_body({ id: :integer, name: :string, email: :string, updated_at: :string }))
|
31
|
+
.error_out(404, json_body({ error: :string, message: :string }))
|
32
|
+
.error_out(400, json_body({ error: :string, validation_errors: [:string] }))
|
33
|
+
.summary('Update user')
|
34
|
+
.description('Update an existing user with new information')
|
35
|
+
|
36
|
+
RapiTapir.delete('/users/:id')
|
37
|
+
.in(path_param(:id, :integer))
|
38
|
+
.out(status_code(204))
|
39
|
+
.error_out(404, json_body({ error: :string, message: :string }))
|
40
|
+
.summary('Delete user')
|
41
|
+
.description('Permanently delete a user account')
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../lib/rapitapir'
|
4
|
+
|
5
|
+
# Include DSL to use helper methods
|
6
|
+
include RapiTapir::DSL
|
7
|
+
|
8
|
+
# Define the same User API as before
|
9
|
+
user_api = [
|
10
|
+
# Get all users
|
11
|
+
RapiTapir.get('/users')
|
12
|
+
.out(json_body([{ id: :integer, name: :string, email: :string, created_at: :datetime }]))
|
13
|
+
.summary('Get all users')
|
14
|
+
.description('Retrieve a paginated list of all users in the system'),
|
15
|
+
|
16
|
+
# Get user by ID
|
17
|
+
RapiTapir.get('/users/:id')
|
18
|
+
.in(path_param(:id, :integer))
|
19
|
+
.out(json_body({ id: :integer, name: :string, email: :string, created_at: :datetime,
|
20
|
+
updated_at: :datetime }))
|
21
|
+
.summary('Get user by ID')
|
22
|
+
.description('Retrieve a specific user by their unique identifier'),
|
23
|
+
|
24
|
+
# Create new user
|
25
|
+
RapiTapir.post('/users')
|
26
|
+
.in(body({ name: :string, email: :string, password: :string }))
|
27
|
+
.out(json_body({ id: :integer, name: :string, email: :string, created_at: :datetime }))
|
28
|
+
.summary('Create new user')
|
29
|
+
.description('Create a new user account with the provided information'),
|
30
|
+
|
31
|
+
# Update user
|
32
|
+
RapiTapir.put('/users/:id')
|
33
|
+
.in(path_param(:id, :integer))
|
34
|
+
.in(body({ name: :string, email: :string }))
|
35
|
+
.out(json_body({ id: :integer, name: :string, email: :string, updated_at: :datetime }))
|
36
|
+
.summary('Update user')
|
37
|
+
.description('Update an existing user\'s information'),
|
38
|
+
|
39
|
+
# Delete user
|
40
|
+
RapiTapir.delete('/users/:id')
|
41
|
+
.in(path_param(:id, :integer))
|
42
|
+
.out(json_body({ success: :boolean, message: :string }))
|
43
|
+
.summary('Delete user')
|
44
|
+
.description('Delete a user account permanently'),
|
45
|
+
|
46
|
+
# Search users
|
47
|
+
RapiTapir.get('/users/search')
|
48
|
+
.in(query(:q, :string))
|
49
|
+
.in(query(:limit, :integer, optional: true))
|
50
|
+
.in(query(:offset, :integer, optional: true))
|
51
|
+
.out(json_body({
|
52
|
+
users: [{ id: :integer, name: :string, email: :string }],
|
53
|
+
total: :integer,
|
54
|
+
limit: :integer,
|
55
|
+
offset: :integer
|
56
|
+
}))
|
57
|
+
.summary('Search users')
|
58
|
+
.description('Search for users by name or email with pagination support')
|
59
|
+
]
|
60
|
+
|
61
|
+
puts 'Generating documentation...'
|
62
|
+
|
63
|
+
# Generate Markdown documentation
|
64
|
+
puts "\n1. Generating Markdown documentation..."
|
65
|
+
markdown_generator = RapiTapir::Docs::MarkdownGenerator.new(
|
66
|
+
endpoints: user_api,
|
67
|
+
config: {
|
68
|
+
title: 'User Management API',
|
69
|
+
description: 'Complete API documentation for the User Management system',
|
70
|
+
version: '2.0.0',
|
71
|
+
base_url: 'https://api.example.com/v2',
|
72
|
+
include_toc: true,
|
73
|
+
include_examples: true
|
74
|
+
}
|
75
|
+
)
|
76
|
+
|
77
|
+
markdown_file = File.join(__dir__, 'user-api-docs.md')
|
78
|
+
markdown_generator.save_to_file(markdown_file)
|
79
|
+
|
80
|
+
# Generate HTML documentation
|
81
|
+
puts "\n2. Generating HTML documentation..."
|
82
|
+
html_generator = RapiTapir::Docs::HtmlGenerator.new(
|
83
|
+
endpoints: user_api,
|
84
|
+
config: {
|
85
|
+
title: 'User Management API',
|
86
|
+
description: 'Interactive API documentation for the User Management system',
|
87
|
+
version: '2.0.0',
|
88
|
+
base_url: 'https://api.example.com/v2',
|
89
|
+
theme: 'light',
|
90
|
+
include_try_it: true
|
91
|
+
}
|
92
|
+
)
|
93
|
+
|
94
|
+
html_file = File.join(__dir__, 'user-api-docs.html')
|
95
|
+
html_generator.save_to_file(html_file)
|
96
|
+
|
97
|
+
puts "\nDocumentation generated successfully!"
|
98
|
+
puts "\nFiles created:"
|
99
|
+
puts "- Markdown: #{markdown_file}"
|
100
|
+
puts "- HTML: #{html_file}"
|
101
|
+
|
102
|
+
puts "\nTo view the HTML documentation:"
|
103
|
+
puts "1. Open #{html_file} in your web browser"
|
104
|
+
puts '2. Or serve it with: python -m http.server 8000'
|
105
|
+
puts "3. Or use the CLI: ./bin/rapitapir serve --input #{__FILE__}"
|
106
|
+
|
107
|
+
puts "\nThe HTML documentation includes:"
|
108
|
+
puts "- Interactive 'Try it out' forms for each endpoint"
|
109
|
+
puts '- Syntax-highlighted code examples'
|
110
|
+
puts '- Responsive design for mobile and desktop'
|
111
|
+
puts '- Table of contents navigation'
|
112
|
+
puts '- Detailed parameter documentation'
|