rails_warp 1.0.1 → 1.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab3733aafa1562776836bf91b43064fdab855491260010034b2faab2a2699e39
4
- data.tar.gz: e579ab5ead54f90e831268289a4645ca87baa179ffaaa08e08340692bcf67732
3
+ metadata.gz: 1f452c034dbc05ef83d21fd52ff01303300853afae27de972ac371ad8d103fd1
4
+ data.tar.gz: 81cfb7742946d346711609acc8ab6eb6709d15c92f8d827a2f220b3f3ac67e55
5
5
  SHA512:
6
- metadata.gz: 3dc9ba11879051394341dd4ec8174958ccb11a4ac8f8915dc9bdd3aa3809ff3a0eea8710ceb68698ba60d4fcfe51892d3977d8517303e3cabe62d7e092eedeb9
7
- data.tar.gz: 5862d5a4b814260cf654fab8a0680e91319637b46ee7e5b9ab40b9d0d289f95df1409e663ba0a50cf3a0262dc4829e383a6ec1dec9dd31c426447b969a9d95aa
6
+ metadata.gz: e2a0e7d7f2bf27813840b88d1ee983fc21bc40a07a62529cdabe45d8a3f2474db87b59032cad08d5d16d7e956c844845b926bf6ed29acf8302462e5deb338109
7
+ data.tar.gz: fe0c8e021d1012fe84e61636a42a0f7962bdb46b58e13eca820a3453fd98e0651feb602e68620350c1f72a0ce54d565ea45a3affe60eb172bf25505470767ef3
data/README.md CHANGED
@@ -2,7 +2,75 @@
2
2
  > A Rails plugin for elegant, hash-based response wrapper for clean Rails API responses.
3
3
 
4
4
  ## Usage
5
- How to use my plugin.
5
+
6
+ RailsWarp is automatically included into ActionController and Jbuilder. You don\u2019t need to include any module manually.
7
+
8
+ - Controllers: call ok and fail directly.
9
+
10
+ Basic controller examples:
11
+
12
+ ```ruby
13
+ class UsersController < ApplicationController
14
+ def show
15
+ user = User.find(params[:id])
16
+ ok data: { user: user }
17
+ end
18
+
19
+ def create
20
+ user = User.new(user_params)
21
+ if user.save
22
+ ok data: { user: user }, message: "created", code: 201
23
+ else
24
+ fail message: "validation error", code: 422, data: { errors: user.errors.full_messages }
25
+ end
26
+ end
27
+ end
28
+ ```
29
+
30
+ Add extra fields (merged into the response):
31
+
32
+ ```ruby
33
+ ok data: { user: user }, meta: { request_id: request.request_id }
34
+ ```
35
+
36
+ HTTP status mapping:
37
+ - 200, 201, 204: returned as-is
38
+ - 400: bad_request
39
+ - 401: unauthorized
40
+ - 403: forbidden
41
+ - 404: not_found
42
+ - 422: unprocessable_entity
43
+ - 500: internal_server_error
44
+
45
+ Global error handling example:
46
+
47
+ ```ruby
48
+ class ApplicationController < ActionController::Base
49
+ rescue_from ActiveRecord::RecordNotFound do |e|
50
+ fail message: e.message, code: 404
51
+ end
52
+
53
+ rescue_from StandardError do |e|
54
+ fail message: "internal error", code: 500, data: { error: e.class.name }
55
+ end
56
+ end
57
+ ```
58
+
59
+ Jbuilder usage (already mixed in, call ok/fail inside templates):
60
+
61
+ ```ruby
62
+ # app/views/users/show.json.jbuilder
63
+ json.ok data: { user: { id: @user.id, name: @user.name } }, message: "ok"
64
+
65
+ # app/views/shared/error.json.jbuilder
66
+ json.fail message: "not found", code: 404, data: { resource: "User" }
67
+
68
+ # extra fields
69
+ json.ok data: { list: @items.map { |i| { id: i.id, name: i.name } } }, meta: { total: @items.count }
70
+ ```
71
+
72
+ Aliases in Jbuilder: you can also use `json.warp_ok` and `json.warp_fail`.
73
+
6
74
 
7
75
  ## Installation
8
76
  Add this line to your application's Gemfile:
