
Security News
AGENTS.md Gains Traction as an Open Format for AI Coding Agents
AGENTS.md is a fast-growing open format giving AI coding agents a shared, predictable way to understand project setup, style, and workflows.
Validate parameters like strong-parameters(rails)
require "getto/params"
Getto::Params.new.validate(params) do |v|
v.hash(
"name" => v.combine([v.string, v.not_empty]){|val|
raise ArgumentError, "name should be not empty string: #{val}"
},
"token" => v.combine([v.string, v.allow_empty(v.length(5))]),
"key" => v.equal("KEY"),
"str1" => v.in(["param1","param2"]),
"str2" => v.in(["param1","param2"]),
"tel" => v.combine([v.string, v.match(%r{\A[0-9]+-[0-9]+-[0-9]+\Z})]),
"date" => v.combine([v.string, v.match_date]),
"data" => v.not_nil,
"number" => v.match_integer,
"bool" => v.match_bool,
"hash" => v.hash(
"array" => v.array(v.string),
"keys" => v.array_include(["key1","key2","key3"]),
"params" => v.hash(
"key" => v.integer,
"bool" => v.bool,
),
),
"object" => v.hash_strict(
"key" => v.integer,
"bool" => v.bool,
),
)
end
# => true : success
# => false : fail
require "getto/params/search"
time = Time # respond to `parse`
Getto::Params::Search.new(
page: 1,
limit: 1000,
sort: "name.asc",
query: {
"name.cont" => "search",
"value.eq" => "value1",
"date.lteq" => "2018-10-01",
"time.gteq" => "2018-10-01",
"time.lteq" => "2018-10-01",
},
).to_h do |search|
search.sort do |s|
s.straight :name
end
search.convert do |c|
c.convert "date.lteq", &c.to_date
c.convert "time.gteq", &c.to_beginning_of_day(time)
c.convert "time.lteq", &c.to_end_of_day(time)
end
search.query do |q|
q.search "name.cont", &q.not_empty
q.search("value.eq"){|val| ["value1","value2"].include? val }
q.search "date.lteq", &q.not_nil
q.search "time.gteq", &q.not_nil
q.search "time.lteq", &q.not_nil
end
end
# => {
# limit: 1000,
# offset: 0,
# sort: {
# column: :name,
# order: true,
# },
# query: {
# "name.cont": "search",
# "value.eq": "value1",
# "date.lteq": Date.parse("2018-10-01"),
# "time.gteq": Time.parse("2018-10-01 00:00:00"),
# "time.lteq": Time.parse("2018-10-01 23:59:59"),
# },
# }
require "getto/params"
Getto::Params.new.validate(params) do |v|
# argument `params` should be hash
v.hash(
# should be String
"key" => v.string,
# should be Integer
"key" => v.integer,
# should be Boolean
"key" => v.bool,
# should be equal to "value"
"key" => v.equal("value"),
# should be equal to "value1" or "value2"
"key" => v.in(["value1","value2"]),
# should not be empty
"key" => v.not_empty,
# length should be 10,
"key" => v.length(10),
# should match %r{example}
"key" => v.match(%r{example}),
# should match integer (value is string, but seem to be a Integer)
"key" => v.match_integer,
# downcase should be equal to "true" or "false"
"key" => v.match_bool,
# should match date
"key" => v.match_date,
# should be hash includes :key that value is string
"key" => v.hash(
key: v.string,
),
# should be hash only includes :key that value is string
"key" => v.hash_strict(
key: v.string,
),
# should be array that has string value
"key" => v.array(v.string),
# should be array that has "value1" or "value2"
"key" => v.array_include(["value1","value2"])
# should be match integer if value is not empty
"key" => v.allow_empty(v.match_integer),
# validate string and not_empty
"key" => v.combine([v.string, v.not_empty]),
# validate not_nil
"key" => v.not_nil,
# raise error if valudation failed
"key" => v.string{|val| raise ArgumentError, "key should be string: #{val}" }
)
end
# => true : success
# => false : fail
Format parameters for search api
require "getto/params/search"
time = Time # respond to `parse`
Getto::Params::Search.new(
page: 1,
limit: 1000,
sort: "name.asc",
query: {
"name.cont" => "search",
},
).to_h do |search|
search.sort do |s|
# sort name as straight order
s.straight :name
# sort name as invert order
s.invert :name
end
search.convert do |c|
c.convert "date.lteq", &c.to_date
c.convert "time.gteq", &c.to_beginning_of_day(time)
c.convert "time.lteq", &c.to_end_of_day(time)
end
search.query do |q|
# search "name.cont" if value not empty
q.search "name.cont", &q.not_empty
# search "name.in" if any values not empty
q.search "name.in", &q.not_all_empty
end
end
# page: 1, limit: 1000
# => {
# limit: 1000,
# offset: 0,
# }
# page: 2, limit: 1000
# => {
# limit: 1000,
# offset: 1000,
# }
search.sort do |s|
# sort name as straight order
s.straight :name
end
# sort: "name.asc"
# => sort: {
# column: :name,
# order: true, # asc => true
# }
# sort: "name.desc"
# => sort: {
# column: :name,
# order: false, # desc => false
# }
search.sort do |s|
# sort name as invert order
s.invert :name
end
# sort: "name.asc"
# => sort: {
# column: :name,
# order: false, # asc => false
# }
# sort: "name.desc"
# => sort: {
# column: :name,
# order: true, # desc => true
# }
search.convert do |c|
c.convert "date.lteq", &c.to_date
end
# query: { "date.lteq" => "invalid date" }
# => query: {
# "date.lteq" => nil,
# }
# query: { "date.lteq" => "2018-10-01" }
# => query: {
# "date.lteq" => Date.parse("2018-10-01"),
# }
time = Time # respond to `parse`
search.convert do |c|
c.convert "time.gteq", &c.to_beginning_of_day(time)
c.convert "time.lteq", &c.to_end_of_day(time)
end
# query: { "time.gteq" => "invalid date", "time.lteq" => "invalid date" }
# => query: {
# "time.gteq" => nil,
# "time.lteq" => nil,
# }
# query: { "time.gteq" => "2018-10-01", "time.lteq" => "2018-10-01" }
# => query: {
# "time.gteq" => Date.parse("2018-10-01 00:00:00"),
# "time.lteq" => Date.parse("2018-10-01 23:59:59"),
# }
search.convert do |c|
c.convert("name.cont"){|search| search.upcase }
end
# query: { "name.cont" => "search" }
# => query: {
# "name.cont" => "SEARCH",
# }
search.query do |q|
q.search "name.cont", &q.not_empty
end
# query: { "name.cont" => "" }
# => query: {
# }
# query: { "name.cont" => "search" }
# => query: {
# "name.cont": "search",
# }
search.query do |q|
q.search "name.cont", &q.not_nil
end
# query: { "name.cont" => nil }
# => query: {
# }
# query: { "name.cont" => "search" }
# => query: {
# "name.cont": "search",
# }
search.query do |q|
q.search "name.in", &q.not_all_empty
end
# query: { "name.in" => [""] }
# => query: {
# }
# query: { "name.in" => ["value1","value2"] }
# => query: {
# "name.in": ["value1","value2"],
# }
search.query do |q|
q.search("value.eq"){|val| ["value1","value2"].include? val }
end
# query: { "value.eq" => "value3" }
# => query: {
# }
# query: { "value.eq" => "value1" }
# => query: {
# "value.eq": "value1",
# }
Add this line to your application's Gemfile:
gem 'getto-params'
And then execute:
$ bundle
Or install it yourself as:
$ gem install getto-params
getto/params is licensed under the MIT license.
Copyright © since 2018 shun@getto.systems
FAQs
Unknown package
We found that getto-params demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
AGENTS.md is a fast-growing open format giving AI coding agents a shared, predictable way to understand project setup, style, and workflows.
Security News
/Research
Malicious npm package impersonates Nodemailer and drains wallets by hijacking crypto transactions across multiple blockchains.
Security News
This episode explores the hard problem of reachability analysis, from static analysis limits to handling dynamic languages and massive dependency trees.