girls_just_want_to_have_puns 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,13 @@
1
+ module GirlsJustWantToHavePuns
2
+ class Pun
3
+
4
+ attr_reader :category, :new_phrase, :original_phrase
5
+
6
+ def initialize(new_phrase, original_phrase, category)
7
+ @new_phrase = new_phrase
8
+ @original_phrase = original_phrase
9
+ @category = category
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,50 @@
1
+ require 'girls_just_want_to_have_puns/phrase_service'
2
+ require 'girls_just_want_to_have_puns/punifier'
3
+ require 'girls_just_want_to_have_puns/rhyme_service'
4
+
5
+ module GirlsJustWantToHavePuns
6
+ class PunGenerator
7
+ def initialize(keyword, minimum_word_count: nil, rhymes: nil, source_phrases: nil)
8
+ @keyword = keyword
9
+ @minimum_word_count = minimum_word_count
10
+ @rhymes = rhymes || load_rhymes(keyword)
11
+ @source_phrases = source_phrases || load_source_phrases
12
+ end
13
+
14
+ def puns
15
+ @source_phrases.each_with_object([]) do |phrase, puns|
16
+ @rhymes.each do |rhyme|
17
+ if pun = Punifier.new(phrase, rhyme, @keyword).pun
18
+ puns << pun if valid_pun?(pun)
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ def pun
25
+ @source_phrases.shuffle.each do |phrase|
26
+ @rhymes.shuffle.each do |rhyme|
27
+ if pun = Punifier.new(phrase, rhyme, @keyword).pun
28
+ return pun if valid_pun?(pun)
29
+ end
30
+ end
31
+ end
32
+ return nil
33
+ end
34
+
35
+ private
36
+
37
+ def load_rhymes(keyword)
38
+ RhymeService.new(keyword).rhymes
39
+ end
40
+
41
+ def load_source_phrases
42
+ PhraseService.new.phrases
43
+ end
44
+
45
+ def valid_pun?(pun)
46
+ return true unless @minimum_word_count
47
+ @minimum_word_count < pun.new_phrase.split(" ").size
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,22 @@
1
+ require 'girls_just_want_to_have_puns/pun'
2
+
3
+ module GirlsJustWantToHavePuns
4
+ class Punifier
5
+
6
+ def initialize original_phrase, word_to_replace, replacement_word
7
+ @original_phrase = original_phrase
8
+ @word_to_replace = word_to_replace
9
+ @replacement_word = replacement_word
10
+ end
11
+
12
+ def pun
13
+ new_phrase = @original_phrase.text.sub(/\b#{@word_to_replace}\b/i, @replacement_word)
14
+ if new_phrase == @original_phrase.text
15
+ nil
16
+ else
17
+ Pun.new(new_phrase, @original_phrase.text, @original_phrase.category)
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ require 'json'
2
+ require 'open-uri'
3
+
4
+ class RhymeService
5
+
6
+ def initialize keyword
7
+ @keyword = keyword
8
+ end
9
+
10
+ def rhymes
11
+ rhyme_hashes = JSON.parse(fetch_rhymes)
12
+ max_score = rhyme_hashes.max_by { |r| r['score'] }['score']
13
+
14
+ rhyme_hashes.select do |r|
15
+ r['score'] == max_score
16
+ end.map do |rhyme|
17
+ rhyme['word']
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def fetch_rhymes
24
+ open("http://rhymebrain.com/talk?function=getRhymes&word=#{@keyword}&maxResults=0&lang=en").read
25
+ end
26
+
27
+ end
@@ -0,0 +1,3 @@
1
+ module GirlsJustWantToHavePuns
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ describe GirlsJustWantToHavePuns::PunGenerator do
4
+ it "uses the list of rhymes, if provided" do
5
+ generator = described_class.new(
6
+ "pun",
7
+ rhymes: ["gun"],
8
+ source_phrases: [
9
+ Phrase.new("Beatles songs", "happiness is a warm gun")
10
+ ]
11
+ )
12
+ pun = generator.puns.first
13
+
14
+ expect(pun.new_phrase).to eq("happiness is a warm pun")
15
+ end
16
+
17
+ it "can accept a minimum number of words" do
18
+ generator = described_class.new(
19
+ "pun",
20
+ minimum_word_count: 6,
21
+ rhymes: ["gun"],
22
+ source_phrases: [
23
+ Phrase.new("Beatles songs", "happiness is a warm gun")
24
+ ]
25
+ )
26
+ pun = generator.puns.first
27
+
28
+ expect(pun).to eq(nil)
29
+ end
30
+
31
+ it "doesn't match partial words" do
32
+ generator = described_class.new(
33
+ "cats",
34
+ minimum_word_count: 6,
35
+ rhymes: ["bat"],
36
+ source_phrases: [
37
+ Phrase.new("misc", "throw the baby out with the bath water")
38
+ ]
39
+ )
40
+ pun = generator.puns.first
41
+
42
+ expect(pun).to eq(nil)
43
+ end
44
+ end
@@ -0,0 +1 @@
1
+ require "girls_just_want_to_have_puns"
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: girls_just_want_to_have_puns
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ian C. Anderson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.5.5
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.5.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Generate puns by incorporating a keyword into a phrase.
56
+ email:
57
+ - anderson.ian.c@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - LICENSE
65
+ - README.md
66
+ - Rakefile
67
+ - girls_just_want_to_have_puns.gemspec
68
+ - lib/girls_just_want_to_have_puns.rb
69
+ - lib/girls_just_want_to_have_puns/phrase.rb
70
+ - lib/girls_just_want_to_have_puns/phrase_service.rb
71
+ - lib/girls_just_want_to_have_puns/phrase_sources/phrase_source.rb
72
+ - lib/girls_just_want_to_have_puns/phrase_sources/wikipedia_beatles_songs_phrase_source.rb
73
+ - lib/girls_just_want_to_have_puns/phrase_sources/wikipedia_idioms_phrase_source.rb
74
+ - lib/girls_just_want_to_have_puns/phrase_sources/wikipedia_oscar_winning_films_phrase_source.rb
75
+ - lib/girls_just_want_to_have_puns/phrases/beatles_songs.txt
76
+ - lib/girls_just_want_to_have_puns/phrases/oscar_winning_movies.txt
77
+ - lib/girls_just_want_to_have_puns/phrases/wikipedia_idioms.txt
78
+ - lib/girls_just_want_to_have_puns/pun.rb
79
+ - lib/girls_just_want_to_have_puns/pun_generator.rb
80
+ - lib/girls_just_want_to_have_puns/punifier.rb
81
+ - lib/girls_just_want_to_have_puns/rhyme_service.rb
82
+ - lib/girls_just_want_to_have_puns/version.rb
83
+ - spec/girls_just_want_to_have_puns/pun_generator_spec.rb
84
+ - spec/spec_helper.rb
85
+ homepage: ''
86
+ licenses: []
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 2.2.2
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: Generate puns by incorporating a keyword into a phrase.
108
+ test_files:
109
+ - spec/girls_just_want_to_have_puns/pun_generator_spec.rb
110
+ - spec/spec_helper.rb