@@ -11,16 +11,29 @@ module RailsWarp
11
11
  end
12
12
 
13
13
  # 将 Jbuilder 扩展模块包含到 Jbuilder 类中
14
- config.after_initialize do |app|
15
- # Jbuilder 的上下文类通常是 Jbuilder JbuilderTemplate
16
- # 尝试混入到 Jbuilder 类
14
+ initializer "rails_warp.jbuilder", before: :eager_load! do |app|
15
+ # 显式 require jbuilder 以确保 handler 被注册
16
+ require 'jbuilder'
17
+
18
+ # 确保 jbuilder handler 被注册
19
+ if defined?(JbuilderHandler) && !ActionView::Template.registered_template_handler(:jbuilder)
20
+ ActionView::Template.register_template_handler(:jbuilder, JbuilderHandler)
21
+ end
22
+
23
+ # 将 JbuilderExtension 包含到 Jbuilder 类
17
24
  if defined?(Jbuilder)
18
- Jbuilder.include RailsWarp::JbuilderExtension
25
+ Jbuilder.include(RailsWarp::JbuilderExtension)
19
26
  end
20
- # 如果 JbuilderTemplate 存在,也混入它 (在某些 Jbuilder 版本中可能需要)
21
- if defined?(JbuilderTemplate)
22
- JbuilderTemplate.include RailsWarp::JbuilderExtension
27
+
28
+ # 某些版本的 jbuilder 使用 Jbuilder::Template
29
+ if defined?(Jbuilder::Template)
30
+ Jbuilder::Template.include(RailsWarp::JbuilderExtension)
31
+ end
32
+
33
+ # 兼容旧版本的 JbuilderTemplate
34
+ if defined?(JbuilderTemplate) && defined?(JbuilderTemplate) != defined?(Jbuilder::Template)
35
+ JbuilderTemplate.include(RailsWarp::JbuilderExtension)
23
36
  end
24
37
  end
25
38
  end
26
- end
39
+ end
@@ -1,58 +1,45 @@
1
1
  # lib/rails_warp/jbuilder_extension.rb
2
2
  module RailsWarp
3
3
  module JbuilderExtension
4
- # 成功响应结构,用于 jbuilder 模板
5
- def warp_ok(**options)
6
- data = options[:data]
4
+ # 忽略方法_missing 中的特定方法名
5
+ # 我们需要覆盖 method_missing 来拦截这些调用
6
+ def method_missing(method_name, *args, &block)
7
+ if method_name == :warp_ok || method_name == :ok
8
+ _warp_ok(*args, &block)
9
+ elsif method_name == :warp_fail || method_name == :fail
10
+ _warp_fail(*args, &block)
11
+ else
12
+ super
13
+ end
14
+ end
15
+
16
+ def respond_to_missing?(method_name, include_private = false)
17
+ method_name == :warp_ok || method_name == :ok ||
18
+ method_name == :warp_fail || method_name == :fail || super
19
+ end
20
+
21
+ private
22
+
23
+ def _warp_ok(**options)
7
24
  message = options[:message] || "success"
8
25
  code = options[:code] || 200
9
- # 构建响应哈希
10
- response_hash = build_response(true, data, message, code, **options.except(:data, :message, :code))
11
- # 将响应哈希的内容合并到当前 jbuilder 对象
12
- merge!(response_hash)
26
+
27
+ set! :success, true
28
+ set! :code, code
29
+ set! :message, message
30
+
31
+ yield if block_given?
13
32
  end
14
33
 
15
- # 失败响应结构,用于 jbuilder 模板
16
- def warp_fail(**options)
34
+ def _warp_fail(**options)
17
35
  message = options[:message] || "error"
18
36
  code = options[:code] || 500
19
- data = options[:data]
20
- # 构建响应哈希
21
- response_hash = build_response(false, data, message, code, **options.except(:data, :message, :code))
22
- # 将响应哈希的内容合并到当前 jbuilder 对象
23
- merge!(response_hash)
24
- end
25
37
 
26
- # jbuilder 提供别名方法
27
- alias_method :ok, :warp_ok
28
- alias_method :fail, :warp_fail
38
+ set! :success, false
39
+ set! :code, code
40
+ set! :message, message
29
41
 
