genderizr 0.0.7 → 0.0.8
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.
- data/lib/genderizr/forms.rb +82 -0
- data/lib/genderizr/string_methods.rb +7 -0
- data/lib/genderizr/version.rb +1 -0
- data/lib/genderizr.rb +22 -112
- data/spec/genderizr_spec.rb +14 -0
- data/spec/shared/a_genderized_module.rb +66 -0
- data/spec/shared/genderizr_form_changer.rb +11 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/string_methods_spec.rb +23 -0
- metadata +32 -3
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Genderizr
|
|
3
|
+
module Forms
|
|
4
|
+
|
|
5
|
+
def m2f_forms
|
|
6
|
+
@m2f_forms ||= masculine_to_feminine
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def m2f_forms=(hash)
|
|
11
|
+
@f2m_forms = hash.invert
|
|
12
|
+
@m2f_forms = hash
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def feminine_to_masculine
|
|
18
|
+
@f2m_forms ||= m2f_forms.invert
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def default_m2f_forms
|
|
23
|
+
{
|
|
24
|
+
'♂' => '♀',
|
|
25
|
+
'⚨' => '♀',
|
|
26
|
+
'⚩' => '♀',
|
|
27
|
+
'⚣' => '⚢',
|
|
28
|
+
'boy' => 'girl',
|
|
29
|
+
'boyish' => 'girlish',
|
|
30
|
+
'boys' => 'girls',
|
|
31
|
+
'brother' => 'sister',
|
|
32
|
+
'brothers' => 'sisters',
|
|
33
|
+
'cowboy' => 'cowgirl',
|
|
34
|
+
'cowboys' => 'cowgirls',
|
|
35
|
+
'craftsman' => 'craftswoman',
|
|
36
|
+
'dad' => 'mom',
|
|
37
|
+
'daddy' => 'mommy',
|
|
38
|
+
'dick' => 'pussy',
|
|
39
|
+
'dude' => 'lady',
|
|
40
|
+
'dudes' => 'ladies',
|
|
41
|
+
'ex-wife' => 'ex-husband',
|
|
42
|
+
'father' => 'mother',
|
|
43
|
+
'fathers' => 'mothers',
|
|
44
|
+
'gentleman' => 'lady',
|
|
45
|
+
'gentlemen' => 'ladies',
|
|
46
|
+
'guy' => 'gal',
|
|
47
|
+
'guys' => 'gals',
|
|
48
|
+
'he' => 'she',
|
|
49
|
+
'him' => 'her',
|
|
50
|
+
'himself' => 'herself',
|
|
51
|
+
'his' => 'her',
|
|
52
|
+
'king' => 'queen',
|
|
53
|
+
'kings' => 'queens',
|
|
54
|
+
'male' => 'female',
|
|
55
|
+
'man' => 'woman',
|
|
56
|
+
'manhood' => 'womanhood',
|
|
57
|
+
'manlier' => 'womanlier',
|
|
58
|
+
'manliest' => 'womanliest',
|
|
59
|
+
'manliness' => 'womanliness',
|
|
60
|
+
'manly' => 'womanly',
|
|
61
|
+
'masculine' => 'feminine',
|
|
62
|
+
'masculinity' => 'femininity',
|
|
63
|
+
'men' => 'women',
|
|
64
|
+
'mister' => 'miss', # Careful here going from feminine to masculine
|
|
65
|
+
'mr' => 'ms',
|
|
66
|
+
'mr.' => 'ms.',
|
|
67
|
+
'nobleman' => 'noblewoman',
|
|
68
|
+
'patriarch' => 'matriarch',
|
|
69
|
+
'prince' => 'princess',
|
|
70
|
+
'princes' => 'princesses',
|
|
71
|
+
'waited' => 'waitressed',
|
|
72
|
+
'waiter' => 'waitress'
|
|
73
|
+
}
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def masculine_to_feminine
|
|
78
|
+
@m2f_forms ||= default_m2f_forms
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module Genderizr; VERSION = '0.0.8'; end
|
data/lib/genderizr.rb
CHANGED
|
@@ -1,130 +1,40 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
1
|
require 'strscan'
|
|
2
|
+
require 'genderizr/version'
|
|
3
3
|
|
|
4
4
|
module Genderizr
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
mod.send(:include, Genderizr::InstanceMethods)
|
|
10
|
-
mod.send(:extend, Genderizr::Forms)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
module Changers
|
|
15
|
-
|
|
16
|
-
def feminize(string)
|
|
17
|
-
genderize(string, true)
|
|
18
|
-
end
|
|
6
|
+
autoload :Forms, 'genderizr/forms'
|
|
7
|
+
autoload :StringMethods, 'genderizr/string_methods'
|
|
8
|
+
autoload :Version, 'genderizr/version'
|
|
19
9
|
|
|
10
|
+
extend Forms
|
|
20
11
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
lookup = turn_feminine ? masculine_to_feminine : feminine_to_masculine
|
|
24
|
-
result = ""
|
|
25
|
-
s = StringScanner.new(string)
|
|
26
|
-
until s.eos? do
|
|
27
|
-
word = s.scan(/\w+|\W+/)
|
|
28
|
-
result << (lookup[word].nil? ? word : lookup[word])
|
|
29
|
-
end
|
|
30
|
-
result
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def masculize(string)
|
|
35
|
-
genderize(string, false)
|
|
36
|
-
end
|
|
37
|
-
|
|
12
|
+
def self.feminize(string)
|
|
13
|
+
genderize(string, true)
|
|
38
14
|
end
|
|
39
|
-
extend Genderizr::Changers
|
|
40
|
-
|
|
41
15
|
|
|
42
|
-
module Forms
|
|
43
16
|
|
|
44
|
-
|
|
45
|
-
|
|
17
|
+
def self.genderize(string,turn_feminine)
|
|
18
|
+
return "" if string.nil?
|
|
19
|
+
lookup = turn_feminine ? masculine_to_feminine : feminine_to_masculine
|
|
20
|
+
result = ""
|
|
21
|
+
s = StringScanner.new(string)
|
|
22
|
+
until s.eos? do
|
|
23
|
+
word = s.scan(/\w+|\W+/)
|
|
24
|
+
result << (lookup[word].nil? ? word : lookup[word])
|
|
46
25
|
end
|
|
26
|
+
result
|
|
27
|
+
end
|
|
47
28
|
|
|
48
29
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
@m2f_forms = hash
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
private
|
|
55
|
-
|
|
56
|
-
def feminine_to_masculine
|
|
57
|
-
@f2m_forms ||= m2f_forms.invert
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def default_m2f_forms
|
|
62
|
-
{
|
|
63
|
-
'♂' => '♀',
|
|
64
|
-
'⚨' => '♀',
|
|
65
|
-
'⚩' => '♀',
|
|
66
|
-
'⚣' => '⚢',
|
|
67
|
-
'boy' => 'girl',
|
|
68
|
-
'boyish' => 'girlish',
|
|
69
|
-
'boys' => 'girls',
|
|
70
|
-
'brother' => 'sister',
|
|
71
|
-
'brothers' => 'sisters',
|
|
72
|
-
'cowboy' => 'cowgirl',
|
|
73
|
-
'cowboys' => 'cowgirls',
|
|
74
|
-
'craftsman' => 'craftswoman',
|
|
75
|
-
'dad' => 'mom',
|
|
76
|
-
'daddy' => 'mommy',
|
|
77
|
-
'dick' => 'pussy',
|
|
78
|
-
'dude' => 'lady',
|
|
79
|
-
'dudes' => 'ladies',
|
|
80
|
-
'ex-wife' => 'ex-husband',
|
|
81
|
-
'father' => 'mother',
|
|
82
|
-
'fathers' => 'mothers',
|
|
83
|
-
'gentleman' => 'lady',
|
|
84
|
-
'gentlemen' => 'ladies',
|
|
85
|
-
'guy' => 'gal',
|
|
86
|
-
'guys' => 'gals',
|
|
87
|
-
'he' => 'she',
|
|
88
|
-
'him' => 'her',
|
|
89
|
-
'himself' => 'herself',
|
|
90
|
-
'his' => 'her',
|
|
91
|
-
'king' => 'queen',
|
|
92
|
-
'kings' => 'queens',
|
|
93
|
-
'male' => 'female',
|
|
94
|
-
'man' => 'woman',
|
|
95
|
-
'manhood' => 'womanhood',
|
|
96
|
-
'manlier' => 'womanlier',
|
|
97
|
-
'manliest' => 'womanliest',
|
|
98
|
-
'manliness' => 'womanliness',
|
|
99
|
-
'manly' => 'womanly',
|
|
100
|
-
'masculine' => 'feminine',
|
|
101
|
-
'masculinity' => 'femininity',
|
|
102
|
-
'men' => 'women',
|
|
103
|
-
'mister' => 'miss', # Careful here going from feminine to masculine
|
|
104
|
-
'mr' => 'ms',
|
|
105
|
-
'mr.' => 'ms.',
|
|
106
|
-
'nobleman' => 'noblewoman',
|
|
107
|
-
'patriarch' => 'matriarch',
|
|
108
|
-
'prince' => 'princess',
|
|
109
|
-
'princes' => 'princesses',
|
|
110
|
-
'waited' => 'waitressed',
|
|
111
|
-
'waiter' => 'waitress'
|
|
112
|
-
}
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
def masculine_to_feminine
|
|
117
|
-
@m2f_forms ||= default_m2f_forms
|
|
118
|
-
end
|
|
119
|
-
|
|
30
|
+
def self.masculize(string)
|
|
31
|
+
genderize(string, false)
|
|
120
32
|
end
|
|
121
|
-
extend Genderizr::Forms
|
|
122
33
|
|
|
123
34
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
def masculize; Genderizr.masculize(self); end
|
|
35
|
+
def self.monkey_patch(mod)
|
|
36
|
+
mod.send(:include, Genderizr::StringMethods)
|
|
37
|
+
mod.send(:extend, Genderizr::Forms)
|
|
128
38
|
end
|
|
129
39
|
|
|
130
40
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Genderizr do
|
|
4
|
+
|
|
5
|
+
it_behaves_like 'a genderized module'
|
|
6
|
+
it_behaves_like 'genderizr form changer'
|
|
7
|
+
|
|
8
|
+
it "doesn't add methods to String by default" do
|
|
9
|
+
FEMININE.should_not respond_to(:feminize)
|
|
10
|
+
FEMININE.should_not respond_to(:genderize)
|
|
11
|
+
FEMININE.should_not respond_to(:masculize)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
MASCULINE = "king"
|
|
2
|
+
FEMININE = "queen"
|
|
3
|
+
|
|
4
|
+
shared_examples 'a genderized module' do
|
|
5
|
+
|
|
6
|
+
it "handles a blank string" do
|
|
7
|
+
subject.feminize("").should eq ""
|
|
8
|
+
subject.masculize("").should eq ""
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "handles a nil argument" do
|
|
12
|
+
subject.feminize(nil).should eq ""
|
|
13
|
+
subject.masculize(nil).should eq ""
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "switches genders of a masculine string when requested" do
|
|
17
|
+
subject.genderize(MASCULINE,true).should eq FEMININE
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "doesn't switch genders of a masculine string when requested" do
|
|
21
|
+
subject.genderize(MASCULINE,false).should eq MASCULINE
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "switches genders of a feminine string when requested" do
|
|
25
|
+
subject.genderize(FEMININE,false).should eq MASCULINE
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "doesn't switch genders of a feminine string when requested" do
|
|
29
|
+
subject.genderize(FEMININE,true).should eq FEMININE
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "does the same thing with the explicit and generic method calls" do
|
|
33
|
+
subject.feminize(MASCULINE).should eq subject.genderize(MASCULINE,true)
|
|
34
|
+
subject.feminize(FEMININE).should eq subject.genderize(FEMININE,true)
|
|
35
|
+
subject.masculize(MASCULINE).should eq subject.genderize(MASCULINE,false)
|
|
36
|
+
subject.masculize(FEMININE).should eq subject.genderize(FEMININE,false)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "ignores punctuation" do
|
|
40
|
+
subject.feminize("#{MASCULINE}.").should eq "#{FEMININE}."
|
|
41
|
+
subject.feminize("#{MASCULINE}-").should eq "#{FEMININE}-"
|
|
42
|
+
subject.feminize("!#{MASCULINE}-").should eq "!#{FEMININE}-"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "doesn't ignore punctuation in 'mr.' and 'ms.'" do
|
|
46
|
+
mr = 'mr.'; ms = 'ms.'
|
|
47
|
+
subject.feminize(mr).should eq ms
|
|
48
|
+
subject.masculize(ms).should eq mr
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "preserves whitespace" do
|
|
52
|
+
subject.feminize(" #{MASCULINE}").should eq " #{FEMININE}"
|
|
53
|
+
subject.feminize(" #{MASCULINE}").should eq " #{FEMININE}"
|
|
54
|
+
subject.feminize("\t#{MASCULINE}").should eq " #{FEMININE}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "deals with multi-word strings" do
|
|
58
|
+
subject.feminize("#{MASCULINE} #{MASCULINE} #{FEMININE}").should eq "#{FEMININE} #{FEMININE} #{FEMININE}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "doesn't change the gender of words with in words" do
|
|
62
|
+
words_within_words = "#{MASCULINE}ified}"
|
|
63
|
+
subject.feminize(words_within_words).should eq words_within_words
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe String do
|
|
4
|
+
|
|
5
|
+
before :all do
|
|
6
|
+
Genderizr.monkey_patch(String)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it_behaves_like 'genderizr form changer'
|
|
10
|
+
|
|
11
|
+
it "behaves the same" do
|
|
12
|
+
FEMININE.feminize.should eq Genderizr.feminize(FEMININE)
|
|
13
|
+
FEMININE.genderize(false).should eq Genderizr.genderize(FEMININE,false)
|
|
14
|
+
FEMININE.genderize(true).should eq Genderizr.genderize(FEMININE,true)
|
|
15
|
+
FEMININE.masculize.should eq Genderizr.masculize(FEMININE)
|
|
16
|
+
|
|
17
|
+
MASCULINE.feminize.should eq Genderizr.feminize(MASCULINE)
|
|
18
|
+
MASCULINE.genderize(true).should eq Genderizr.genderize(MASCULINE,true)
|
|
19
|
+
MASCULINE.genderize(false).should eq Genderizr.genderize(MASCULINE,false)
|
|
20
|
+
MASCULINE.masculize.should eq Genderizr.masculize(MASCULINE)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: genderizr
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.8
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -11,6 +11,22 @@ bindir: bin
|
|
|
11
11
|
cert_chain: []
|
|
12
12
|
date: 2012-05-26 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: guard-rspec
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
none: false
|
|
18
|
+
requirements:
|
|
19
|
+
- - ! '>='
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '0'
|
|
22
|
+
type: :development
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ! '>='
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '0'
|
|
14
30
|
- !ruby/object:Gem::Dependency
|
|
15
31
|
name: rspec
|
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -35,7 +51,15 @@ extensions: []
|
|
|
35
51
|
extra_rdoc_files: []
|
|
36
52
|
files:
|
|
37
53
|
- README.md
|
|
54
|
+
- lib/genderizr/string_methods.rb
|
|
55
|
+
- lib/genderizr/version.rb
|
|
56
|
+
- lib/genderizr/forms.rb
|
|
38
57
|
- lib/genderizr.rb
|
|
58
|
+
- spec/genderizr_spec.rb
|
|
59
|
+
- spec/spec_helper.rb
|
|
60
|
+
- spec/string_methods_spec.rb
|
|
61
|
+
- spec/shared/a_genderized_module.rb
|
|
62
|
+
- spec/shared/genderizr_form_changer.rb
|
|
39
63
|
homepage: https://github.com/brundage/genderizr
|
|
40
64
|
licenses: []
|
|
41
65
|
post_install_message:
|
|
@@ -55,10 +79,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
55
79
|
- !ruby/object:Gem::Version
|
|
56
80
|
version: '0'
|
|
57
81
|
requirements: []
|
|
58
|
-
rubyforge_project:
|
|
82
|
+
rubyforge_project: genderizr
|
|
59
83
|
rubygems_version: 1.8.24
|
|
60
84
|
signing_key:
|
|
61
85
|
specification_version: 3
|
|
62
86
|
summary: A gem to genderize strings
|
|
63
|
-
test_files:
|
|
87
|
+
test_files:
|
|
88
|
+
- spec/genderizr_spec.rb
|
|
89
|
+
- spec/spec_helper.rb
|
|
90
|
+
- spec/string_methods_spec.rb
|
|
91
|
+
- spec/shared/a_genderized_module.rb
|
|
92
|
+
- spec/shared/genderizr_form_changer.rb
|
|
64
93
|
has_rdoc:
|