cmdx 1.14.0 → 1.15.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 +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +8 -1
- data/lib/cmdx/attribute.rb +22 -1
- data/lib/cmdx/validator_registry.rb +1 -0
- data/lib/cmdx/validators/absence.rb +61 -0
- data/lib/cmdx/version.rb +1 -1
- data/lib/locales/af.yml +1 -0
- data/lib/locales/ar.yml +1 -0
- data/lib/locales/az.yml +1 -0
- data/lib/locales/be.yml +1 -0
- data/lib/locales/bg.yml +1 -0
- data/lib/locales/bn.yml +1 -0
- data/lib/locales/bs.yml +1 -0
- data/lib/locales/ca.yml +1 -0
- data/lib/locales/cnr.yml +1 -0
- data/lib/locales/cs.yml +1 -0
- data/lib/locales/cy.yml +1 -0
- data/lib/locales/da.yml +1 -0
- data/lib/locales/de.yml +1 -0
- data/lib/locales/dz.yml +1 -0
- data/lib/locales/el.yml +1 -0
- data/lib/locales/en.yml +1 -0
- data/lib/locales/eo.yml +1 -0
- data/lib/locales/es.yml +1 -0
- data/lib/locales/et.yml +1 -0
- data/lib/locales/eu.yml +1 -0
- data/lib/locales/fa.yml +1 -0
- data/lib/locales/fi.yml +1 -0
- data/lib/locales/fr.yml +1 -0
- data/lib/locales/fy.yml +1 -0
- data/lib/locales/gd.yml +1 -0
- data/lib/locales/gl.yml +1 -0
- data/lib/locales/he.yml +1 -0
- data/lib/locales/hi.yml +1 -0
- data/lib/locales/hr.yml +1 -0
- data/lib/locales/hu.yml +1 -0
- data/lib/locales/hy.yml +1 -0
- data/lib/locales/id.yml +1 -0
- data/lib/locales/is.yml +1 -0
- data/lib/locales/it.yml +1 -0
- data/lib/locales/ja.yml +1 -0
- data/lib/locales/ka.yml +1 -0
- data/lib/locales/kk.yml +1 -0
- data/lib/locales/km.yml +1 -0
- data/lib/locales/kn.yml +1 -0
- data/lib/locales/ko.yml +1 -0
- data/lib/locales/lb.yml +1 -0
- data/lib/locales/lo.yml +1 -0
- data/lib/locales/lt.yml +1 -0
- data/lib/locales/lv.yml +1 -0
- data/lib/locales/mg.yml +1 -0
- data/lib/locales/mk.yml +1 -0
- data/lib/locales/ml.yml +1 -0
- data/lib/locales/mn.yml +1 -0
- data/lib/locales/mr-IN.yml +1 -0
- data/lib/locales/ms.yml +1 -0
- data/lib/locales/nb.yml +1 -0
- data/lib/locales/ne.yml +1 -0
- data/lib/locales/nl.yml +1 -0
- data/lib/locales/nn.yml +1 -0
- data/lib/locales/oc.yml +1 -0
- data/lib/locales/or.yml +1 -0
- data/lib/locales/pa.yml +1 -0
- data/lib/locales/pl.yml +1 -0
- data/lib/locales/pt.yml +1 -0
- data/lib/locales/rm.yml +1 -0
- data/lib/locales/ro.yml +1 -0
- data/lib/locales/ru.yml +1 -0
- data/lib/locales/sc.yml +1 -0
- data/lib/locales/sk.yml +1 -0
- data/lib/locales/sl.yml +1 -0
- data/lib/locales/sq.yml +1 -0
- data/lib/locales/sr.yml +1 -0
- data/lib/locales/st.yml +1 -0
- data/lib/locales/sv.yml +1 -0
- data/lib/locales/sw.yml +1 -0
- data/lib/locales/ta.yml +1 -0
- data/lib/locales/te.yml +1 -0
- data/lib/locales/th.yml +1 -0
- data/lib/locales/tl.yml +1 -0
- data/lib/locales/tr.yml +1 -0
- data/lib/locales/tt.yml +1 -0
- data/lib/locales/ug.yml +1 -0
- data/lib/locales/uk.yml +1 -0
- data/lib/locales/ur.yml +1 -0
- data/lib/locales/uz.yml +1 -0
- data/lib/locales/vi.yml +1 -0
- data/lib/locales/wo.yml +1 -0
- data/lib/locales/zh-CN.yml +1 -0
- data/lib/locales/zh-HK.yml +1 -0
- data/lib/locales/zh-TW.yml +1 -0
- data/lib/locales/zh-YUE.yml +1 -0
- data/mkdocs.yml +3 -0
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f23ba43366877a7e368b02f036bd98212c53ee1d52ae47c09e4d689ac305651e
|
|
4
|
+
data.tar.gz: 4b4e778baa84ae14274c8313464c979fb1be9c9d0651f45ca0483bc7f530a3c2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e1ea9eeebd2d84da3c8d0813dbf8739f8776adc0fb749ee9309f63bff258026b4ec9a8f53e32bca6c8a806ae135a617773709ff41d9b52fd3def07f914b2199d
|
|
7
|
+
data.tar.gz: 1dc6797d0e13aa08f900464c731f81cc5fd15672094c9ce3f02d0487d99395ce219b21ad7a9e95aa1d833b3dd36a9394a156fec503cd417109e3e08d33e41449
|
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.15.0] - 2025-01-21
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- Add attribute `Absence` validator
|
|
13
|
+
- Add attribute `:description` option
|
|
14
|
+
|
|
15
|
+
## [1.14.0] - 2025-01-09
|
|
16
|
+
|
|
9
17
|
### Added
|
|
10
18
|
- Add Ruby 4.0 compatibility
|
|
11
19
|
- Add `Context#clear!` method to remove all context data
|
data/README.md
CHANGED
|
@@ -6,7 +6,14 @@
|
|
|
6
6
|
|
|
7
7
|
Build business logic that’s powerful, predictable, and maintainable.
|
|
8
8
|
|
|
9
|
-
[
|
|
9
|
+
[Home](https://drexed.github.io/cmdx) ·
|
|
10
|
+
[Documentation](https://drexed.github.io/cmdx/getting_started) ·
|
|
11
|
+
[Blog](https://drexed.github.io/cmdx/blog) ·
|
|
12
|
+
[Changelog](./CHANGELOG.md) ·
|
|
13
|
+
[Report Bug](https://github.com/drexed/cmdx/issues) ·
|
|
14
|
+
[Request Feature](https://github.com/drexed/cmdx/issues) ·
|
|
15
|
+
[llms.txt](https://drexed.github.io/cmdx/llms.txt) ·
|
|
16
|
+
[llms-full.txt](https://drexed.github.io/cmdx/llms-full.txt)
|
|
10
17
|
|
|
11
18
|
<img alt="Version" src="https://img.shields.io/gem/v/cmdx">
|
|
12
19
|
<img alt="Build" src="https://github.com/drexed/cmdx/actions/workflows/ci.yml/badge.svg">
|
data/lib/cmdx/attribute.rb
CHANGED
|
@@ -72,6 +72,16 @@ module CMDx
|
|
|
72
72
|
# @rbs @types: Array[Class]
|
|
73
73
|
attr_reader :types
|
|
74
74
|
|
|
75
|
+
# Returns the description of the attribute.
|
|
76
|
+
#
|
|
77
|
+
# @return [String] The description of the attribute
|
|
78
|
+
#
|
|
79
|
+
# @example
|
|
80
|
+
# attribute.description # => "The user's name"
|
|
81
|
+
#
|
|
82
|
+
# @rbs @description: String
|
|
83
|
+
attr_reader :description
|
|
84
|
+
|
|
75
85
|
# Creates a new attribute with the specified name and configuration.
|
|
76
86
|
#
|
|
77
87
|
# @param name [Symbol, String] The name of the attribute
|
|
@@ -79,6 +89,7 @@ module CMDx
|
|
|
79
89
|
# @option options [Attribute] :parent The parent attribute for nested structures
|
|
80
90
|
# @option options [Boolean] :required Whether the attribute is required (default: false)
|
|
81
91
|
# @option options [Array<Class>, Class] :types The expected type(s) for the attribute value
|
|
92
|
+
# @option options [String] :description The description of the attribute
|
|
82
93
|
# @option options [Symbol, String, Proc] :source The source of the attribute value
|
|
83
94
|
# @option options [Symbol, String] :as The method name to use for this attribute
|
|
84
95
|
# @option options [Symbol, String, Boolean] :prefix The prefix to add to the method name
|
|
@@ -98,6 +109,7 @@ module CMDx
|
|
|
98
109
|
@parent = options.delete(:parent)
|
|
99
110
|
@required = options.delete(:required) || false
|
|
100
111
|
@types = Array(options.delete(:types) || options.delete(:type))
|
|
112
|
+
@description = options.delete(:description) || options.delete(:desc)
|
|
101
113
|
|
|
102
114
|
@name = name.to_sym
|
|
103
115
|
@options = options
|
|
@@ -238,13 +250,22 @@ module CMDx
|
|
|
238
250
|
# @return [Hash] A hash representation of the attribute
|
|
239
251
|
#
|
|
240
252
|
# @example
|
|
241
|
-
# attribute.to_h # => {
|
|
253
|
+
# attribute.to_h # => {
|
|
254
|
+
# name: :user_id,
|
|
255
|
+
# method_name: :current_user_id,
|
|
256
|
+
# description: "The user's name",
|
|
257
|
+
# required: true,
|
|
258
|
+
# types: [:integer],
|
|
259
|
+
# options: {},
|
|
260
|
+
# children: []
|
|
261
|
+
# }
|
|
242
262
|
#
|
|
243
263
|
# @rbs () -> Hash[Symbol, untyped]
|
|
244
264
|
def to_h
|
|
245
265
|
{
|
|
246
266
|
name: name,
|
|
247
267
|
method_name: method_name,
|
|
268
|
+
description: description,
|
|
248
269
|
required: required?,
|
|
249
270
|
types: types,
|
|
250
271
|
options: options.except(:if, :unless),
|
|
@@ -29,6 +29,7 @@ module CMDx
|
|
|
29
29
|
# @rbs (?Hash[Symbol, Class]? registry) -> void
|
|
30
30
|
def initialize(registry = nil)
|
|
31
31
|
@registry = registry || {
|
|
32
|
+
absence: Validators::Absence,
|
|
32
33
|
exclusion: Validators::Exclusion,
|
|
33
34
|
format: Validators::Format,
|
|
34
35
|
inclusion: Validators::Inclusion,
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module CMDx
|
|
4
|
+
module Validators
|
|
5
|
+
# Validates that a value is absent or empty
|
|
6
|
+
#
|
|
7
|
+
# This validator ensures that the given value is nil, empty, or consists only of whitespace.
|
|
8
|
+
# It handles different value types appropriately:
|
|
9
|
+
# - Strings: checks for absence of non-whitespace characters
|
|
10
|
+
# - Collections: checks for empty collections
|
|
11
|
+
# - Other objects: checks for nil values
|
|
12
|
+
module Absence
|
|
13
|
+
|
|
14
|
+
extend self
|
|
15
|
+
|
|
16
|
+
# Validates that a value is absent or empty
|
|
17
|
+
#
|
|
18
|
+
# @param value [Object] The value to validate for absence
|
|
19
|
+
# @param options [Hash] Validation configuration options
|
|
20
|
+
# @option options [String] :message Custom error message
|
|
21
|
+
#
|
|
22
|
+
# @return [nil] Returns nil if validation passes
|
|
23
|
+
#
|
|
24
|
+
# @raise [ValidationError] When the value is present, not empty, or contains non-whitespace characters
|
|
25
|
+
#
|
|
26
|
+
# @example Validate string absence
|
|
27
|
+
# Absence.call("")
|
|
28
|
+
# # => nil (validation passes)
|
|
29
|
+
# @example Validate non-empty string
|
|
30
|
+
# Absence.call("hello")
|
|
31
|
+
# # => raises ValidationError
|
|
32
|
+
# @example Validate array absence
|
|
33
|
+
# Absence.call([])
|
|
34
|
+
# # => nil (validation passes)
|
|
35
|
+
# @example Validate non-empty array
|
|
36
|
+
# Absence.call([1, 2, 3])
|
|
37
|
+
# # => raises ValidationError
|
|
38
|
+
# @example Validate with custom message
|
|
39
|
+
# Absence.call("hello", message: "Value must be empty")
|
|
40
|
+
# # => raises ValidationError with custom message
|
|
41
|
+
#
|
|
42
|
+
# @rbs (untyped value, ?Hash[Symbol, untyped] options) -> nil
|
|
43
|
+
def call(value, options = {})
|
|
44
|
+
match =
|
|
45
|
+
if value.is_a?(String)
|
|
46
|
+
/\S/.match?(value)
|
|
47
|
+
elsif value.respond_to?(:empty?)
|
|
48
|
+
!value.empty?
|
|
49
|
+
else
|
|
50
|
+
!value.nil?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
return unless match
|
|
54
|
+
|
|
55
|
+
message = options[:message] if options.is_a?(Hash)
|
|
56
|
+
raise ValidationError, message || Locale.t("cmdx.validators.absence")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
data/lib/cmdx/version.rb
CHANGED
data/lib/locales/af.yml
CHANGED
data/lib/locales/ar.yml
CHANGED
data/lib/locales/az.yml
CHANGED
data/lib/locales/be.yml
CHANGED
data/lib/locales/bg.yml
CHANGED
data/lib/locales/bn.yml
CHANGED
data/lib/locales/bs.yml
CHANGED
data/lib/locales/ca.yml
CHANGED
data/lib/locales/cnr.yml
CHANGED
data/lib/locales/cs.yml
CHANGED
data/lib/locales/cy.yml
CHANGED
data/lib/locales/da.yml
CHANGED
data/lib/locales/de.yml
CHANGED
data/lib/locales/dz.yml
CHANGED
data/lib/locales/el.yml
CHANGED
data/lib/locales/en.yml
CHANGED
data/lib/locales/eo.yml
CHANGED
data/lib/locales/es.yml
CHANGED
data/lib/locales/et.yml
CHANGED
data/lib/locales/eu.yml
CHANGED
data/lib/locales/fa.yml
CHANGED
data/lib/locales/fi.yml
CHANGED
data/lib/locales/fr.yml
CHANGED
data/lib/locales/fy.yml
CHANGED
data/lib/locales/gd.yml
CHANGED
data/lib/locales/gl.yml
CHANGED
data/lib/locales/he.yml
CHANGED
data/lib/locales/hi.yml
CHANGED
data/lib/locales/hr.yml
CHANGED
data/lib/locales/hu.yml
CHANGED
data/lib/locales/hy.yml
CHANGED
|
@@ -26,6 +26,7 @@ hy:
|
|
|
26
26
|
symbol: "սիմվոլ"
|
|
27
27
|
time: "ժամանակ"
|
|
28
28
|
validators:
|
|
29
|
+
absence: "պdelays delays delays delays delays է delays delaysdelays delays delays delays"
|
|
29
30
|
exclusion:
|
|
30
31
|
of: "չի կարող լինել հետևյալներից մեկը: %{values}"
|
|
31
32
|
within: "չի կարող լինել %{min} և %{max} միջև"
|
data/lib/locales/id.yml
CHANGED
data/lib/locales/is.yml
CHANGED
data/lib/locales/it.yml
CHANGED
data/lib/locales/ja.yml
CHANGED
data/lib/locales/ka.yml
CHANGED
data/lib/locales/kk.yml
CHANGED
data/lib/locales/km.yml
CHANGED
data/lib/locales/kn.yml
CHANGED
data/lib/locales/ko.yml
CHANGED
data/lib/locales/lb.yml
CHANGED
data/lib/locales/lo.yml
CHANGED
data/lib/locales/lt.yml
CHANGED
data/lib/locales/lv.yml
CHANGED
data/lib/locales/mg.yml
CHANGED
data/lib/locales/mk.yml
CHANGED
data/lib/locales/ml.yml
CHANGED
data/lib/locales/mn.yml
CHANGED
data/lib/locales/mr-IN.yml
CHANGED
data/lib/locales/ms.yml
CHANGED
data/lib/locales/nb.yml
CHANGED
data/lib/locales/ne.yml
CHANGED
data/lib/locales/nl.yml
CHANGED
data/lib/locales/nn.yml
CHANGED
data/lib/locales/oc.yml
CHANGED
data/lib/locales/or.yml
CHANGED
data/lib/locales/pa.yml
CHANGED
data/lib/locales/pl.yml
CHANGED
data/lib/locales/pt.yml
CHANGED
data/lib/locales/rm.yml
CHANGED
data/lib/locales/ro.yml
CHANGED
data/lib/locales/ru.yml
CHANGED
data/lib/locales/sc.yml
CHANGED
data/lib/locales/sk.yml
CHANGED
data/lib/locales/sl.yml
CHANGED
data/lib/locales/sq.yml
CHANGED
data/lib/locales/sr.yml
CHANGED
data/lib/locales/st.yml
CHANGED
data/lib/locales/sv.yml
CHANGED
data/lib/locales/sw.yml
CHANGED
data/lib/locales/ta.yml
CHANGED
data/lib/locales/te.yml
CHANGED
data/lib/locales/th.yml
CHANGED
data/lib/locales/tl.yml
CHANGED
data/lib/locales/tr.yml
CHANGED
data/lib/locales/tt.yml
CHANGED
data/lib/locales/ug.yml
CHANGED
data/lib/locales/uk.yml
CHANGED
data/lib/locales/ur.yml
CHANGED
data/lib/locales/uz.yml
CHANGED
data/lib/locales/vi.yml
CHANGED
data/lib/locales/wo.yml
CHANGED
data/lib/locales/zh-CN.yml
CHANGED
data/lib/locales/zh-HK.yml
CHANGED
data/lib/locales/zh-TW.yml
CHANGED
data/lib/locales/zh-YUE.yml
CHANGED
data/mkdocs.yml
CHANGED
|
@@ -99,6 +99,7 @@ plugins:
|
|
|
99
99
|
post_date_format: long
|
|
100
100
|
post_url_format: "{slug}"
|
|
101
101
|
archive_date_format: MMMM yyyy
|
|
102
|
+
draft_if_future_date: true
|
|
102
103
|
categories_allowed:
|
|
103
104
|
- Tutorials
|
|
104
105
|
- Updates
|
|
@@ -142,6 +143,7 @@ plugins:
|
|
|
142
143
|
- workflows.md: Composing multiple tasks into sequential pipelines with conditional execution
|
|
143
144
|
More:
|
|
144
145
|
- tips_and_tricks.md: Best practices, patterns, and techniques for maintainable CMDx applications
|
|
146
|
+
- comparison.md: Comparison with other command/service object frameworks
|
|
145
147
|
Ecosystem:
|
|
146
148
|
- cmdx-rspec: RSpec test matchers (https://github.com/drexed/cmdx-rspec)
|
|
147
149
|
|
|
@@ -180,6 +182,7 @@ nav:
|
|
|
180
182
|
- Workflows: workflows.md
|
|
181
183
|
- More:
|
|
182
184
|
- Tips and Tricks: tips_and_tricks.md
|
|
185
|
+
- Comparison: comparison.md
|
|
183
186
|
- References:
|
|
184
187
|
- API Documentation: https://drexed.github.io/cmdx/api/index.html
|
|
185
188
|
- llms.txt: https://drexed.github.io/cmdx/llms.txt
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cmdx
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.15.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Juan Gomez
|
|
@@ -279,6 +279,7 @@ files:
|
|
|
279
279
|
- lib/cmdx/utils/condition.rb
|
|
280
280
|
- lib/cmdx/utils/format.rb
|
|
281
281
|
- lib/cmdx/validator_registry.rb
|
|
282
|
+
- lib/cmdx/validators/absence.rb
|
|
282
283
|
- lib/cmdx/validators/exclusion.rb
|
|
283
284
|
- lib/cmdx/validators/format.rb
|
|
284
285
|
- lib/cmdx/validators/inclusion.rb
|