30
- private
31
-
32
- # 内部构建响应体的辅助方法
33
- def build_response(success, data, message, code, **extra)
34
- response_hash = {
35
- success: success,
36
- code: code,
37
- message: message,
38
- data: data # <--- 修改这里:明确写成 data: data
39
- }
40
- # 合并额外的字段
41
- response_hash.merge!(extra) if extra.present?
42
- response_hash
42
+ yield if block_given?
43
43
  end
44
44
  end
45
45
  end
46
-
47
- # Rails 应用启动时,将 JbuilderExtension 混入到 Jbuilder 的上下文
48
- # Rails.application.config.after_initialize do
49
- # # Jbuilder 的上下文类通常是 Jbuilder 或 JbuilderTemplate
50
- # # 尝试混入到 Jbuilder 类
51
- # if defined?(Jbuilder)
52
- # Jbuilder.include RailsWarp::JbuilderExtension
53
- # end
54
- # # 如果 JbuilderTemplate 存在,也混入它 (在某些 Jbuilder 版本中可能需要)
55
- # if defined?(JbuilderTemplate)
56
- # JbuilderTemplate.include RailsWarp::JbuilderExtension
57
- # end
58
- # end
@@ -1,3 +1,3 @@
1
1
  module RailsWarp
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
data/lib/rails_warp.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  require "rails_warp/version"
3
3
  require "rails_warp/engine"
4
4
  require "rails_warp/response_wrapper"
5
- require "rails_warp/jbuilder_extension" # 引入 jbuilder 扩展
5
+ require "rails_warp/jbuilder_extension"
6
6
 
7
7
  module RailsWarp
8
8
  # 你的插件逻辑可以在这里定义
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_warp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - aric.zheng
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-11-08 00:00:00.000000000 Z
11
+ date: 2026-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jbuilder
@@ -35,20 +35,11 @@ files:
35
35
  - MIT-LICENSE
36
36
  - README.md
37
37
  - Rakefile
38
- - app/assets/stylesheets/rails_warp/application.css
39
- - app/controllers/rails_warp/application_controller.rb
40
- - app/helpers/rails_warp/application_helper.rb
41
- - app/jobs/rails_warp/application_job.rb
42
- - app/mailers/rails_warp/application_mailer.rb
43
- - app/models/rails_warp/application_record.rb
44
- - app/views/layouts/rails_warp/application.html.erb
45
- - config/routes.rb
46
38
  - lib/rails_warp.rb
47
39
  - lib/rails_warp/engine.rb
48
40
  - lib/rails_warp/jbuilder_extension.rb
49
41
  - lib/rails_warp/response_wrapper.rb
50
42
  - lib/rails_warp/version.rb
51
- - lib/tasks/rails_warp_tasks.rake
52
43
  homepage: https://github.com/afeiship/rails_warp
53
44
  licenses:
54
45
  - MIT
@@ -1,15 +0,0 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
- * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
- * files in this directory. Styles in this file should be added after the last require_* statement.
11
- * It is generally better to create a new file per style scope.
12
- *
13
- *= require_tree .
14
- *= require_self
15
- */
@@ -1,4 +0,0 @@
1
- module RailsWarp
2
- class ApplicationController < ActionController::Base
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module RailsWarp
2
- module ApplicationHelper
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module RailsWarp
2
- class ApplicationJob < ActiveJob::Base
3
- end
4
- end
@@ -1,6 +0,0 @@
1
- module RailsWarp
2
- class ApplicationMailer < ActionMailer::Base
3
- default from: "from@example.com"
4
- layout "mailer"
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- module RailsWarp
2
- class ApplicationRecord < ActiveRecord::Base
3
- self.abstract_class = true
4
- end
5
- end
@@ -1,17 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Rails warp</title>
5
- <%= csrf_meta_tags %>
6
- <%= csp_meta_tag %>
7
-
8
- <%= yield :head %>
9
-
10
- <%= stylesheet_link_tag "rails_warp/application", media: "all" %>
11
- </head>
12
- <body>
13
-
14
- <%= yield %>
15
-
16
- </body>
17
- </html>
data/config/routes.rb DELETED
@@ -1,2 +0,0 @@
1
- RailsWarp::Engine.routes.draw do
2
- end
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :rails_warp do
3
- # # Task goes here
4
- # end