person-name 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -0,0 +1,16 @@
1
+ require "active_record"
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+
5
+ require "person_name/name"
6
+ require "person_name/migration_support"
7
+ require "person_name/has_person_name"
8
+
9
+ $LOAD_PATH.shift
10
+
11
+ if defined?(ActiveRecord::ConnectionAdapters::TableDefinition)
12
+ ActiveRecord::ConnectionAdapters::TableDefinition.send :include, PersonName::MigrationSupport
13
+ end
14
+ if defined?(ActiveRecord::Base)
15
+ ActiveRecord::Base.send :include, PersonName::ActiveRecord
16
+ end
@@ -1,202 +1,196 @@
1
- class PersonName::Name
2
-
3
- NAME_PARTS = %w(prefix first_name middle_name intercalation last_name suffix)
4
-
5
- def initialize(naming_prefix, record)
6
- @naming_prefix = naming_prefix
7
- @record = record
8
- end
9
-
10
- def full_name
11
- NAME_PARTS.collect { |p| self.send(p) }.compact.join " "
12
- end
13
-
14
- def full_name= new_name
15
- # Matthijs Jacobus Groen
16
- # Patricia Jose Huisman
17
- # Thijs van de Biggelaar
18
- # Michael Thijssens
19
- # Maria Cornelia Hendrina Damen-van Valenberg
20
- # Dirk Jan van den Abeele
21
- # Yolanthe Cabau van Kasbergen
22
- # Yolanthe Sneijder-Cabau
23
- return if full_name == new_name # no changes
24
-
25
- parts = new_name.split " "
26
- names = []
27
- stage = :prefix
28
- remember = nil
29
- parts.each_with_index do |part, index|
30
- is_upcase = part.first == part.first.upcase
31
- has_dash = part.include? "-"
32
- is_last = (parts.length - 1) == index
33
-
34
- fp = [remember, part].compact.join(" ")
35
- remember = nil
36
- did_remember = (fp != part)
37
- if valid_prefix?(part) and stage == :prefix # if the part is a valid prefix, mark it as such
38
- names = add_to_last_if :prefix, fp, names
39
- elsif valid_suffix?(part) and stage == :name # if the part is a valid suffix, mark it as such
40
- names = add_to_last_if :suffix, fp, names
41
- elsif part == "-" # if the part is a dash
42
- if last_stored = names.pop # retrieve the previous name part (if any) and store it with the dash
43
- # for the part to come (remember)
44
- remember = [last_stored[0], fp].compact.join(" ")
45
- else
46
- # if there is no previous part, just store the current part for later
47
- remember = fp
48
- end
49
- elsif !is_upcase and !did_remember # intercalation words are never with a capital
50
- names = add_to_last_if :intercalation, fp, names
51
- stage = :name
52
- elsif !is_upcase and did_remember
53
- remember = fp
54
- elsif is_upcase and !has_dash
55
- names << [fp, :name]
56
- stage = :name
57
- elsif is_upcase and has_dash
58
- if fp.ends_with? "-"
59
- if is_last
60
- names << [fp, :name]
61
- stage = :name
62
- else
63
- remember = fp
64
- end
65
- else
66
- if fp.starts_with?("-") and last_stored = names.pop
67
- fp = [last_stored[0], fp].compact.join(" ")
68
- end
69
- dash_parts = fp.split "-"
70
- if dash_parts.last.first == dash_parts.last.first.upcase
71
- names << [fp, :name]
72
- stage = :name
73
- elsif is_last
74
- names << [fp, :name]
75
- stage = :name
76
- else
77
- remember = fp
78
- end
79
- end
80
- end
81
- end
82
-
83
- new_name = {}
84
- stage = O[:prefix]
85
-
86
- names.each_with_index do |value, index|
87
- name, name_type = *value
88
- stage = recheck_stage(name, stage)
89
-
90
- if name_type == :prefix and stage == O[:prefix]
91
- elsif name_type == :suffix and (index == names.length - 1)
92
- stage = [O[:suffix], stage].max
93
- elsif name_type == :suffix and (index != names.length - 1)
94
- name_type = :name
95
- end
96
-
97
- if name_type == :name
98
- if (index == names.length - 1) or new_name[:intercalation]
99
- stage = [O[:last_name], stage].max
100
- else
101
- if !new_name[:first_name]
102
- stage = [O[:first_name], stage].max
103
- else
104
- stage = [O[:middle_name], stage].max
105
- end
106
- end
107
- elsif name_type == :intercalation
108
- stage = [O[:intercalation], stage].max
109
- end
110
- new_name = add_part(new_name, stage, name)
111
- end
112
- # assignments
113
- NAME_PARTS.each do |part|
114
- self.send "#{part}=", (new_name[part.to_sym] || "").blank? ? nil : new_name[part.to_sym]
115
- end
116
- end
117
-
118
- def full_last_name
119
- [:intercalation, :last_name, :suffix].collect { |p| self.send(p) }.compact.join " "
120
- end
121
-
122
- def short_name include_middle_names = true
123
- parts = []
124
- parts << "#{self.first_name.first.upcase}." if self.first_name
125
- if include_middle_names and self.middle_name
126
- names = self.middle_name.split(" ")
127
- names.each do |name|
128
- parts << "#{name.first.upcase}."
129
- end
130
- end
131
- [parts.join, full_last_name] * " "
132
- end
133
-
134
- NAME_PARTS.each do |part|
135
- define_method part do
136
- @record.send("#{@naming_prefix}_#{part}")
137
- end
138
-
139
- define_method "#{part}=" do |value|
140
- @record.send("#{@naming_prefix}_#{part}=", value)
141
- end
142
- end
143
-
144
- def to_s
145
- full_name
146
- end
147
-
148
- private
149
-
150
- O = {
151
- :prefix => 0,
152
- :first_name => 1,
153
- :middle_name => 2,
154
- :intercalation => 3,
155
- :last_name => 4,
156
- :suffix => 5
157
- }.freeze
158
- OR = O.invert
159
-
160
- def add_part new_name, part_score, part
161
- part_name = OR[part_score]
162
- new_name[part_name.to_sym] = [new_name[part_name.to_sym], part].compact.join(" ")
163
- new_name
164
- end
165
-
166
- def recheck_stage value, stage
167
- # test if the given value is already stored in the name right now
168
- new_stage = stage
169
- NAME_PARTS.each do |part|
170
- part_values = (self.send(part) || "").split(" ")
171
-
172
- part_score = O[part.to_sym]
173
- if part_values.include? value
174
- part_score = O[:first_name] if stage == O[:prefix] and part = :middle_name
175
- new_stage = part_score if part_score > new_stage
176
- return new_stage
177
- end
178
- end
179
- stage
180
- end
181
-
182
- def add_to_last_if part, value, list
183
- if list.last and list.last[1] == part
184
- last_part = list.pop
185
- list << [[last_part[0], value].compact.join(" "), part]
186
- else
187
- list << [value, part]
188
- end
189
- list
190
- end
191
-
192
- attr_reader :naming_prefix, :record
193
-
194
- def valid_prefix? name_part
195
- false
196
- end
197
-
198
- def valid_suffix? name_part
199
- false
200
- end
201
-
1
+ module PersonName
2
+ class Name
3
+
4
+ NAME_PARTS = %w(prefix first_name middle_name intercalation last_name suffix)
5
+
6
+ def initialize(naming_prefix, record)
7
+ @naming_prefix = naming_prefix
8
+ @record = record
9
+ end
10
+
11
+ def full_name
12
+ NAME_PARTS.collect { |p| self.send(p) }.compact.join " "
13
+ end
14
+
15
+ def full_name= new_name
16
+ return if full_name == new_name # no changes
17
+
18
+ parts = new_name.split " "
19
+ names = []
20
+ stage = :prefix
21
+ remember = nil
22
+ parts.each_with_index do |part, index|
23
+ is_upcase = (part[0,1] == part[0,1].upcase)
24
+ has_dash = part.include? "-"
25
+ is_last = (parts.length - 1) == index
26
+
27
+ fp = [remember, part].compact.join(" ")
28
+ remember = nil
29
+ did_remember = (fp != part)
30
+ if valid_prefix?(part) and stage == :prefix # if the part is a valid prefix, mark it as such
31
+ names = add_to_last_if :prefix, fp, names
32
+ elsif valid_suffix?(part) and stage == :name # if the part is a valid suffix, mark it as such
33
+ names = add_to_last_if :suffix, fp, names
34
+ elsif part == "-" # if the part is a dash
35
+ if last_stored = names.pop # retrieve the previous name part (if any) and store it with the dash
36
+ # for the part to come (remember)
37
+ remember = [last_stored[0], fp].compact.join(" ")
38
+ else
39
+ # if there is no previous part, just store the current part for later
40
+ remember = fp
41
+ end
42
+ elsif !is_upcase and !did_remember # intercalation words are never with a capital
43
+ names = add_to_last_if :intercalation, fp, names
44
+ stage = :name
45
+ elsif !is_upcase and did_remember
46
+ remember = fp
47
+ elsif is_upcase and !has_dash
48
+ names << [fp, :name]
49
+ stage = :name
50
+ elsif is_upcase and has_dash
51
+ if fp.ends_with? "-"
52
+ if is_last
53
+ names << [fp, :name]
54
+ stage = :name
55
+ else
56
+ remember = fp
57
+ end
58
+ else
59
+ if fp.starts_with?("-") and last_stored = names.pop
60
+ fp = [last_stored[0], fp].compact.join(" ")
61
+ end
62
+ dash_parts = fp.split "-"
63
+ if dash_parts.last.first == dash_parts.last.first.upcase
64
+ names << [fp, :name]
65
+ stage = :name
66
+ elsif is_last
67
+ names << [fp, :name]
68
+ stage = :name
69
+ else
70
+ remember = fp
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ new_name = {}
77
+ stage = O[:prefix]
78
+
79
+ names.each_with_index do |value, index|
80
+ name, name_type = *value
81
+ stage = recheck_stage(name, stage)
82
+
83
+ if name_type == :prefix and stage == O[:prefix]
84
+ elsif name_type == :suffix and (index == names.length - 1)
85
+ stage = [O[:suffix], stage].max
86
+ elsif name_type == :suffix and (index != names.length - 1)
87
+ name_type = :name
88
+ end
89
+
90
+ if name_type == :name
91
+ if (index == names.length - 1) or new_name[:intercalation]
92
+ stage = [O[:last_name], stage].max
93
+ else
94
+ if !new_name[:first_name]
95
+ stage = [O[:first_name], stage].max
96
+ else
97
+ stage = [O[:middle_name], stage].max
98
+ end
99
+ end
100
+ elsif name_type == :intercalation
101
+ stage = [O[:intercalation], stage].max
102
+ end
103
+ new_name = add_part(new_name, stage, name)
104
+ end
105
+ # assignments
106
+ NAME_PARTS.each do |part|
107
+ self.send "#{part}=", (new_name[part.to_sym] || "").blank? ? nil : new_name[part.to_sym]
108
+ end
109
+ end
110
+
111
+ def full_last_name
112
+ [:intercalation, :last_name, :suffix].collect { |p| self.send(p) }.compact.join " "
113
+ end
114
+
115
+ def short_name include_middle_names = true
116
+ parts = []
117
+ parts << "#{self.first_name.first.upcase}." if self.first_name
118
+ if include_middle_names and self.middle_name
119
+ names = self.middle_name.split(" ")
120
+ names.each do |name|
121
+ parts << "#{name.first.upcase}."
122
+ end
123
+ end
124
+ [parts.join, full_last_name] * " "
125
+ end
126
+
127
+ NAME_PARTS.each do |part|
128
+ define_method part do
129
+ @record.send("#{@naming_prefix}_#{part}")
130
+ end
131
+
132
+ define_method "#{part}=" do |value|
133
+ @record.send("#{@naming_prefix}_#{part}=", value)
134
+ end
135
+ end
136
+
137
+ def to_s
138
+ full_name
139
+ end
140
+
141
+ private
142
+
143
+ O = {
144
+ :prefix => 0,
145
+ :first_name => 1,
146
+ :middle_name => 2,
147
+ :intercalation => 3,
148
+ :last_name => 4,
149
+ :suffix => 5
150
+ }.freeze
151
+ OR = O.invert
152
+
153
+ def add_part new_name, part_score, part
154
+ part_name = OR[part_score]
155
+ new_name[part_name.to_sym] = [new_name[part_name.to_sym], part].compact.join(" ")
156
+ new_name
157
+ end
158
+
159
+ def recheck_stage value, stage
160
+ # test if the given value is already stored in the name right now
161
+ new_stage = stage
162
+ NAME_PARTS.each do |part|
163
+ part_values = (self.send(part) || "").split(" ")
164
+
165
+ part_score = O[part.to_sym]
166
+ if part_values.include? value
167
+ part_score = O[:first_name] if stage == O[:prefix] and part = :middle_name
168
+ new_stage = part_score if part_score > new_stage
169
+ return new_stage
170
+ end
171
+ end
172
+ stage
173
+ end
174
+
175
+ def add_to_last_if part, value, list
176
+ if list.last and list.last[1] == part
177
+ last_part = list.pop
178
+ list << [[last_part[0], value].compact.join(" "), part]
179
+ else
180
+ list << [value, part]
181
+ end
182
+ list
183
+ end
184
+
185
+ attr_reader :naming_prefix, :record
186
+
187
+ def valid_prefix? name_part
188
+ false
189
+ end
190
+
191
+ def valid_suffix? name_part
192
+ false
193
+ end
194
+
195
+ end
202
196
  end
