oas_rails 0.2.1 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2424eec4c6a122256970ba124f71c0f5dfd9b4392875ac678d4868883cc233ae
4
- data.tar.gz: 182e2434b480920d8cabdd0899c96d48f6c7a69abe5432c33e27f4bc845f3a0c
3
+ metadata.gz: 4c6823d6b64ffb6edbeabed87d2985f006433d6c8243d6e42bf21a6c96fab1e1
4
+ data.tar.gz: 85e8a04aa51388ce0ba2f0e27da7c81176ecc1e62630e301147ac0d1bd57fbac
5
5
  SHA512:
6
- metadata.gz: f0437d44b6b053a3e95659ed43957d3455826ba2981f02140c23f323c5997434aa3c1adbe232188da55b6f62e3ff67e3c83a4a58d64973023555448f14ae964f
7
- data.tar.gz: 5f2edc1bc10dab27b4ff13c9a583bf73c3855dd65c06055dfd26b63d89034d607d5794cf331356b8759443b1a0e072cc0a96fbbc6260ea83641826c0ca66f96c
6
+ metadata.gz: cfd37bb135fcbe966a2ad9972f5339f9c3c196cc10234a65570e023d8ae4386f4d55bac813f51c3da6cb5f4d2f29c49c8294f29eb391d405fa437fe5c5b34375
7
+ data.tar.gz: 49e84dddf1baeb860ae753757a72c5a9989e4c1fd49dcc9b9beb79ea52323a330eb054236e3329756192e68fd43c2cc1ec9f0ea6f269082c0191d4ca184b5596
data/README.md CHANGED
@@ -30,6 +30,24 @@ After experiencing the interactive documentation in Python's fast-api framework,
30
30
 
