name_formatter 0.1.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6037e2a676981c2ef2026b3387a0e21a7e36db146449d51ba4710068e316473e
4
- data.tar.gz: cbc2fd01074904d6d1225f0901b16adc941aa41a2c64f6f6b49e743a17b8c3fd
3
+ metadata.gz: b86a54e891bc3744eab6bbaa8b7382f01a83d94fc401c93065d54e22f04409ac
4
+ data.tar.gz: 104a77f0c37cbf0ac10ef5bc0fddba44b3f2180faa8fdb03d36f99ae0fe97561
5
5
  SHA512:
6
- metadata.gz: a748dfe1cb4cb20fae52eb78a741281ba946f153b38acd35e520d2c5b858104f59701566dd7cedbaa2bdbbcec7201ac858b05463d9d09a5285481324cf510057
7
- data.tar.gz: 266a1de96fd71ba93d85677eb694d6ebcbcf23744ac1c2d6030b20fde0ab3ff0a6c7ca784ca857810960abb13bca41866c8f9da77fbfcce3f53069291774c854
6
+ metadata.gz: 491fa9a588dc94789f9145cf89286442bea60ccfefbb8381c603c411eb0ebd017cb33fc31cdedd941b827406fc7d8e543d7302c89798403d979b9ac9cea2c662
7
+ data.tar.gz: f1daf07814e8a0511e6c9505bea88a16072dc6700e3ec88060956d1e439a0e4bb0532d9a89e1965e10a8b05b167e0068b38f56bcd646cb2aeb48f09a1fbf2581
data/CHANGELOG.md CHANGED
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.2.1] - 2024-06-29
9
+
10
+ ### Changed
11
+ - Minimum Required Ruby Version - Gem doesn't work on Ruby 2
12
+
13
+ ## [0.2.0] - 2024-06-28
14
+
15
+ ### Added
16
+
17
+ - Support for parsing Gaelic names
18
+ - Allow formatting for Last Name only
19
+
8
20
  ## [0.1.0] - 2024-06-28
9
21
  Initial realase
10
22
 
@@ -12,4 +24,6 @@ Initial realase
12
24
 
13
25
  - Support for parsing complex names with prefixes, suffixes, particles and beyond.
14
26
 
27
+ [0.2.1]: https://github.com/kylewelsby/name_formatter/releases/tag/v0.2.1
28
+ [0.2.0]: https://github.com/kylewelsby/name_formatter/releases/tag/v0.2.0
15
29
  [0.1.0]: https://github.com/kylewelsby/name_formatter/releases/tag/v0.1.0
data/README.md CHANGED
@@ -6,7 +6,7 @@ NameFormatter is a Ruby gem that provides robust name parsing and formatting cap
6
6
 
7
7
  ## ✨ Features
8
8
 
9
- - Handles personal names from various cultures (Western, Spanish, German, etc.)
9
+ - Handles personal names from various cultures (Gaelic, Western, Spanish, German, etc.)
10
10
  - Supports company names and legal entities
11
11
  - Correctly formats prefixes, suffixes, and particles (e.g., "van", "de", "von")
12
12
  - Preserves capitalization for names like "McDonald" or "DeVito"
@@ -44,7 +44,7 @@ formatted = formatter.format("JOHN DOE")
44
44
  puts formatted # Output: "John Doe"
45
45
 
46
46
  # Parse and Format a name
47
- parsed = formatter.parse_formatted("Dr. Jane Smith Jr.")
47
+ parsed = formatter.parse_formatted("DR. JANE SMITH JR.")
48
48
  puts parsed
49
49
  # Output: {
50
50
  # prefix: "Dr.",
@@ -54,13 +54,13 @@ puts parsed
54
54
  # }
55
55
 
56
56
  # Parse skip formatting a name
57
- parsed = formatter.parse("Dr. Jane Smith Jr.")
57
+ parsed = formatter.parse("DR. JANE SMITH JR.")
58
58
  puts parsed
59
59
  # Output: {
60
- # prefix: "Dr.",
61
- # first_name: "Jane",
62
- # last_name: "Smith",
63
- # suffix: "Jr."
60
+ # prefix: "DR.",
61
+ # first_name: "JANE",
62
+ # last_name: "SMITH",
63
+ # suffix: "JR."
64
64
  # }
65
65
 
66
66
  # Handle complex names