data/rails/init.rb CHANGED
@@ -1,5 +1 @@
1
- require 'person_name'
2
- require 'person_name/migration_support'
3
-
4
- ActiveRecord::ConnectionAdapters::TableDefinition.send :include, PersonName::MigrationSupport
5
- ActiveRecord::Base.send :include, PersonName::ActiveRecord
1
+ require 'person-name'
@@ -15,82 +15,55 @@ describe "Has Person Name" do
15
15
  @person.should respond_to(:name)
16
16
  end
17
17
 
18
- end
18
+ it "should read active_record attributes" do
19
+ @person.name_first_name = "Matthijs"
20
+ @person.name.first_name.should == "Matthijs"
19
21
 
20
- describe "Automatic name assignment" do
21
- before(:each) do
22
- clean_database!
23
- @person = Person.new
22
+ @person.name_last_name = "Groen"
23
+ @person.name.last_name.should == "Groen"
24
+
25
+ @person.name.to_s.should == "Matthijs Groen"
24
26
  end
25
27
 
26
- it "should assign name parts to the correct fields" do
27
- @person.name = "Matthijs Groen"
28
- @person.name.first_name.should == "Matthijs"
28
+ it "should assign active_record attributes" do
29
+ @person.name.first_name = "Matthijs"
30
+ @person.name_first_name.should == "Matthijs"
31
+
32
+ @person.name.last_name = "Groen"
33
+ @person.name_last_name.should == "Groen"
29
34
  end
