remarkovable 0.2 → 0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a053b23cb2c19a987ca6c05a594facc6f0afce85
4
- data.tar.gz: 7b3a2136bc305358b559b7f828f2ef90ed205c8f
3
+ metadata.gz: 328379d1bc17df872005ce1054d8a2a059d2f584
4
+ data.tar.gz: 385d35193fbe32e3fe5324305ac6d6daa5d1b0ba
5
5
  SHA512:
6
- metadata.gz: 667fb5bf7381a0d234f1fa836b39dff56e9c95c42ead73038591368a55d1b4dfd70fb35cd8c800702f510c855901a81d606624f737bd3a5ecc4532ae859a64c0
7
- data.tar.gz: de52c45c3a3caa9207ea5fb8833929e7336b32804c5b0ed89c4e96e5f6f0347a8efd65fda9e4e4902e46c53d60c890402df2e8fa29d03a2df306e645f455987c
6
+ metadata.gz: d0156262c4e1cdce770660ef53e634a2a21c26f7059d4ba77318cc43d0ccbe2d387feb0a5fc7723991a8e8fbf92c1c706eed7d67f9870f4dc2b6ccd2d289bba9
7
+ data.tar.gz: 3535ab92ffe1dfb6c1d199df4db93d88f882b21d09199a8e03302c112c572c4a6e41f02c2244f6d8ae9dd091b811eec19ac8998b70576fb495a9f23706fde232
@@ -1,32 +1,14 @@
1
1
  class Remarkovable
2
2
  attr_accessor :markov_model
3
3
 
4
- def initialize(string: string, prefix_length: 2)
4
+ def initialize(string:, prefix_length: 2)
5
5
  return if string.nil?
6
- @markov_model = Hash.new { |hash, key| hash[key] = [] }
7
-
8
- words = string.split(/([.!?])|\s+/)
9
- words.each_with_index do |word, i|
10
- key = [word]
11
-
12
- (prefix_length - 1).times do |n|
13
- next_word = i + n + 1
14
- key << words[next_word]
15
- end
16
-
17
- key = key.join(' ')
18
- match = words[i + prefix_length]
19
- add_triad(key: key, match: match) if i < words.size - prefix_length
20
- end
6
+ build_markov_model(string, prefix_length)
21
7
  end
22
8
 
23
9
  def speak(custom_key: nil)
24
10
  return if @markov_model.nil?
25
- key = if !custom_key.nil? && @markov_model[custom_key].any?
26
- custom_key
27
- else
28
- @markov_model.keys.sample
29
- end
11
+ key = assign_key(custom_key)
30
12
  output = Array(key.capitalize.split(' '))
31
13
 
32
14
  until (output & %w(. ! ?)).any?
@@ -45,7 +27,32 @@ class Remarkovable
45
27
 
46
28
  private
47
29
 
48
- def add_triad(key: key, match: match)
30
+ def build_markov_model(string, prefix_length)
31
+ @markov_model = Hash.new { |hash, key| hash[key] = [] }
32
+ words = string.split(/([.!?])|\s+/)
33
+ words.each_with_index do |word, i|
34
+ key = [word]
35
+
36
+ (prefix_length - 1).times do |n|
37
+ next_word = i + n + 1
38
+ key << words[next_word]
39
+ end
40
+
41
+ key = key.join(' ')
42
+ match = words[i + prefix_length]
43
+ add_triad(key: key, match: match) if i < words.size - prefix_length
44
+ end
45
+ end
46
+
47
+ def assign_key(custom_key)
48
+ if !custom_key.nil? && @markov_model.include?(custom_key)
49
+ custom_key
50
+ else
51
+ @markov_model.keys.sample
52
+ end
53
+ end
54
+
55
+ def add_triad(key:, match:)
49
56
  @markov_model[key] = {} unless @markov_model[key]
50
57
  @markov_model[key] += [match]
51
58
  end
@@ -1,7 +1,7 @@
1
1
  require 'minitest/autorun'
