genderizr 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ ![genderizr image](http://blog.deanbrundage.com/wp-content/uploads/2012/05/genderizr.png)
2
+
1
3
  # genderizr
2
4
 
3
5
  A ruby gem to genderize strings. It owes a little to [JackDanger's feminizer](https://github.com/JackDanger/feminizer).
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
- autoload :Forms, 'genderizr/forms'
7
- autoload :StringMethods, 'genderizr/string_methods'
8
- autoload :Version, 'genderizr/version'
6
+ VERSION = '0.1.1'
9
7
 
10
- extend Forms
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 self.feminize(string)
16
+ def feminize(string)
13
17
  genderize(string, true)
14
18
  end
15
19
 
16
20
 
17
- def self.genderize(string,turn_feminine)
21
+ def genderize(string,turn_feminine)
18
22
  return "" if string.nil?
19
- lookup = turn_feminine ? masculine_to_feminine : feminine_to_masculine
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 self.masculize(string)
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 self.monkey_patch(mod)
61
+ def monkey_patch(mod)
50
62
  mod.send(:include, Genderizr::StringMethods)
51
- mod.send(:extend, Genderizr::Forms)
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
@@ -1,9 +1,10 @@
1
- require 'spec_helper'
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+ require 'genderizr'
2
3
 
3
- describe Genderizr do
4
+ MASCULINE = "king"
5
+ FEMININE = "queen"
4
6
 
5
- it_behaves_like 'a genderized module'
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.0
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-26 00:00:00.000000000 Z
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:
@@ -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
@@ -1,7 +0,0 @@
1
- module Genderizr
2
- module StringMethods
3
- def feminize; Genderizr.feminize(self); end
4
- def genderize(turn_feminine); Genderizr.genderize(self,turn_feminine); end
5
- def masculize; Genderizr.masculize(self); end
6
- end
7
- end
@@ -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
@@ -1,11 +0,0 @@
1
- shared_examples 'genderizr form changer' do
2
-
3
- subject { described_class }
4
-
5
- it "allows you to change the masculine to feminine forms" do
6
- forms = { "han" => "leia" }
7
- subject.m2f_forms = forms
8
- subject.m2f_forms.should eq forms
9
- end
10
-
11
- end
data/spec/spec_helper.rb DELETED
@@ -1,3 +0,0 @@
1
- $:.unshift('lib')
2
- require 'genderizr'
3
- Dir["./spec/shared/*.rb"].each { |f| require f }
@@ -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