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