2
2
  require './lib/remarkovable.rb'
3
3
 
4
- class RemarkovableTest < Minitest::Test
4
+ class TestMarkovModel < Minitest::Test
5
5
  def test_add_pair_simple_case
6
6
  string = 'we are walking'
7
7
  mc = Remarkovable.new(string: string)
@@ -13,9 +13,7 @@ class RemarkovableTest < Minitest::Test
13
13
  end
14
14
 
15
15
  def test_add_pair_nil
16
- string = nil
17
- mc = Remarkovable.new(string: string)
18
- expected_output = nil
16
+ mc = Remarkovable.new(string: nil)
19
17
 
20
18
  assert_equal nil, mc.speak
21
19
  end
@@ -121,19 +119,4 @@ class RemarkovableTest < Minitest::Test
121
119
 
122
120
  assert_equal expected_output, mc.markov_model
123
121
  end
124
-
125
- def test_custom_key
126
- string = "we are walking\n\rwe are talking we are walking."
127
- mc = Remarkovable.new(string: string)
128
- expected_output = /^We are./
129
-
130
- assert_match expected_output, mc.speak(custom_key: 'we are')
131
- end
132
-
133
- def test_custom_key_no_match
134
- string = "we are walking\n\rwe are talking we are walking."
135
- mc = Remarkovable.new(string: string)
136
-
137
- assert_nil mc.speak(custom_key: 'foo bar') =~ /Foo bar/i
138
- end
139
122
  end
@@ -0,0 +1,39 @@
1
+ require 'minitest/autorun'
2
+ require './lib/remarkovable.rb'
3
+
4
+ class TestSpeak < Minitest::Test
5
+ def test_period_ending
6
+ string = 'we are walking.'
7
+ mc = Remarkovable.new(string: string)
8
+
9
+ assert_match(/\A.*walking.*\.\z/, mc.speak)
10
+ end
11
+
12
+ def test_bang_ending
13
+ string = 'we are walking!'
14
+ mc = Remarkovable.new(string: string)
15
+
16
+ assert_match(/\A.*walking.*!\z/, mc.speak)
17
+ end
18
+
19
+ def test_question_mark_ending
20
+ string = 'we are walking?'
21
+ mc = Remarkovable.new(string: string)
22
+
23
+ assert_match(/\A.*walking.*\?\z/, mc.speak)
24
+ end
25
+
26
+ def test_custom_key
27
+ string = "we are walking\n\rwe are talking we are walking."
28
+ mc = Remarkovable.new(string: string)
29
+
30
+ assert_match(/^We are./, mc.speak(custom_key: 'we are'))
31
+ end
32
+
33
+ def test_custom_key_no_match
34
+ string = "we are walking\n\rwe are talking we are walking."
35
+ mc = Remarkovable.new(string: string)
36
+
37
+ assert_nil(mc.speak(custom_key: 'foo bar') =~ /Foo bar/i)
38
+ end
39
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remarkovable
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Worth
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-11 00:00:00.000000000 Z
11
+ date: 2015-11-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A gem that produces Markov chain output from any text.
14
14
  email:
@@ -18,7 +18,8 @@ extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - lib/remarkovable.rb
21
- - test/test_remarkovable.rb
21
+ - test/test_markov_model.rb
22
+ - test/test_speak.rb
22
23
  homepage: https://rubygems.org/gems/remarkovable
23
24
  licenses:
24
25
  - MIT
@@ -39,9 +40,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
39
40
  version: '0'
40
41
  requirements: []
41
42
  rubyforge_project:
42
- rubygems_version: 2.4.5
43
+ rubygems_version: 2.4.8
43
44
  signing_key:
44
45
  specification_version: 4
45
46
  summary: Markov chains for all.
46
47
  test_files:
47
- - test/test_remarkovable.rb
48
+ - test/test_speak.rb
49
+ - test/test_markov_model.rb
50
+ has_rdoc: