rails-rest-kit 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/lib/rails_rest_kit/engine.rb +4 -0
- data/lib/rails_rest_kit/helpers/permitter_helper.rb +41 -0
- data/lib/rails_rest_kit/helpers/resource_helper.rb +42 -0
- data/lib/rails_rest_kit/permitter.rb +93 -0
- data/lib/rails_rest_kit/restful_controller_actions.rb +109 -0
- data/lib/rails_rest_kit/version.rb +3 -0
- data/lib/rails_rest_kit.rb +9 -0
- metadata +118 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9791aca5b378e9e0306e7f746c34842852d50c7be0c471237e6898e14767b097
|
4
|
+
data.tar.gz: a37b7cd5667dff1eb33b1ba20d5a5f17ce017c1098f9df811fead1f6c9adb3f6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b1259eb65ad5841f432ab688bf18f6b7c884fd74b3590ae5ede627c94565fa50965d42c4317d38e14d48ca3f21c0352ef441df0ff0518ae02e11d0433048f257
|
7
|
+
data.tar.gz: f217291537dde6c234aa3fbf03549ef8774de0fd34f68ea53fd0aabfcc75d34541adc7825e0880a136aefe4e5781bac2660889b777993a8e8e3b284ac95c316c
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module RailsRestKit
|
2
|
+
module Helpers
|
3
|
+
module PermitterHelper
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
class_attribute :permitter, instance_writer: false
|
8
|
+
self.permitter = RailsRestKit::Permitter.new
|
9
|
+
end
|
10
|
+
|
11
|
+
class_methods do
|
12
|
+
def permit_resource(resource_name, &block)
|
13
|
+
permitter.configure(resource_name, &block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def permit_params(resource_name)
|
20
|
+
self.class.permitter.permit(resource_name, params)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# permitter.configure :blog_post do
|
27
|
+
# require :blog_post
|
28
|
+
# attributes :title, :body
|
29
|
+
# nested :author do
|
30
|
+
# attributes :name, :email
|
31
|
+
# nested :profile do
|
32
|
+
# attributes :bio
|
33
|
+
# end
|
34
|
+
# end
|
35
|
+
# collection :comments do
|
36
|
+
# attributes :content
|
37
|
+
# nested :user do
|
38
|
+
# attributes :username
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
# end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module RailsRestKit
|
2
|
+
module Helper
|
3
|
+
module ResourceHelper
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
# Set show resource
|
8
|
+
define_method("set_#{model_slug}") do
|
9
|
+
instance_variable_set("@#{model_slug}", model_class.find(params[:id])) if !instance_variable_get("@#{model_slug}")
|
10
|
+
instance_variable_get("@#{model_slug}")
|
11
|
+
end
|
12
|
+
# Set new resource
|
13
|
+
define_method("set_new_#{model_slug}") do
|
14
|
+
instance_variable_set("@#{model_slug}", model_class.new) if !instance_variable_get("@#{model_slug}")
|
15
|
+
instance_variable_get("@#{model_slug}")
|
16
|
+
end
|
17
|
+
# Set index resources
|
18
|
+
define_method("set_#{model_slug.pluralize}") do
|
19
|
+
instance_variable_set("@#{model_slug.pluralize}", model_class.all) if !instance_variable_get("@#{model_slug.pluralize}")
|
20
|
+
instance_variable_get("@#{model_slug.pluralize}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class_methods do
|
25
|
+
def model_name
|
26
|
+
@model_name ||= controller_name.classify
|
27
|
+
end
|
28
|
+
alias_method :resource_name, :model_name
|
29
|
+
|
30
|
+
def model_slug
|
31
|
+
@model_slug ||= controller_name.singularize
|
32
|
+
end
|
33
|
+
alias_method :resource_slug, :model_slug
|
34
|
+
|
35
|
+
def model_class
|
36
|
+
@model_class ||= model_name.constantize
|
37
|
+
end
|
38
|
+
alias_method :resource_class, :model_class
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module RailsRestKit
|
2
|
+
class Permitter
|
3
|
+
attr_reader :configurations
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@configurations = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
# Configure permitted attributes for a resource
|
10
|
+
def configure(resource_name, &block)
|
11
|
+
configurations[resource_name.to_s] = Configuration.new(&block)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Get configuration for a specific resource
|
15
|
+
def for(resource_name)
|
16
|
+
configurations[resource_name.to_s]
|
17
|
+
end
|
18
|
+
|
19
|
+
# Permit parameters for a specific resource
|
20
|
+
def permit(resource_name, params)
|
21
|
+
config = for(resource_name)
|
22
|
+
raise ArgumentError, "No configuration found for resource: #{resource_name}" unless config
|
23
|
+
|
24
|
+
config.permit(params)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Configuration class for each resource
|
28
|
+
class Configuration
|
29
|
+
attr_reader :attributes, :nested_attributes, :collections
|
30
|
+
|
31
|
+
def initialize(&block)
|
32
|
+
@attributes = []
|
33
|
+
@nested_attributes = {}
|
34
|
+
@collections = {}
|
35
|
+
instance_eval(&block) if block_given?
|
36
|
+
end
|
37
|
+
|
38
|
+
# Specify required top-level keys
|
39
|
+
def require(*keys)
|
40
|
+
@required_keys.concat(keys.map(&:to_s))
|
41
|
+
end
|
42
|
+
|
43
|
+
# Specify expected top-level keys
|
44
|
+
def expect(*keys)
|
45
|
+
@expected_keys.concat(keys.map(&:to_s))
|
46
|
+
end
|
47
|
+
|
48
|
+
# Define basic attributes
|
49
|
+
def attributes(*attrs)
|
50
|
+
@attributes.concat(attrs.map(&:to_s))
|
51
|
+
end
|
52
|
+
|
53
|
+
# Define nested attributes
|
54
|
+
def nested(name, &block)
|
55
|
+
@nested_attributes[name.to_s] = Configuration.new(&block)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Define collection attributes
|
59
|
+
def collection(name, &block)
|
60
|
+
@collections[name.to_s] = Configuration.new(&block)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Permit parameters based on configuration
|
64
|
+
def permit(params)
|
65
|
+
filtered = params
|
66
|
+
|
67
|
+
# Apply require and expect to params
|
68
|
+
@required_keys.each { |key| filtered = filtered.require(key) }
|
69
|
+
@expected_keys.each { |key| filtered = filtered.expect(key) }
|
70
|
+
|
71
|
+
permitted = filtered.permit(@attributes)
|
72
|
+
|
73
|
+
# Handle nested attributes
|
74
|
+
@nested_attributes.each do |nested_name, nested_config|
|
75
|
+
if filtered[nested_name].present?
|
76
|
+
permitted[nested_name] = nested_config.permit(filtered[nested_name])
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Handle collection attributes
|
81
|
+
@collections.each do |collection_name, collection_config|
|
82
|
+
if filtered[collection_name].present?
|
83
|
+
permitted[collection_name] = filtered[collection_name].map do |item|
|
84
|
+
collection_config.permit(item)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
permitted
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module RailsRestKit
|
2
|
+
module RestfulControllerActions
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
RESTFUL_ACTIONS = {
|
6
|
+
index: %i[],
|
7
|
+
show: %i[],
|
8
|
+
new: %i[],
|
9
|
+
create: %i[ valid invalid ],
|
10
|
+
edit: %i[],
|
11
|
+
update: %i[ valid invalid ],
|
12
|
+
destroy: %i[]
|
13
|
+
}
|
14
|
+
|
15
|
+
included do
|
16
|
+
include RailsRestKit::Helpers::PermitterHelper
|
17
|
+
include RailsRestKit::Helper::ResourceHelper
|
18
|
+
|
19
|
+
define_restful_actions_and_callbacks
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def default_index
|
25
|
+
run_callbacks(:index) do
|
26
|
+
send("set_#{model_slug.pluralize}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def default_show
|
31
|
+
run_callbacks(:show) do
|
32
|
+
send("set_#{model_slug}")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def default_new
|
37
|
+
run_callbacks(:new) do
|
38
|
+
send("set_new_#{model_slug}")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def default_create
|
43
|
+
resource = send("set_new_#{model_slug}")
|
44
|
+
resource.assign_attributes(permit_params(model_slug))
|
45
|
+
run_callbacks(:create) do
|
46
|
+
if resource.save
|
47
|
+
run_callbacks(:create_valid) do
|
48
|
+
end
|
49
|
+
else
|
50
|
+
run_callbacks(:create_invalid) do
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def default_edit
|
57
|
+
run_callbacks(:edit) do
|
58
|
+
send("set_#{model_slug}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def default_update
|
63
|
+
resource = send("set_#{model_slug}")
|
64
|
+
resource.assign_attributes(permit_params(model_slug))
|
65
|
+
run_callbacks(:update) do
|
66
|
+
if resource.save
|
67
|
+
run_callbacks(:update_valid) do
|
68
|
+
end
|
69
|
+
else
|
70
|
+
run_callbacks(:update_invalid) do
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def default_destroy
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.define_restful_actions_and_callbacks
|
80
|
+
# Get RESTful routes for this controller
|
81
|
+
controller_routes = Rails.application.routes.routes.select do |route|
|
82
|
+
route.defaults[:controller] == controller_name && route.defaults[:action].in?(RESTFUL_ACTIONS.keys)
|
83
|
+
end
|
84
|
+
controller_routes.each do |route|
|
85
|
+
action = route.defaults[:action]
|
86
|
+
lifecycle_hooks = RESTFUL_ACTIONS[action]
|
87
|
+
# Define callbacks for the action
|
88
|
+
define_callbacks(action)
|
89
|
+
lifecycle_hooks.each do |hook|
|
90
|
+
define_callbacks("#{action}_#{hook}")
|
91
|
+
end
|
92
|
+
%w[ before after around ].each do |callback|
|
93
|
+
define_singleton_method("#{callback}_#{action}") do |*args, &block|
|
94
|
+
set_callback(action, callback, &block)
|
95
|
+
end
|
96
|
+
lifecycle_hooks.each do |hook|
|
97
|
+
define_singleton_method("#{callback}_#{action}_#{hook}") do |*args, &block|
|
98
|
+
set_callback(action, callback, &block)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
# Define the action method
|
103
|
+
define_method(action) do
|
104
|
+
send("default_#{action}")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require "rails-rest_kit/version"
|
2
|
+
require "rails-rest_kit/helpers/resource_helper"
|
3
|
+
require "rails-rest_kit/helpers/permitter_helper"
|
4
|
+
require "rails-rest_kit/restful_controller_actions"
|
5
|
+
require "rails-rest_kit/permitter"
|
6
|
+
require "rails-rest_kit/engine" if defined?(Rails)
|
7
|
+
|
8
|
+
module RailsRestKit
|
9
|
+
end
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails-rest-kit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brandon Woodruff
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2025-07-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '7.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 7.0.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '7.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 7.0.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: bundler
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '2.1'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2.1'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '13.0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '13.0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rspec
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '3.0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '3.0'
|
75
|
+
description: RailsRestKit provides a comprehensive solution for building RESTful Rails
|
76
|
+
controllers with minimal boilerplate. It automatically generates standard CRUD actions
|
77
|
+
(index, show, new, create, edit, update, destroy) with built-in lifecycle callbacks
|
78
|
+
and validation states (valid/invalid). The gem includes intelligent resource helpers
|
79
|
+
that automatically infer model relationships from controller names, and a flexible
|
80
|
+
parameter permitting system that supports nested attributes and collections. Perfect
|
81
|
+
for rapidly building consistent REST APIs with proper separation of concerns.
|
82
|
+
email: brandonwoodruff92@gmail.com
|
83
|
+
executables: []
|
84
|
+
extensions: []
|
85
|
+
extra_rdoc_files: []
|
86
|
+
files:
|
87
|
+
- lib/rails_rest_kit.rb
|
88
|
+
- lib/rails_rest_kit/engine.rb
|
89
|
+
- lib/rails_rest_kit/helpers/permitter_helper.rb
|
90
|
+
- lib/rails_rest_kit/helpers/resource_helper.rb
|
91
|
+
- lib/rails_rest_kit/permitter.rb
|
92
|
+
- lib/rails_rest_kit/restful_controller_actions.rb
|
93
|
+
- lib/rails_rest_kit/version.rb
|
94
|
+
homepage: https://github.com/brandonwoodruff92/rails-rest-kit
|
95
|
+
licenses:
|
96
|
+
- MIT
|
97
|
+
metadata: {}
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options: []
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: 2.7.0
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubygems_version: 3.5.22
|
114
|
+
signing_key:
|
115
|
+
specification_version: 4
|
116
|
+
summary: Automated RESTful controller actions with lifecycle callbacks and parameter
|
117
|
+
permitting
|
118
|
+
test_files: []
|