dogeify 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YWRhY2E4OTJlNDEwNWIyMjI0MGZhZmEwZjhkNTllMTdkYmQzYjRhMQ==
4
+ ZGE1NDE5NzU4NGQxZjFlYjUyMGExNDRkOWFmNjIxN2YyMmNmYzcwNw==
5
5
  data.tar.gz: !binary |-
6
- ZWZmOTFlZjcyZDEwNWVhZDdmNjgwZjk2Mzc4YzM3M2QzZTVlYjVkYw==
6
+ MzlkZjM2ODk1M2E5Yjg3OGU2YjU2NDNiZmJhNTQxMDMwZWFkMDFiYw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NWIxNTEyNTQ0ZDRjNmYwOGRiNDRkMWE0N2JiMjE4NTdkNWM5ZTE5Yjc0Zjcx
10
- OWI0ZjVlNGNjODBkZmJlOTljYmFjMDk0YjIzODcyYzAxNTMzNGYwYTQxMGVl
11
- ZDEzMjkyMzk1YzUwZTVlZWIxZDg4NWY5YzQ0NGZkMzg5ZGNlODQ=
9
+ NDgwYTc3MDU4YjE4NDE3Nzg0MTA3OWMzNmZlYzYzNTI0NGEyYTBkMTdhNjIz
10
+ ZDdmMzFkMTY2ZWRiNjkyYjBkMTU0MGI5ZGFhM2NhMDE4ODkyMjE1NTJlZTRh
11
+ Y2Y0MDliNGRhOTY5NzMzNjJjZmM3MWRiNGQ1ZTNmYzU1MjgyMDE=
12
12
  data.tar.gz: !binary |-
13
- Zjk4NjQwZjY4N2YyZjYxZGY2YjczYmI4YWU2YzY2YzM0YTNjZmFhZmM5NzMy
14
- YjY4NWYyMWM3MTU2ZjgxZmI0NDFmZTBlNTgzMjVmODE3MzMwNDAxN2EyYjE1
15
- MGFkZDE4ZGZjZTVjNTNhZjUxZmQ3N2JhZGVhZTEzZjRlYjliN2Q=
13
+ N2FiNWVjZThhNDE0NzZiMTUzM2MwZjFlYmJlOTk1MDNjNzYzNWI3NTlmOGZl
14
+ ODMxZmRhM2NhMmFlZjg0MTZjY2YxNmFhYmI2NzdhMDA0ZDg4NjQ1N2RmZDJk
15
+ MTljZjhjYmFiZjY5MWNlMjJhNjA5MTQ3NjUzMDYzMzdlYzg3OTQ=
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
6
+ - ruby-head
7
+ matrix:
8
+ allow_failures:
9
+ - rvm: ruby-head
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Dogeify
2
2
 