31
31
  The goal is to minimize the effort required to create comprehensive documentation. By following REST principles in Rails, we believe this is achievable. You can enhance the documentation using [Yard](https://yardoc.org/) tags.
32
32
 
33
+ ## Table of Contents
34
+
35
+ - [Installation](#installation)
36
+ - [Configuration](#configuration)
37
+ - [Basic Information about the API](#basic-information-about-the-api)
38
+ - [Servers Information](#servers-information)
39
+ - [Tag Information](#tag-information)
40
+ - [Optional Settings](#optional-settings)
41
+ - [Authentication Settings](#authentication-settings)
42
+ - [Usage](#usage)
43
+ - [Documenting Your Endpoints](#documenting-your-endpoints)
44
+ - [Example](#example-of-documented-endpoints)
45
+ - [Securing the OasRails Engine](#securing-the-oasrails-engine)
46
+ - [Customizing the View](#customizing-the-view)
47
+ - [Contributing](#contributing)
48
+ - [Roadmap and Ideas for Improvement](#roadmap-and-ideas-for-improvement)
49
+ - [License](#license)
50
+
33
51
  ## Installation
34
52
 
35
53
  1. Add this line to your Rails application's Gemfile:
@@ -52,23 +70,15 @@ The goal is to minimize the effort required to create comprehensive documentatio
52
70
 
53
71
  You'll now have **basic documentation** based on your routes and automatically gathered information at `localhost:3000/docs`. To enhance it, create an initializer file and add [Yard](https://yardoc.org/) tags to your controller methods.
54
72
 
55
- ## Usage
56
-
57
- ### Initializer File
73
+ ## Configuration
58
74
 
59
- You can easy create the initializer file with:
75
+ To configure OasRails, you MUST create an initializer file including all your settings. The first step is to create your initializer file, which you can easily do with:
60
76
 
61
77
  ```bash
62
78
  rails generate oas_rails:config
63
79
  ```
64
80
 
65
- Then complete the created file with your data.
66
-
67
- **Almost every description in a OAS file support simple markdown**
68
-
69
- ## Configuration
70
-
71
- To configure OasRails, edit the `config/initializers/oas_rails.rb` file. Below are the available configuration options:
81
+ Then fill it with your data. Below are the available configuration options:
72
82
 
73
83
  ### Basic Information about the API
74
84
 
@@ -100,56 +110,11 @@ To configure OasRails, edit the `config/initializers/oas_rails.rb` file. Below a
100
110
  - `config.security_schema`: The default security schema used for authentication. Choose a predefined security schema from `[:api_key_cookie, :api_key_header, :api_key_query, :basic, :bearer, :bearer_jwt, :mutual_tls]`.
101
111
  - `config.security_schemas`: Custom security schemas. Follow the [OpenAPI Specification](https://spec.openapis.org/oas/latest.html#security-scheme-object) for defining these schemas.
102
112
 
103
- ## Securing the OasRails Engine
104
-
105
- To secure the OasRails engine, which exposes an endpoint for showing the OAS definition, you can configure authentication to ensure that only authorized users have access. Here are a few methods to achieve this:
106
-
107
- ### 1. Using Basic Authentication
108
-
109
- Use basic authentication to protect the OasRails endpoint. You can set this up in an initializer:
110
-
111
- ```ruby
112
- # config/initializers/oas_rails.rb
113
- OasRails::Engine.middleware.use(Rack::Auth::Basic) do |username, password|
114
- ActiveSupport::SecurityUtils.secure_compare(Rails.application.credentials.oas_rails_username, username) &
115
- ActiveSupport::SecurityUtils.secure_compare(Rails.application.credentials.oas_rails_password, password)
116
- end
117
- ```
118
-
119
- ### 2. Using Devise's `authenticate` Helper
120
-
121
- You can use Devise's `authenticate` helper to restrict access to the OasRails endpoint. For example, you can allow only admin users to access the endpoint:
122
-
123
- ```ruby
124
- # config/routes.rb
125
- # ...
126
- authenticate :user, ->(user) { user.admin? } do
127
- mount OasRails::Engine, at: '/docs'
128
- end
129
- ```
130
-
131
- ### 3. Custom Authentication
132
-
133
- To support custom authentication, you can extend the OasRails' ApplicationController using a hook. This allows you to add custom before actions to check for specific user permissions:
134
-
135
- ```ruby
136
- # config/initializers/oas_rails.rb
137
-
138
- ActiveSupport.on_load(:oas_rails_application_controller) do
139
- # context here is OasRails::ApplicationController
140
-
141
- before_action do
142
- raise ActionController::RoutingError.new('Not Found') unless current_user&.admin?
143
- end
113
+ ## Usage
144
114
 
145
- def current_user
146
- # Load the current user
147
- User.find(session[:user_id]) # Adjust according to your authentication logic
148
- end
149
- end
150
- ```
115
+ In addition to the information provided in the initializer file and the data that can be extracted from the routes and methods automatically, it is essential to document your API in the following way. The documentation is created **with the help of YARD**, so the methods are documented with **comment tags**.
151
116
 
152
- ## Documenting Your Endpoints
117
+ ### Documenting Your Endpoints
153
118
 
154
119
  Almost every description in an OAS file supports simple markdown. The following tags are available for documenting your endpoints:
155
120
 
@@ -331,9 +296,74 @@ class UsersController < ApplicationController
331
296
  end
332
297
  ```
333
298
 
299
+ ## Securing the OasRails Engine
300
+
301
+ To secure the OasRails engine, which exposes an endpoint for showing the OAS definition, you can configure authentication to ensure that only authorized users have access. Here are a few methods to achieve this:
302
+
303
+ ### 1. Using Basic Authentication
304
+
305
+ Use basic authentication to protect the OasRails endpoint. You can set this up in an initializer:
306
+
307
+ ```ruby
308
+ # config/initializers/oas_rails.rb
309
+ OasRails::Engine.middleware.use(Rack::Auth::Basic) do |username, password|
310
+ ActiveSupport::SecurityUtils.secure_compare(Rails.application.credentials.oas_rails_username, username) &
311
+ ActiveSupport::SecurityUtils.secure_compare(Rails.application.credentials.oas_rails_password, password)
312
+ end
313
+ ```
314
+
315
+ ### 2. Using Devise's `authenticate` Helper
316
+
317
+ You can use Devise's `authenticate` helper to restrict access to the OasRails endpoint. For example, you can allow only admin users to access the endpoint:
318
+
319
+ ```ruby
320
+ # config/routes.rb
321
+ # ...
322
+ authenticate :user, ->(user) { user.admin? } do
323
+ mount OasRails::Engine, at: '/docs'
324
+ end
325
+ ```
326
+
327
+ ### 3. Custom Authentication
328
+
329
+ To support custom authentication, you can extend the OasRails' ApplicationController using a hook. This allows you to add custom before actions to check for specific user permissions:
330
+
331
+ ```ruby
332
+ # config/initializers/oas_rails.rb
333
+
334
+ ActiveSupport.on_load(:oas_rails_application_controller) do
335
+ # context here is OasRails::ApplicationController
336
+
337
+ before_action do
338
+ raise ActionController::RoutingError.new('Not Found') unless current_user&.admin?
339
+ end
340
+
341
+ def current_user
342
+ # Load the current user
343
+ User.find(session[:user_id]) # Adjust according to your authentication logic
344
+ end
345
+ end
346
+ ```
347
+
348
+ ## Customizing the View
349
+
350
+ The OasRails engine provides an easy way to display your OpenAPI Specification (OAS) within your Rails application. By default, it includes an `index` view in the `OasRailsController` that displays [RapiDoc](https://rapidocweb.com/) through a CDN with default configurations. You can easily override this view to replace RapiDoc entirely or configure it differently.
351
+
352
+ #### Overriding the `index` View
353
+
354
+ To override the `index` view provided by the OasRails engine, follow these steps:
355
+
356
+ 1. **Create the Override View File**: In your host application, create a new file at the path `app/views/oas_rails/oas_rails/index.html.erb`. If the directories do not exist, you will need to create them.
357
+
358
+ 2. **Customize the View**: Open the newly created `index.html.erb` file and add your custom HTML and ERB code to display the OAS as desired. You can refer to the source code of this project for guidance.
359
+
360
+ #### Using the Custom View
361
+
362
+ Once the custom view file is in place, Rails will automatically use it instead of the view provided by the OasRails engine. This allows you to fully customize the presentation of the OAS without modifying the engine's code.
363
+
334
364
  ## Contributing
335
365
 
336
- Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**. If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
366
+ Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**. If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star⭐! Thanks again!
337
367
 
338
368
  1. Fork the Project
339
369
  2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
@@ -1,5 +1,7 @@
1
1
  module OasRails
2
2
  class OasRailsController < ApplicationController
3
+ layout false
4
+
3
5
  def index
4
6
  respond_to do |format|
5
7
  format.html
@@ -1,16 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Oas rails</title>
5
- <%= csrf_meta_tags %>
6
- <%= csp_meta_tag %>
7
- <meta charset="utf-8">
8
- <!-- Important: rapi-doc uses utf8 characters -->
9
- <script type="module" src="https://unpkg.com/rapidoc/dist/rapidoc-min.js"></script>
10
- </head>
11
- <body>
12
-
13
- <%= yield %>
14
-
15
- </body>
16
- </html>
@@ -1 +1,27 @@
1
- <rapi-doc spec-url = "<%= main_app.oas_rails_path %>.json" theme = "dark" text-color="#f9f9f9" show-header = 'false'> </rapi-doc>
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Oas rails</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+ <meta charset="utf-8">
8
+ <!-- Important: rapi-doc uses utf8 characters -->
9
+ <script type="module" src="https://unpkg.com/rapidoc/dist/rapidoc-min.js"></script>
10
+ </head>
11
+ <body>
12
+ <rapi-doc
13
+ spec-url = "<%= main_app.oas_rails_path %>.json"
14
+ theme = "dark"
15
+ bg-color="#0F172A"
16
+ text-color= "#f7f7f7"
17
+ show-header = 'false'
18
+ primary-color = "#2de410"
19
+ font-size="largest"
20
+ show-method-in-nav-bar="as-colored-text"
21
+ nav-text-color="#f7f7f7"
22
+ nav-item-spacing="relaxed"
23
+ allow-spec-file-download="true"
24
+ >
25
+ </rapi-doc>
26
+ </body>
27
+ </html>
@@ -1,5 +1,10 @@
1
1
  module OasRails
2
2
  class Engine < ::Rails::Engine
3
3
  isolate_namespace OasRails
4
+ config.to_prepare do
5
+ ActiveSupport::Inflector.inflections(:en) do |inflect|
6
+ inflect.acronym 'YARD'
7
+ end
8
+ end
4
9
  end
5
10
  end
@@ -20,23 +20,42 @@ module OasRails
20
20
  new(media_type: "", schema:, examples:)
21
21
  end
22
22
 
23
- def search_for_examples_in_tests(klass:)
24
- case Utils.detect_test_framework
23
+ # Searches for examples in test files based on the provided class and test framework.
24
+ #
25
+ # This method handles different test frameworks to fetch examples for the given class.
26
+ # Currently, it supports FactoryBot and fixtures.
27
+ #
28
+ # @param klass [Class] the class to search examples for.
29
+ # @param utils [Module] a utility module that provides the `detect_test_framework` method. Defaults to `Utils`.
30
+ # @return [Hash] a hash containing examples data or an empty hash if no examples are found.
31
+ # @example Usage with FactoryBot
32
+ # search_for_examples_in_tests(klass: User)
33
+ #
34
+ # @example Usage with fixtures
35
+ # search_for_examples_in_tests(klass: Project)
36
+ #
37
+ # @example Usage with a custom utils module
38
+ # custom_utils = Module.new do
39
+ # def self.detect_test_framework
40
+ # :factory_bot
41
+ # end
42
+ # end
43
+ # search_for_examples_in_tests(klass: User, utils: custom_utils)
44
+ def search_for_examples_in_tests(klass:, utils: Utils)
45
+ case utils.detect_test_framework
25
46
  when :factory_bot
26
47
  {}
27
48
  # TODO: create examples with FactoryBot
28
49
  when :fixtures
29
- # Handle fixtures scenario
30
50
  fixture_file = Rails.root.join('test', 'fixtures', "#{klass.to_s.pluralize.downcase}.yml")
31
- fixture_data = YAML.load_file(fixture_file).with_indifferent_access
32
51
 
33
- users_hash = {}
34
-
35
- # Convert the fixture data to a hash
36
- fixture_data.each do |name, attributes|
37
- users_hash[name] = { value: { klass.to_s.downcase => attributes } }
52
+ begin
53
+ fixture_data = YAML.load_file(fixture_file).with_indifferent_access
54
+ rescue Errno::ENOENT
55
+ return {}
38
56
  end
39
- users_hash
57
+
58
+ fixture_data.transform_values { |attributes| { value: { klass.to_s.downcase => attributes } } }
40
59
  else
41
60
  {}
42
61
  end
@@ -25,7 +25,7 @@ module OasRails
25
25
  end
26
26
 
27
27
  def extract_docstring
28
- YARD::Docstring.parser.parse(
28
+ ::YARD::Docstring.parser.parse(
29
29
  controller_class.constantize.instance_method(method).comment.lines.map { |line| line.sub(/^#\s*/, '') }.join
30
30
  ).to_docstring
31
31
  end
@@ -28,6 +28,14 @@ module OasRails
28
28
  @host_routes ||= extract_host_routes
29
29
  end
30
30
 
31
+ # Clear Class Instance Variable @host_routes
32
+ #
33
+ # This method clear the class instance variable @host_routes
34
+ # to force a extraction of the routes again.
35
+ def clear_cache
36
+ @host_routes = nil
37
+ end
38
+
31
39
  def host_paths
32
40
  @host_paths ||= host_routes.map(&:path).uniq.sort
33
41
  end
@@ -2,12 +2,22 @@ require 'json'
2
2
 
3
3
  module OasRails
4
4
  class Specification
5
+ # Initializes a new Specification object.
6
+ # Clears the cache if running in the development environment.
5
7
  def initialize
6
- OasRails.configure_esquema!
7
- OasRails.configure_yard!
8
+ clear_cache unless Rails.env.production?
9
+
8
10
  @specification = base_spec
9
11
  end
10
12
 
13
+ # Clears the cache for MethodSource and RouteExtractor.
14
+ #
15
+ # @return [void]
16
+ def clear_cache
17
+ MethodSource.clear_cache
18
+ RouteExtractor.clear_cache
19
+ end
20
+
11
21
  def to_json(*_args)
12
22
  @specification.to_json
13
23
  rescue StandardError => e
@@ -1,3 +1,3 @@
1
1
  module OasRails
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -1,5 +1,5 @@
1
1
  module OasRails
2
- module Yard
2
+ module YARD
3
3
  class RequestBodyTag < ::YARD::Tags::Tag
4
4
  attr_accessor :klass, :schema, :required
5
5
 
@@ -41,7 +41,7 @@ module OasRails
41
41
  end
42
42
  end
43
43
 
44
- class OasYardFactory < ::YARD::Tags::DefaultFactory
44
+ class OasYARDFactory < ::YARD::Tags::DefaultFactory
45
45
  ## parse_tag is a prefix used by YARD
46
46
 
47
47
  def parse_tag_with_request_body(tag_name, text)
data/lib/oas_rails.rb CHANGED
@@ -27,12 +27,15 @@ module OasRails
27
27
 
28
28
  autoload :Utils, "oas_rails/utils"
29
29
 
30
- module Yard
31
- autoload :OasYardFactory, 'oas_rails/yard/oas_yard_factory'
30
+ module YARD
31
+ autoload :OasYARDFactory, 'oas_rails/yard/oas_yard_factory'
32
32
  end
33
33
 
34
34
  class << self
35
+ # Configurations for make the OasRails engine Work.
35
36
  def configure
37
+ OasRails.configure_esquema!
38
+ OasRails.configure_yard!
36
39
  yield config
37
40
  end
38
41
 
@@ -41,7 +44,7 @@ module OasRails
41
44
  end
42
45
 
43
46
  def configure_yard!
44
- ::YARD::Tags::Library.default_factory = Yard::OasYardFactory
47
+ ::YARD::Tags::Library.default_factory = YARD::OasYARDFactory
45
48
  yard_tags = {
46
49
  'Request body' => [:request_body, :with_request_body],
47
50
  'Request body Example' => [:request_body_example, :with_request_body_example],
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oas_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - a-chacon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-31 00:00:00.000000000 Z
11
+ date: 2024-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: esquema