Skip to content

Commit f706d16

Browse files
authored
Merge pull request #92 from muonsoft/cursor/-bc-23ca6b43-e72a-4644-a52b-642b164e517c-c91e
Rename Luhn API to LUHN (Go initialism style)
2 parents aee8320 + 06a6d1f commit f706d16

14 files changed

Lines changed: 55 additions & 55 deletions

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Added
1111

1212
- CIDR notation validation: `it.IsCIDR()` with `IPv4Only`, `IPv6Only`, `WithVersion`, `WithNetmaskRange`, and separate invalid vs netmask-range messages; `validate.CIDR`, `validate.CIDRViolationNetmaskBounds`, `is.CIDR`; `validation.ErrInvalidCIDR` / `validation.ErrCIDRNetmaskOutOfRange` and English and Russian translations (behavior aligned with Symfony `Cidr`). Exported names use the **CIDR** initialism per [Go Code Review Comments](https://go.dev/wiki/CodeReviewComments).
13-
- Luhn (mod 10) checksum validation: `it.IsLuhn()`, `validate.Luhn`, `is.Luhn`, with `validation.ErrInvalidLuhn` / `message.InvalidLuhn` and English and Russian translations (behavior aligned with Symfony `Luhn`).
13+
- LUHN (mod 10 / Luhn) checksum validation: `it.IsLUHN()`, `validate.LUHN`, `is.LUHN`, with `validation.ErrInvalidLUHN` / `message.InvalidLUHN` and English and Russian translations (behavior aligned with Symfony `Luhn`).
1414
- ISIN (International Securities Identification Number) validation: `it.IsISIN()`, `validate.ISIN`, `is.ISIN`, with `validation.ErrInvalidISIN` / `message.InvalidISIN` and English and Russian translations (behavior aligned with Symfony `Isin`).
1515

1616
## [0.19.0] - 2026-02-09

errors.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var (
2020
ErrCIDRNetmaskOutOfRange = NewError("CIDR netmask out of range", message.CIDRNetmaskOutOfRange)
2121
ErrInvalidIP = NewError("invalid IP address", message.InvalidIP)
2222
ErrInvalidJSON = NewError("invalid JSON", message.InvalidJSON)
23-
ErrInvalidLuhn = NewError("invalid Luhn", message.InvalidLuhn)
23+
ErrInvalidLUHN = NewError("invalid LUHN", message.InvalidLUHN)
2424
ErrInvalidTime = NewError("invalid time", message.InvalidTime)
2525
ErrInvalidULID = NewError("invalid ULID", message.InvalidULID)
2626
ErrInvalidUPCA = NewError("invalid UPC-A", message.InvalidUPCA)

is/example_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,10 +275,10 @@ func ExampleISIN() {
275275
// false
276276
}
277277

278-
func ExampleLuhn() {
279-
fmt.Println(is.Luhn("79927398713"))
280-
fmt.Println(is.Luhn("79927398710"))
281-
fmt.Println(is.Luhn("12345a"))
278+
func ExampleLUHN() {
279+
fmt.Println(is.LUHN("79927398713"))
280+
fmt.Println(is.LUHN("79927398710"))
281+
fmt.Println(is.LUHN("12345a"))
282282
// Output:
283283
// true
284284
// false

is/identifiers.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ func ISIN(value string) bool {
1616
return validate.ISIN(value) == nil
1717
}
1818

19-
// Luhn validates whether the value passes the Luhn (mod 10) checksum.
20-
// See [github.com/muonsoft/validation/validate.Luhn] for validation rules and possible errors.
19+
// LUHN validates whether the value passes the Luhn (mod 10) checksum.
20+
// See [github.com/muonsoft/validation/validate.LUHN] for validation rules and possible errors.
2121
//
2222
// See https://en.wikipedia.org/wiki/Luhn_algorithm.
23-
func Luhn(value string) bool {
24-
return validate.Luhn(value) == nil
23+
func LUHN(value string) bool {
24+
return validate.LUHN(value) == nil
2525
}
2626

2727
// UUID validates whether a string value is a valid UUID (also known as GUID).

it/example_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ func ExampleIsISIN_invalid() {
5555
// violation: "This value is not a valid International Securities Identification Number (ISIN)."
5656
}
5757

58-
func ExampleIsLuhn_valid() {
59-
err := validator.Validate(context.Background(), validation.String("79927398713", it.IsLuhn()))
58+
func ExampleIsLUHN_valid() {
59+
err := validator.Validate(context.Background(), validation.String("79927398713", it.IsLUHN()))
6060
fmt.Println(err)
6161
// Output:
6262
// <nil>
6363
}
6464

65-
func ExampleIsLuhn_invalid() {
66-
err := validator.Validate(context.Background(), validation.String("79927398710", it.IsLuhn()))
65+
func ExampleIsLUHN_invalid() {
66+
err := validator.Validate(context.Background(), validation.String("79927398710", it.IsLUHN()))
6767
fmt.Println(err)
6868
// Output:
6969
// violation: "Invalid card number."

it/identifiers.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ func IsISIN() validation.StringFuncConstraint {
2424
WithMessage(validation.ErrInvalidISIN.Message())
2525
}
2626

27-
// IsLuhn validates whether the value passes the Luhn (mod 10) checksum, as in
27+
// IsLUHN validates whether the value passes the Luhn (mod 10) checksum, as in
2828
// Symfony\Component\Validator\Constraints\Luhn.
2929
//
3030
// See https://en.wikipedia.org/wiki/Luhn_algorithm.
31-
func IsLuhn() validation.StringFuncConstraint {
32-
return validation.OfStringBy(is.Luhn).
33-
WithError(validation.ErrInvalidLuhn).
34-
WithMessage(validation.ErrInvalidLuhn.Message())
31+
func IsLUHN() validation.StringFuncConstraint {
32+
return validation.OfStringBy(is.LUHN).
33+
WithError(validation.ErrInvalidLUHN).
34+
WithMessage(validation.ErrInvalidLUHN.Message())
3535
}
3636

3737
// UUIDConstraint validates whether a string value is a valid UUID (also known as GUID).

message/messages.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const (
3838
CIDRNetmaskOutOfRange = "The value of the netmask should be between {{ min }} and {{ max }}."
3939
InvalidIP = "This is not a valid IP address."
4040
InvalidJSON = "This value should be valid JSON."
41-
InvalidLuhn = "Invalid card number."
41+
InvalidLUHN = "Invalid card number."
4242
InvalidTime = "This value is not a valid time."
4343
InvalidULID = "This is not a valid ULID."
4444
InvalidUPCA = "This value is not a valid UPC-A."

message/translations/english/messages.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ var Messages = map[language.Tag]map[string]catalog.Message{
5959
message.CIDRNetmaskOutOfRange: catalog.String(message.CIDRNetmaskOutOfRange),
6060
message.InvalidIP: catalog.String(message.InvalidIP),
6161
message.InvalidJSON: catalog.String(message.InvalidJSON),
62-
message.InvalidLuhn: catalog.String(message.InvalidLuhn),
62+
message.InvalidLUHN: catalog.String(message.InvalidLUHN),
6363
message.InvalidTime: catalog.String(message.InvalidTime),
6464
message.InvalidULID: catalog.String(message.InvalidULID),
6565
message.InvalidUPCA: catalog.String(message.InvalidUPCA),

message/translations/russian/messages.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ var Messages = map[language.Tag]map[string]catalog.Message{
6262
message.CIDRNetmaskOutOfRange: catalog.String("Значение маски сети должно быть между {{ min }} и {{ max }}."),
6363
message.InvalidIP: catalog.String("Значение не является допустимым IP адресом."),
6464
message.InvalidJSON: catalog.String("Значение должно быть корректным JSON."),
65-
message.InvalidLuhn: catalog.String("Недействительный номер карты."),
65+
message.InvalidLUHN: catalog.String("Недействительный номер карты."),
6666
message.InvalidTime: catalog.String("Значение времени недопустимо."),
6767
message.InvalidULID: catalog.String("Значение не соответствует формату ULID."),
6868
message.InvalidUPCA: catalog.String("Значение не является допустимым UPC-A."),

test/constraints_identifiers_cases_test.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -110,44 +110,44 @@ var isinConstraintTestCases = []ConstraintValidationTestCase{
110110

111111
var luhnConstraintTestCases = []ConstraintValidationTestCase{
112112
{
113-
name: "IsLuhn passes on empty value",
113+
name: "IsLUHN passes on empty value",
114114
isApplicableFor: specificValueTypes(stringType),
115-
constraint: it.IsLuhn(),
115+
constraint: it.IsLUHN(),
116116
stringValue: stringValue(""),
117117
assert: assertNoError,
118118
},
119119
{
120-
name: "IsLuhn passes on valid value",
120+
name: "IsLUHN passes on valid value",
121121
isApplicableFor: specificValueTypes(stringType),
122122
stringValue: stringValue("79927398713"),
123-
constraint: it.IsLuhn(),
123+
constraint: it.IsLUHN(),
124124
assert: assertNoError,
125125
},
126126
{
127-
name: "IsLuhn violation on invalid checksum",
127+
name: "IsLUHN violation on invalid checksum",
128128
isApplicableFor: specificValueTypes(stringType),
129129
stringValue: stringValue("79927398710"),
130-
constraint: it.IsLuhn(),
131-
assert: assertHasOneViolation(validation.ErrInvalidLuhn, message.InvalidLuhn),
130+
constraint: it.IsLUHN(),
131+
assert: assertHasOneViolation(validation.ErrInvalidLUHN, message.InvalidLUHN),
132132
},
133133
{
134-
name: "IsLuhn violation on only zeros",
134+
name: "IsLUHN violation on only zeros",
135135
isApplicableFor: specificValueTypes(stringType),
136136
stringValue: stringValue("0000000000000000"),
137-
constraint: it.IsLuhn(),
138-
assert: assertHasOneViolation(validation.ErrInvalidLuhn, message.InvalidLuhn),
137+
constraint: it.IsLUHN(),
138+
assert: assertHasOneViolation(validation.ErrInvalidLUHN, message.InvalidLUHN),
139139
},
140140
{
141-
name: "IsLuhn violation on non-digit",
141+
name: "IsLUHN violation on non-digit",
142142
isApplicableFor: specificValueTypes(stringType),
143143
stringValue: stringValue("12345a"),
144-
constraint: it.IsLuhn(),
145-
assert: assertHasOneViolation(validation.ErrInvalidLuhn, message.InvalidLuhn),
144+
constraint: it.IsLUHN(),
145+
assert: assertHasOneViolation(validation.ErrInvalidLUHN, message.InvalidLUHN),
146146
},
147147
{
148-
name: "IsLuhn violation with given error and message",
148+
name: "IsLUHN violation with given error and message",
149149
isApplicableFor: specificValueTypes(stringType),
150-
constraint: it.IsLuhn().
150+
constraint: it.IsLUHN().
151151
WithError(ErrCustom).
152152
WithMessage(
153153
`Invalid value "{{ value }}" for {{ custom }}.`,
@@ -157,23 +157,23 @@ var luhnConstraintTestCases = []ConstraintValidationTestCase{
157157
assert: assertHasOneViolation(ErrCustom, `Invalid value "bad" for parameter.`),
158158
},
159159
{
160-
name: "IsLuhn passes when condition is false",
160+
name: "IsLUHN passes when condition is false",
161161
isApplicableFor: specificValueTypes(stringType),
162-
constraint: it.IsLuhn().When(false),
162+
constraint: it.IsLUHN().When(false),
163163
stringValue: stringValue("79927398710"),
164164
assert: assertNoError,
165165
},
166166
{
167-
name: "IsLuhn violation when condition is true",
167+
name: "IsLUHN violation when condition is true",
168168
isApplicableFor: specificValueTypes(stringType),
169-
constraint: it.IsLuhn().When(true),
169+
constraint: it.IsLUHN().When(true),
170170
stringValue: stringValue("79927398710"),
171-
assert: assertHasOneViolation(validation.ErrInvalidLuhn, message.InvalidLuhn),
171+
assert: assertHasOneViolation(validation.ErrInvalidLUHN, message.InvalidLUHN),
172172
},
173173
{
174-
name: "IsLuhn passes when groups not match",
174+
name: "IsLUHN passes when groups not match",
175175
isApplicableFor: specificValueTypes(stringType),
176-
constraint: it.IsLuhn().WhenGroups(testGroup),
176+
constraint: it.IsLUHN().WhenGroups(testGroup),
177177
stringValue: stringValue("79927398710"),
178178
assert: assertNoError,
179179
},

0 commit comments

Comments
 (0)