3
+ [![Build Status](https://secure.travis-ci.org/mhuggins/dogeify.png)](http://travis-ci.org/mhuggins/dogeify)
4
+ [![Code Climate](https://codeclimate.com/github/mhuggins/dogeify.png)](https://codeclimate.com/github/mhuggins/dogeify)
5
+
3
6
  Convert English to [Doge](http://en.wikipedia.org/wiki/Doge_(meme))!
4
7
 
5
8
  Please note that this gem is using an extremely simple language natural
@@ -26,8 +29,8 @@ There are several ways of using Dogeify. The first way is to go through the
26
29
 
27
30
  require 'dogeify'
28
31
 
29
- dogifier = Dogify.new
30
- dogifier.process('My grandmom gave me a sweater for Christmas.')
32
+ dogeifier = Dogeify.new
33
+ dogeifier.process('My grandmom gave me a sweater for Christmas.')
31
34
  # => "so grandmom. such sweater. very christmas. wow."
32
35
 
33
36
  The second way is to modify the String or Array classes by including either
@@ -37,12 +40,17 @@ core extension.
37
40
  require 'dogeify/core_ext/string' # extends only String
38
41
  require 'dogeify/core_ext' # extends both Array/String
39
42
 
40
- 'My grandmom gave me a sweater for Christmas.'.dogify
43
+ 'My grandmom gave me a sweater for Christmas.'.dogeify
41
44
  # => "so grandmom. such sweater. very christmas. wow."
42
45
 
43
- ['I like turtles.', 'It is during our darkest moments that we must focus to see the light.'].dogify
46
+ ['I like turtles.', 'It is during our darkest moments that we must focus to see the light.'].dogeify
44
47
  # => ["so turtles. wow.", "so darkest. such moments. very light. wow."]
45
48
 
49
+ Lastly, the `Dogeify` class along with all core extensions can be loaded via
50
+ a single require.
51
+
52
+ require 'dogeify/all'
53
+
46
54
  ## Contributing
47
55
 
48
56
  1. Fork it
data/lib/dogeify.rb CHANGED
@@ -2,26 +2,65 @@ require 'dogeify/version'
2
2
  require 'engtagger'
3
3
 
4
4
  class Dogeify
5
- ADJECTIVES = %w(so such very much many).freeze
5
+ ADJECTIVES = %w[so such very much many how].freeze
6
+ EMOTIONS = %w[wow amaze excite].freeze
6
7
 
7
8
  def initialize
8
9
  @tagger = EngTagger.new
9
10
  end
10
11
 
11
12
  def process(str)
12
- tagged_str = tagger.add_tags(str.downcase)
13
- phrases = tagger.get_nouns(tagged_str).keys
13
+ # Parse sentences.
14
+ sentences = str.downcase.split(/[\.!?]+/).map(&:strip)
14
15
 
15
- phrases = phrases.each_with_index.map { |phrase, i| "#{adjective(i)} #{phrase}." }
16
- phrases << 'wow.'
17
- phrases.join(' ')
16
+ sentences = sentences.map do |sentence|
17
+ # Select just the nouns.
18
+ tagged_sentence = tagger.add_tags(sentence)
19
+ phrases = tagger.get_nouns(tagged_sentence).keys rescue []
20
+
21
+ # Prefix nouns with adjectives, and convert to sentences.
22
+ phrases.map! { |phrase| correct_spelling(phrase) }
23
+ phrases.map! { |phrase| "#{adjective} #{phrase}." }
24
+
25
+ # Append a word or phrase describing emotion.
26
+ phrases << "#{emotional_summary}."
27
+
28
+ phrases.join(' ')
29
+ end
30
+
31
+ sentences.join(' ')
18
32
  end
19
33
 
20
34
  private
21
35
 
22
36
  attr_reader :tagger
23
37
 
24
- def adjective(i)
25
- ADJECTIVES[i % ADJECTIVES.size]
38
+ def correct_spelling(word)
39
+ word.dup.tap do |word|
40
+ word.gsub!(/er$/, 'ar') # super => supar
41
+ word.gsub!(/ph/, 'f') # phone => fone
42
+ word.gsub!(/cious/, 'shus') # delicious => delishus, deliciousness => delishusness
43
+ word.gsub!(/([^s])tion(s$)?/, '\1shun\2') # emotion => emoshun, emotions => emoshuns, emotionless => emoshunless, question (unchanged)
44
+ word.gsub!(/stion$/, 'schun') # question => queschun, potion (unchanged)
45
+ word.gsub!(/dog([^e]|\b)/, 'doge\1') # dog => doge, dogs => doges, underdog => underdoge, doge (unchanged)
46
+ end
47
+ end
48
+
49
+ def adjective
50
+ ADJECTIVES[adjective_offset]
51
+ end
52
+
53
+ def adjective_offset
54
+ @adjective_offset ||= -1
55
+ @adjective_offset = (@adjective_offset + 1) % ADJECTIVES.size
56
+ end
57
+
58
+ def emotional_summary
59
+ EMOTIONS[emotional_summary_offset]
60
+ end
61
+
62
+ def emotional_summary_offset
63
+ @emotional_summary_offset ||= -1
64
+ @emotional_summary_offset = (@emotional_summary_offset + 1) % EMOTIONS.size
26
65
  end
27
66
  end
@@ -1,3 +1,3 @@
1
1
  class Dogeify
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
data/spec/dogeify_spec.rb CHANGED
@@ -1,10 +1,21 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Dogeify do
4
- subject { Dogeify.new }
4
+ subject { described_class.new }
5
5
 
6
6
  describe '#process' do
7
- let(:input) { 'My grandmom gave me a sweater for Christmas.' }
7
+ let(:input) do
8
+ %q{Doge is a slang term for "dog" that is primarily associated with
9
+ pictures of Shiba Inus (nicknamed "Shibe") and internal monologue
10
+ captions on Tumblr. These photos may be photoshopped to change the
11
+ dog's face or captioned with interior monologues in Comic Sans font.
12
+ The use of the misspelled word "doge" to refer to a dog dates back
13
+ to June 24th, 2005, when it was mentioned in an episode of Homestar
14
+ Runner's puppet show. In the episode titled "Biz Cas Fri 1",
15
+ Homestar calls Strong Bad his "d-o-g-e" while trying to distract him
16
+ from his work.}
17
+ end
18
+
8
19
  let(:output) { subject.process(input) }
9
20
 
10
21
  it 'converts to lowercase' do
@@ -12,13 +23,37 @@ describe Dogeify do
12
23
  end
13
24
 
14
25
  it 'combines nouns with doge adjectives' do
15
- expect(output).to match /so grandmom\./i
16
- expect(output).to match /such sweater\./i
17
- expect(output).to match /very christmas\./i
26
+ expected = 'so doge. such slang. very term. much doge. many pictures. ' <<
27
+ 'how shiba. so inus. such shibe. very monologue. much ' <<
28
+ 'capshuns. many tumblr.'
29
+ expect(output).to start_with expected
30
+ end
31
+
32
+ it 'appends an emotional summary to the end of each sentence' do
33
+ expect(output).to match /(wow\.).*(amaze\.).*(excite\.).*(wow\.)/
18
34
  end
19
35
 
20
- it 'always appends "wow."' do
21
- expect(output).to end_with 'wow.'
36
+ describe 'when the input is an empty string' do
37
+ let(:input) { '' }
38
+
39
+ it 'does not raise an error' do
40
+ expect { output }.to_not raise_error
41
+ end
42
+ end
43
+
44
+ describe 'when the input contains misspellable words' do
45
+ let(:input) do
46
+ %q{Mister Phoebe is always so emotionless. Maybe he needs a dog to
47
+ cheer him up. It might be a question worth answering!}
48
+ end
49
+
50
+ it 'intentionally misspells words' do
51
+ expect(output).to include 'mistar'
52
+ expect(output).to include 'foebe'
53
+ expect(output).to include 'emoshunless'
54
+ expect(output).to include 'doge'
55
+ expect(output).to include 'queschun'
56
+ end
22
57
  end
23
58
  end
24
59
  end
data/tasks/rspec.rake ADDED
@@ -0,0 +1,3 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new(:spec)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dogeify
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Huggins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-18 00:00:00.000000000 Z
11
+ date: 2014-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: engtagger
@@ -76,6 +76,7 @@ extra_rdoc_files: []
76
76
  files:
77
77
  - .gitignore
78
78
  - .rspec
79
+ - .travis.yml
79
80
  - Gemfile
80
81
  - LICENSE.txt
81
82
  - README.md
@@ -93,6 +94,7 @@ files:
93
94
  - spec/dogeify_spec.rb
94
95
  - spec/spec_helper.rb
95
96
  - tasks/debug.rake
97
+ - tasks/rspec.rake
96
98
  homepage: ''
97
99
  licenses:
98
100
  - MIT