30
35
 
31
- end
36
+ it "should split up name parts and assign to correct fields" do
37
+ test_fields = %w(prefix first_name middle_name intercalation last_name suffix)
38
+ test_cases = [
39
+ [nil, "Matthijs", nil, nil, "Groen", nil],
40
+ [nil, "Matthijs", "Jacobus", nil, "Groen", nil],
41
+ [nil, "Frans", nil, "van der", "Sluis", nil],
42
+ [nil, "Maria", "Cornelia Hendrina", nil, "Damen-van Valenberg", nil],
43
+ [nil, "Dirk", "Jan", "van de", "Abeele", nil],
44
+ [nil, "Yolanthe", "Cabau", "van", "Kasbergen", nil],
45
+ ]
32
46
 
33
- # it "should provide a class method 'taggable?' that is false for untaggable models" do
34
- # UntaggableModel.should_not be_taggable
35
- # end
47
+ test_cases.each do |fields|
48
+ string = fields.compact.join(" ")
49
+ @person = Person.new
50
+ @person.name = string
51
+
52
+ test_fields.each_with_index do |field, index|
53
+ @person.name.send(field).should == fields[index]
54
+ end
55
+ end
56
+ end
36
57
 
37
- # describe "Taggable Method Generation" do
38
- # before(:each) do
39
- # clean_database!
40
- # TaggableModel.write_inheritable_attribute(:tag_types, [])
41
- # TaggableModel.acts_as_taggable_on(:tags, :languages, :skills, :needs, :offerings)
42
- # @taggable = TaggableModel.new(:name => "Bob Jones")
43
- # end
44
- #
45
- # it "should respond 'true' to taggable?" do
46
- # @taggable.class.should be_taggable
47
- # end
48
- #
49
- # it "should create a class attribute for tag types" do
50
- # @taggable.class.should respond_to(:tag_types)
51
- # end
52
- #
53
- # it "should create an instance attribute for tag types" do
54
- # @taggable.should respond_to(:tag_types)
55
- # end
56
- #
57
- # it "should have all tag types" do
58
- # @taggable.tag_types.should == [:tags, :languages, :skills, :needs, :offerings]
59
- # end
60
- #
61
- # it "should generate an association for each tag type" do
62
- # @taggable.should respond_to(:tags, :skills, :languages)
63
- # end
64
- #
65
- # it "should add tagged_with and tag_counts to singleton" do
66
- # TaggableModel.should respond_to(:tagged_with, :tag_counts)
67
- # end
68
- #
69
- # it "should generate a tag_list accessor/setter for each tag type" do
70
- # @taggable.should respond_to(:tag_list, :skill_list, :language_list)
71
- # @taggable.should respond_to(:tag_list=, :skill_list=, :language_list=)
72
- # end
73
- #
74
- # it "should generate a tag_list accessor, that includes owned tags, for each tag type" do
75
- # @taggable.should respond_to(:all_tags_list, :all_skills_list, :all_languages_list)
76
- # end
77
- # end
58
+ it "should remember corrections" do
59
+ @person.name.first_name = "Yolanthe"
60
+ @person.name.last_name = "Cabau van Kasbergen"
78
61
 
