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 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,4 @@
1
+ module RailsRestKit
2
+ class Engine < ::Rails::Engine
3
+ end
4
+ end
@@ -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,3 @@
1
+ module RailsRestKit
2
+ VERSION = "0.1.0"
3
+ 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: []