@@ -0,0 +1,92 @@
1
+ class GaelicNameFormatter
2
+ PREFIXES = %w[Mac Mc Ó O' Ní Nic Bean Mhic Vuic Uí De Dè Gil Gille].freeze
3
+ SUFFIXES = %w[ach an àr nam riss aigh aidh ain án éis ín].freeze
4
+
5
+ PREFIX_PATTERNS = [
6
+ /^(Gill)(An.*)/i,
7
+ /^(Gill)(Ea.*)/i,
8
+ /^(Gille)(Ch.*)/i,
9
+ /^(Gill[e'])([IOèÈ].*)/i,
10
+ /^(Mc)([acdefgiklmnpqrstv][aeiou lnrvw].*)/i,
11
+ /^(Mc)([DPS]h.*)/i,
12
+
13
+ /^(Mac)([Ùùfstu].*)/i,
14
+ /^(Mac)([AÀà][bimnos].*)/i,
15
+ /^(Mac)([AÀà]la.*)/i,
16
+ /^(Mac)([AÀà]d[ah].*)/i,
17
+ /^(Mac)([AÀà]r(?:a|ta).*)/i,
18
+ /^(Mac)(B(?:h|ea).*)/i,
19
+ /^(Mac)(C[aÀàehinlruòÒÙù].*)/i,
20
+ /^(Mac)(Co[dilmnsr].*)/i,
21
+ /^(Mac)(Dh.*)(Sh.*)/i,
22
+ /^(Mac)([DPH]h.*)/i,
23
+ /^(Mac)(Di.*)/i,
24
+ /^(Mac)(E[aòÒ].*)/i,
25
+ /^(Mac)((?:Gi|I)ll[e'])([EFÉéèÈ].+)/i,
26
+ /^(Mac)((?:Gi|I)ll[e']?)(A[no].+)/i,
27
+ /^(Mac)(Ill[e']?)((?:Ea|[CBDFGIÌìMNOPRSTU][haiumon]).+)/i,
28
+
29
+ /^(Mac)(Gill[e'])(O[in].+)/i,
30
+ /^(Mac)(Gi.*)(Ri.+)/i,
31
+ /^(Mac)(Gi.*)(Se.+)/i,
32
+ /^(Mac)(Gi.*)(Ios.+)/i,
33
+ /^(Mac)(Gi.*)([BCDFM]h.+)/i,
34
+ /^(Mac)(Gi.*)(Ghl.+)/i,
35
+ /^(Mac)(G[ahilou].*)/i,
36
+ /^(Mac)(Gri.*)/i,
37
+ /^(Mac)(Gy.*)/i,
38
+ /^(Mac)([IÌì][lo].*)/i,
39
+ /^(Mac)([IÌì]ai.*)/i,
40
+ /^(Mac)([L]a[bcgmot].*)/i,
41
+ /^(Mac)([L]e[òÒ].*)/i,
42
+ /^(Mac)([L][ioÙùu].*)/i,
43
+ /^(Mac)([N][aiÌìo].*)/i,
44
+ /^(Mac)(Nea.*)/i,
45
+ /^(Mac)(Neis)/i,
46
+ /^(Mac)(N[eèÈ]ill)/i,
47
+ /^(Mac)(N[eèÈ]i(ll|s).+)/i,
48
+ /^(Mac)(Mh.+)(Bh.+)/i,
49
+ /^(Mac)(Mh.+)(Chal.+)/i,
50
+ /^(Mac)(Mh.+)(D[òÒ].+)/i,
51
+ /^(Mac)(Mh.+)([Ìì].+)/i,
52
+ /^(Mac)([gdpms]h.*)/i,
53
+ /^(Mac)(R[iÌìou].*)/i,
54
+ /^(Mac)(R[Ààa][bgiot].*)/i
55
+ ].freeze
56
+
57
+ attr_accessor :name
58
+
59
+ def initialize(name)
60
+ @name = name
61
+ end
62
+
63
+ def gaelic?
64
+ return false if name.nil? || name.strip.empty?
65
+
66
+ parts = name.split(/[\s]+/)
67
+ parts.any? do |part|
68
+ PREFIX_PATTERNS.any? { |pattern| part.match?(pattern) }
69
+ end
70
+ end
71
+
72
+ def format
73
+ parts = name.split(/[\s]+/)
74
+ parts.map do |part|
75
+ pattern = PREFIX_PATTERNS.find do |pattern|
76
+ part.match?(pattern)
77
+ end
78
+ if pattern && (match = part.match(pattern))
79
+ match.captures.map do |capture|
80
+ capture = capture.capitalize
81
+ hyphenated_parts = capture.split("-")
82
+ if hyphenated_parts.size > 1
83
+ capture = hyphenated_parts.map(&:capitalize).join("-")
84
+ end
85
+ capture
86
+ end.join
87
+ else
88
+ part
89
+ end
90
+ end.join(" ")
91
+ end
92
+ end
@@ -1,3 +1,3 @@
1
1
  module NameFormatterModule
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -1,4 +1,6 @@
1
1
  require "name_formatter/version"
2
+ require "gaelic_name_formatter"
3
+
2
4
  class NameFormatter
3
5
  VERSION = NameFormatterModule::VERSION
4
6
  PREFIXES = Set.new(["Mr", "Mrs", "Ms", "Miss", "The Hon", "Rev", "Dr", "Fr", "Pres", "Prof", "Msgr", "Sen", "Gov", "Rep", "Amb"]).freeze
@@ -22,11 +24,9 @@ class NameFormatter
22
24
  DUNAME_REGEX = /^Du[b](?=[aeiou])/i
23
25
  DENAME_REGEX = /^De[bfghjlmnpvw][aeioulr](?!(?:sik|a)(?:[-,])?$)/i
24
26
 
25
- MCNAME_REGEX = /^Mc[a-z]+/i
26
- MACNAME_REGEX = /^Mac(?:[aà][bdilmnors]|b[eh]|c[aeioruò]|d[h]|e[aò]|f[hiru]|g[ahilouy]|i[alo]|l[aeiouù]|m[hiua]|n[aeèiìo]|p[h]|r[aiìou]|s[hipu]|t[hiu]|u[airs])+/i
27
27
  PARTICLE_REGEX = /^(de[rsl]|d[aiu]|v[oa]n|te[nr]|la|les|y|and|zu|dell[ao])$/i
28
28
 
29
- def parse(name)
29
+ def parse(name, last_name_only: false)
30
30
  return parse_company_name(name) if company_name?(name)
31
31
 
32
32
  parts = name.strip.split(/\s+/)
@@ -34,7 +34,11 @@ class NameFormatter
34
34
  prefix = extract_prefix_or_suffix(parts, PREFIXES)
35
35
  suffix = extract_prefix_or_suffix(parts.reverse, SUFFIXES)
36
36
 
37
- if parts.size > 1
37
+ if last_name_only
38
+ first_name = nil
39
+ last_name = parts.reject { |part| part == suffix }.join(" ")
40
+ elsif parts.size > 1
41
+
38
42
  first_name = parts.shift
39
43
  last_name = parts.reject { |part| part == suffix }.join(" ")
40
44
  last_name = nil if last_name.empty?
@@ -54,8 +58,8 @@ class NameFormatter
54
58
  }
55
59
  end
56
60
 
57
- def parse_formatted(name)
58
- parsed = parse(name)
61
+ def parse_formatted(name, **)
62
+ parsed = parse(name, **)
59
63
  {
60
64
  prefix: format_prefix(parsed[:prefix]),
61
65
  first_name: format_first_name(parsed[:first_name]),
@@ -64,8 +68,8 @@ class NameFormatter
64
68
  }
65
69
  end
66
70
 
67
- def format(name)
68
- parse_formatted(name).values.compact.join(" ")
71
+ def format(name, **)
72
+ parse_formatted(name, **).values.compact.join(" ")
69
73
  end
70
74
 
71
75
  private
@@ -127,6 +131,11 @@ class NameFormatter
127
131
  end
128
132
 
129
133
  def format_last_name_part(part, next_part)
134
+ gaelic_formatter = GaelicNameFormatter.new(part)
135
+ if gaelic_formatter.gaelic?
136
+ return gaelic_formatter.format
137
+ end
138
+
130
139
  case part.downcase
131
140
  when /^(v[ao]n|te|ter|de)$/i
132
141
  next_part&.match?(/der/i) ? part.downcase : part.capitalize
@@ -134,9 +143,9 @@ class NameFormatter
134
143
  next_part ? part.downcase : part.capitalize
135
144
  when /^dell'\w+/i
136
145
  part[0..4].capitalize + part[5..].capitalize
137
- when MCNAME_REGEX, DUNAME_REGEX, DENAME_REGEX, /^[od]'\w+/i
146
+ when DUNAME_REGEX, DENAME_REGEX, /^[od]'\w+/i
138
147
  part[0..1].capitalize + part[2..].capitalize
139
- when /^von[r]+/i, MACNAME_REGEX
148
+ when /^von[r]+/i
140
149
  part[0..2].capitalize + part[3..].capitalize
141
150
  else
142
151
  part.capitalize
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: name_formatter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle Welsby
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-28 00:00:00.000000000 Z
11
+ date: 2024-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '2.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '2.0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: minitest
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +52,7 @@ files:
66
52
  - CHANGELOG.md
67
53
  - LICENSE
68
54
  - README.md
55
+ - lib/gaelic_name_formatter.rb
69
56
  - lib/name_formatter.rb
70
57
  - lib/name_formatter/version.rb
71
58
  homepage: https://github.com/kylewelsby/name_formatter
@@ -73,6 +60,7 @@ licenses:
73
60
  - MIT
74
61
  metadata:
75
62
  allowed_push_host: https://rubygems.org
63
+ homepage_uri: https://github.com/kylewelsby/name_formatter
76
64
  changelog_uri: https://github.com/kylewelsby/name_formatter/blob/main/CHANGELOG.md
77
65
  funding_uri: https://github.com/sponsors/kylewelsby
78
66
  post_install_message:
@@ -83,7 +71,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
83
71
  requirements:
84
72
  - - ">="
85
73
  - !ruby/object:Gem::Version
86
- version: 2.5.0
74
+ version: 3.0.0
87
75
  required_rubygems_version: !ruby/object:Gem::Requirement
88
76
  requirements:
89
77
  - - ">="