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 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