79
- # describe "Single Table Inheritance" do
80
- # before do
81
- # @taggable = TaggableModel.new(:name => "taggable")
82
- # @inherited_same = InheritingTaggableModel.new(:name => "inherited same")
83
- # @inherited_different = AlteredInheritingTaggableModel.new(:name => "inherited different")
84
- # end
85
- #
86
- # it "should pass on tag contexts to STI-inherited models" do
87
- # @inherited_same.should respond_to(:tag_list, :skill_list, :language_list)
88
- # @inherited_different.should respond_to(:tag_list, :skill_list, :language_list)
89
- # end
90
- #
91
- # it "should have tag contexts added in altered STI models" do
92
- # @inherited_different.should respond_to(:part_list)
93
- # end
94
- # end
62
+ @person.name = "Yolanthe Truuske Cabau van Kasbergen"
63
+ @person.name.middle_name.should == "Truuske"
64
+ @person.name.last_name.should == "Cabau van Kasbergen"
65
+ end
66
+
67
+ end
95
68
 
96
69
  end
data/spec/spec_helper.rb CHANGED
@@ -17,7 +17,7 @@ rescue Bundler::GemNotFound
17
17
  end
18
18
 
19
19
  Bundler.require
20
- require File.expand_path('../../lib/person_name', __FILE__)
20
+ require File.expand_path('../../lib/person-name', __FILE__)
21
21
 
22
22
  unless [].respond_to?(:freq)
23
23
  class Array
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: person-name
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 0
10
- version: 0.2.0
9
+ - 1
10
+ version: 0.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matthijs Groen
@@ -34,7 +34,8 @@ files:
34
34
  - README.markdown
35
35
  - Rakefile
36
36
  - VERSION
37
- - lib/person_name.rb
37
+ - lib/person-name.rb
38
+ - lib/person_name/has_person_name.rb
38
39
  - lib/person_name/migration_support.rb
39
40
  - lib/person_name/name.rb
40
41
  - rails/init.rb