safe_params 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/README.md +102 -0
- data/bin/safe_params +4 -0
- data/lib/safe_params/cli.rb +34 -0
- data/lib/safe_params/config_loader.rb +15 -0
- data/lib/safe_params/helper.rb +25 -0
- data/lib/safe_params/railtie.rb +11 -0
- data/lib/safe_params/version.rb +3 -0
- data/lib/safe_params.rb +23 -0
- metadata +83 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 92c40ab05cfbf747a0102e131d10e9b38cf7aa9e7f8927606d8c2d8545698a85
|
4
|
+
data.tar.gz: 47c3f973d54db4ff9d991b58aadeb200499e3b88a1ce777e841eec0fa660d62d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dcf9b7804bdae3758ca84a2ca232b8a8e76b007876d11986ee5fc52c1de9ed5ba2148d8c4b337b4a48b2bc31814add26e9cd11f56059cdcb276ac44c10ded0ee
|
7
|
+
data.tar.gz: 6a9386ed739424f0f6283287a4ce716088d4e56f4b2d5c0df8c3c65e56f37f8807639724351cc0bfcd7f5d444ef1cbf0b5117c8fee33dfa092cad097b9c64c39
|
data/README.md
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
# SafeParams
|
2
|
+
|
3
|
+
A Rails gem that simplifies strong parameter handling by defining permitted attributes in the model.
|
4
|
+
|
5
|
+
## Features
|
6
|
+
|
7
|
+
- Define strong parameters in the model
|
8
|
+
- Supports nested attributes
|
9
|
+
- Load attributes from a YAML or JSON config
|
10
|
+
- CLI generator for auto-generating safe_params lines
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
Add this line to your application's Gemfile:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
gem 'safe_params'
|
18
|
+
```
|
19
|
+
|
20
|
+
And then execute:
|
21
|
+
|
22
|
+
```bash
|
23
|
+
bundle install
|
24
|
+
```
|
25
|
+
|
26
|
+
Or install it yourself as:
|
27
|
+
|
28
|
+
```bash
|
29
|
+
gem install safe_params
|
30
|
+
```
|
31
|
+
|
32
|
+
## Usage
|
33
|
+
|
34
|
+
### In the Model
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
class User < ApplicationRecord
|
38
|
+
include SafeParams
|
39
|
+
safe_params :name, :email, nested: { address_attributes: [:city, :zip] }
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
### In the Controller
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
def user_params
|
47
|
+
safe_params(User)
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
### YAML Config (Optional)
|
52
|
+
|
53
|
+
`config/safe_params.yml`
|
54
|
+
|
55
|
+
```yaml
|
56
|
+
User:
|
57
|
+
- name
|
58
|
+
- email
|
59
|
+
- address_attributes:
|
60
|
+
- city
|
61
|
+
- zip
|
62
|
+
```
|
63
|
+
|
64
|
+
### CLI Generator
|
65
|
+
|
66
|
+
```bash
|
67
|
+
bundle exec ruby -Ilib -r safe_params/cli -e "SafeParams::CLI.start(['generate', 'User'])"
|
68
|
+
```
|
69
|
+
|
70
|
+
Output:
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
safe_params :name, :email, :address_attributes => [:city, :zip]
|
74
|
+
```
|
75
|
+
|
76
|
+
## CLI Usage
|
77
|
+
|
78
|
+
After installing the gem, you can use the CLI to generate a `safe_params` line for any ActiveRecord model:
|
79
|
+
|
80
|
+
```bash
|
81
|
+
safe_params generate User
|
82
|
+
```
|
83
|
+
|
84
|
+
Output:
|
85
|
+
|
86
|
+
```
|
87
|
+
safe_params :name, :email, :address_attributes
|
88
|
+
```
|
89
|
+
|
90
|
+
Show the gem version:
|
91
|
+
|
92
|
+
```bash
|
93
|
+
safe_params version
|
94
|
+
```
|
95
|
+
|
96
|
+
## Contributing
|
97
|
+
|
98
|
+
Bug reports and pull requests are welcome on GitHub at [https://github.com/tewarideepak/safe_params_gem](https://github.com/tewarideepak/safe_params_gem).
|
99
|
+
|
100
|
+
## License
|
101
|
+
|
102
|
+
This project is licensed under the MIT License.
|
data/bin/safe_params
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
# Command-line interface for SafeParams
|
4
|
+
module SafeParams
|
5
|
+
class CLI < Thor
|
6
|
+
desc "generate MODEL", "Print a safe_params line for the given ActiveRecord model."
|
7
|
+
def generate(model_name)
|
8
|
+
model_class = Object.const_get(model_name)
|
9
|
+
unless model_class.respond_to?(:columns)
|
10
|
+
warn "Model '#{model_name}' does not support .columns. Is it an ActiveRecord model?"
|
11
|
+
exit(1)
|
12
|
+
end
|
13
|
+
columns = model_class.columns.reject { |c| %w[id created_at updated_at].include?(c.name) }
|
14
|
+
if columns.empty?
|
15
|
+
puts "safe_params"
|
16
|
+
else
|
17
|
+
keys = columns.map { |c| c.name.to_sym }
|
18
|
+
puts "safe_params #{keys.map(&:inspect).join(', ')}"
|
19
|
+
end
|
20
|
+
rescue NameError
|
21
|
+
warn "Model '#{model_name}' not found. Please check the model name."
|
22
|
+
exit(1)
|
23
|
+
rescue => e
|
24
|
+
warn "Unexpected error: #{e.class}: #{e.message}"
|
25
|
+
exit(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "version", "Show SafeParams version"
|
29
|
+
def version
|
30
|
+
require 'safe_params/version'
|
31
|
+
puts "SafeParams v#{SafeParams::VERSION}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "yaml"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
module SafeParams
|
5
|
+
module ConfigLoader
|
6
|
+
def self.load_for(model_name)
|
7
|
+
file = Dir[Rails.root.join("config/safe_params.{yml,json}")].first
|
8
|
+
return [] unless file && File.exist?(file)
|
9
|
+
|
10
|
+
data = file.end_with?(".json") ? JSON.parse(File.read(file)) : YAML.load_file(file)
|
11
|
+
data ||= {}
|
12
|
+
data[model_name.to_s] || []
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module SafeParams
|
2
|
+
module Helper
|
3
|
+
def safe_params(model)
|
4
|
+
name = model.name.underscore
|
5
|
+
config_params = SafeParams::ConfigLoader.load_for(model.name)
|
6
|
+
|
7
|
+
if Array(config_params).any?
|
8
|
+
params.require(name.to_sym).permit(*symbolize_deep(config_params))
|
9
|
+
else
|
10
|
+
permitted = model.respond_to?(:permitted_attributes) ? model.permitted_attributes : nil
|
11
|
+
params.require(name.to_sym).permit(permitted)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def symbolize_deep(obj)
|
18
|
+
case obj
|
19
|
+
when Hash then obj.transform_keys(&:to_sym).transform_values { |v| symbolize_deep(v) }
|
20
|
+
when Array then obj.map { |e| symbolize_deep(e) }
|
21
|
+
else obj
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/safe_params.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require "safe_params/version"
|
2
|
+
require "safe_params/railtie" if defined?(Rails)
|
3
|
+
require "safe_params/helper"
|
4
|
+
require "safe_params/config_loader"
|
5
|
+
require "safe_params/cli"
|
6
|
+
|
7
|
+
module SafeParams
|
8
|
+
def self.included(base)
|
9
|
+
base.extend ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
def safe_params(*attrs, nested: {})
|
14
|
+
@safe_attrs = attrs.map(&:to_sym)
|
15
|
+
@nested_attrs = nested.transform_keys(&:to_sym)
|
16
|
+
end
|
17
|
+
|
18
|
+
def permitted_attributes
|
19
|
+
nested = @nested_attrs.map { |key, val| { key => val } }
|
20
|
+
@safe_attrs + nested
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: safe_params
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Deepak Tewari
|
8
|
+
bindir: bin
|
9
|
+
cert_chain: []
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
|
+
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: rails
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '0'
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
description: SafeParams is a Rails gem for strong parameter handling. Define permitted
|
41
|
+
attributes in your model or a YAML/JSON config. Supports nested attributes and includes
|
42
|
+
a CLI for generating safe_params lines.
|
43
|
+
email:
|
44
|
+
- tewarid69@gmail.com
|
45
|
+
executables:
|
46
|
+
- safe_params
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- README.md
|
51
|
+
- bin/safe_params
|
52
|
+
- lib/safe_params.rb
|
53
|
+
- lib/safe_params/cli.rb
|
54
|
+
- lib/safe_params/config_loader.rb
|
55
|
+
- lib/safe_params/helper.rb
|
56
|
+
- lib/safe_params/railtie.rb
|
57
|
+
- lib/safe_params/version.rb
|
58
|
+
homepage: https://github.com/tewarideepak/safe_params
|
59
|
+
licenses:
|
60
|
+
- MIT
|
61
|
+
metadata:
|
62
|
+
source_code_uri: https://github.com/tewarideepak/safe_params
|
63
|
+
changelog_uri: https://github.com/tewarideepak/safe_params/blob/main/CHANGELOG.md
|
64
|
+
bug_tracker_uri: https://github.com/tewarideepak/safe_params/issues
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubygems_version: 3.7.1
|
80
|
+
specification_version: 4
|
81
|
+
summary: Strong parameters helper for Rails. Define permitted attributes in your model
|
82
|
+
or config, with CLI support.
|
83
|
+
test_files: []
|