lita-markov-blabber 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Rakefile +2 -2
- data/dict/gutenberg-moby-dick.txt +22332 -0
- data/lib/lita-markov-blabber.rb +5 -5
- data/lib/lita/handlers/markov_blabber.rb +11 -13
- data/lib/lita/markov_brain.rb +21 -12
- data/lita-markov-blabber.gemspec +18 -18
- data/spec/dict/moby_dick_sample.txt +100 -0
- data/spec/lita/handlers/markov_blabber_spec.rb +18 -6
- data/spec/lita/markov_brain_spec.rb +18 -0
- data/spec/spec_helper.rb +2 -2
- metadata +9 -4
data/lib/lita-markov-blabber.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
require
|
1
|
+
require 'lita'
|
2
2
|
|
3
3
|
Lita.load_locales Dir[File.expand_path(
|
4
|
-
File.join(
|
4
|
+
File.join('..', '..', 'locales', '*.yml'), __FILE__
|
5
5
|
)]
|
6
6
|
|
7
|
-
require
|
7
|
+
require 'lita/handlers/markov_blabber'
|
8
8
|
|
9
9
|
Lita::Handlers::MarkovBlabber.template_root File.expand_path(
|
10
|
-
File.join(
|
11
|
-
|
10
|
+
File.join('..', '..', 'templates'),
|
11
|
+
__FILE__
|
12
12
|
)
|
@@ -1,30 +1,28 @@
|
|
1
1
|
require 'lita/markov_brain'
|
2
|
+
require 'pry'
|
2
3
|
|
3
4
|
module Lita
|
4
5
|
module Handlers
|
5
6
|
class MarkovBlabber < Handler
|
7
|
+
DEFAULT_INPUTS_PATH = File.join __dir__, '..', '..', '..', 'dict'
|
6
8
|
|
7
|
-
|
8
|
-
on :unhandled_message, :blabber
|
9
|
+
config :markov_inputs_path, default: DEFAULT_INPUTS_PATH
|
9
10
|
|
10
|
-
|
11
|
-
brain.load_dictionaries
|
12
|
-
end
|
11
|
+
on :unhandled_message, :blabber
|
13
12
|
|
14
|
-
def
|
15
|
-
|
13
|
+
def blabber(payload)
|
14
|
+
payload.fetch(:message).reply gibberish
|
16
15
|
end
|
17
16
|
|
18
|
-
def
|
17
|
+
def gibberish
|
19
18
|
n = rand(5..20)
|
20
19
|
gibberish = brain.generate_n_words n
|
21
|
-
|
22
|
-
payload.fetch(:message).reply gibberish
|
23
20
|
end
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
private
|
23
|
+
|
24
|
+
def brain
|
25
|
+
@@brain ||= Lita::MarkovBrain.new(inputs_path: config.markov_inputs_path)
|
28
26
|
end
|
29
27
|
|
30
28
|
Lita.register_handler(self)
|
data/lib/lita/markov_brain.rb
CHANGED
@@ -1,31 +1,40 @@
|
|
1
1
|
require 'marky_markov'
|
2
2
|
|
3
3
|
class Lita::MarkovBrain
|
4
|
-
|
5
|
-
@dictionary ||= ::MarkyMarkov::TemporaryDictionary.new
|
6
|
-
end
|
4
|
+
NoBrainInputsFound = Class.new(StandardError)
|
7
5
|
|
8
|
-
|
6
|
+
def initialize(inputs_path:)
|
7
|
+
@inputs_path = File.absolute_path(inputs_path)
|
8
|
+
@dictionary = ::MarkyMarkov::TemporaryDictionary.new
|
9
|
+
load_brain!
|
10
|
+
end
|
9
11
|
|
10
|
-
def
|
11
|
-
|
12
|
+
def generate_n_words(n)
|
13
|
+
dictionary.generate_n_words(n)
|
12
14
|
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_reader :dictionary, :inputs_path
|
19
|
+
|
20
|
+
def load_brain!
|
21
|
+
return unless dictionary.dictionary.empty?
|
22
|
+
text_files_path = inputs_path + '/*.txt'
|
23
|
+
|
24
|
+
files = Dir[text_files_path]
|
25
|
+
raise NoBrainInputsFound, "No markov input files found at [#{text_files_path}]" if files.none?
|
26
|
+
|
27
|
+
Dir[text_files_path].each do |file|
|
16
28
|
load_dictionary(file)
|
17
29
|
end
|
18
30
|
end
|
19
31
|
|
32
|
+
|
20
33
|
def load_dictionary(path)
|
21
34
|
logger.debug "Loading Markov input text at: [#{path}]"
|
22
35
|
dictionary.parse_file path
|
23
36
|
end
|
24
37
|
|
25
|
-
def generate_n_words(n)
|
26
|
-
dictionary.generate_n_words(n)
|
27
|
-
end
|
28
|
-
|
29
38
|
def logger
|
30
39
|
Lita.logger
|
31
40
|
end
|
data/lita-markov-blabber.gemspec
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
|
-
spec.name =
|
3
|
-
spec.version =
|
4
|
-
spec.authors = [
|
5
|
-
spec.email = [
|
6
|
-
spec.description =
|
7
|
-
spec.summary =
|
8
|
-
spec.homepage =
|
9
|
-
spec.license =
|
10
|
-
spec.metadata = {
|
2
|
+
spec.name = 'lita-markov-blabber'
|
3
|
+
spec.version = '0.3.0'
|
4
|
+
spec.authors = ['Daniel J. Pritchett']
|
5
|
+
spec.email = ['dpritchett@gmail.com']
|
6
|
+
spec.description = 'Nonsensical nearly-human fallback responses for your lita bot'
|
7
|
+
spec.summary = 'Nonsensical nearly-human fallback responses for your lita bot'
|
8
|
+
spec.homepage = 'https://github.com/dpritchett/lita-markov-blabber'
|
9
|
+
spec.license = 'MIT'
|
10
|
+
spec.metadata = { 'lita_plugin_type' => 'handler' }
|
11
11
|
|
12
|
-
spec.files = `git ls-files`.split(
|
12
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
13
13
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
14
14
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
|
-
spec.require_paths = [
|
15
|
+
spec.require_paths = ['lib']
|
16
16
|
|
17
|
-
spec.add_runtime_dependency
|
18
|
-
spec.add_runtime_dependency
|
17
|
+
spec.add_runtime_dependency 'lita', '>= 4.7'
|
18
|
+
spec.add_runtime_dependency 'marky_markov', '~> 0.3.5'
|
19
19
|
|
20
|
-
spec.add_development_dependency
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
20
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
21
|
+
spec.add_development_dependency 'pry-byebug'
|
22
|
+
spec.add_development_dependency 'rack-test'
|
23
|
+
spec.add_development_dependency 'rake'
|
24
|
+
spec.add_development_dependency 'rspec', '>= 3.0.0'
|
25
25
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
reveries—stand that man on his legs, set his feet a-going, and he will
|
2
|
+
infallibly lead you to water, if water there be in all that region.
|
3
|
+
Should you ever be athirst in the great American desert, try this
|
4
|
+
experiment, if your caravan happen to be supplied with a metaphysical
|
5
|
+
professor. Yes, as every one knows, meditation and water are wedded for
|
6
|
+
ever.
|
7
|
+
|
8
|
+
But here is an artist. He desires to paint you the dreamiest, shadiest,
|
9
|
+
quietest, most enchanting bit of romantic landscape in all the valley
|
10
|
+
of the Saco. What is the chief element he employs? There stand his
|
11
|
+
trees, each with a hollow trunk, as if a hermit and a crucifix were
|
12
|
+
within; and here sleeps his meadow, and there sleep his cattle; and up
|
13
|
+
from yonder cottage goes a sleepy smoke. Deep into distant woodlands
|
14
|
+
winds a mazy way, reaching to overlapping spurs of mountains bathed in
|
15
|
+
their hill-side blue. But though the picture lies thus tranced, and
|
16
|
+
though this pine-tree shakes down its sighs like leaves upon this
|
17
|
+
shepherd’s head, yet all were vain, unless the shepherd’s eye were
|
18
|
+
fixed upon the magic stream before him. Go visit the Prairies in June,
|
19
|
+
when for scores on scores of miles you wade knee-deep among
|
20
|
+
Tiger-lilies—what is the one charm wanting?—Water—there is not a drop
|
21
|
+
of water there! Were Niagara but a cataract of sand, would you travel
|
22
|
+
your thousand miles to see it? Why did the poor poet of Tennessee, upon
|
23
|
+
suddenly receiving two handfuls of silver, deliberate whether to buy
|
24
|
+
him a coat, which he sadly needed, or invest his money in a pedestrian
|
25
|
+
trip to Rockaway Beach? Why is almost every robust healthy boy with a
|
26
|
+
robust healthy soul in him, at some time or other crazy to go to sea?
|
27
|
+
Why upon your first voyage as a passenger, did you yourself feel such a
|
28
|
+
mystical vibration, when first told that you and your ship were now out
|
29
|
+
of sight of land? Why did the old Persians hold the sea holy? Why did
|
30
|
+
the Greeks give it a separate deity, and own brother of Jove? Surely
|
31
|
+
all this is not without meaning. And still deeper the meaning of that
|
32
|
+
story of Narcissus, who because he could not grasp the tormenting, mild
|
33
|
+
image he saw in the fountain, plunged into it and was drowned. But that
|
34
|
+
same image, we ourselves see in all rivers and oceans. It is the image
|
35
|
+
of the ungraspable phantom of life; and this is the key to it all.
|
36
|
+
|
37
|
+
Now, when I say that I am in the habit of going to sea whenever I begin
|
38
|
+
to grow hazy about the eyes, and begin to be over conscious of my
|
39
|
+
lungs, I do not mean to have it inferred that I ever go to sea as a
|
40
|
+
passenger. For to go as a passenger you must needs have a purse, and a
|
41
|
+
purse is but a rag unless you have something in it. Besides, passengers
|
42
|
+
get sea-sick—grow quarrelsome—don’t sleep of nights—do not enjoy
|
43
|
+
themselves much, as a general thing;—no, I never go as a passenger;
|
44
|
+
nor, though I am something of a salt, do I ever go to sea as a
|
45
|
+
Commodore, or a Captain, or a Cook. I abandon the glory and distinction
|
46
|
+
of such offices to those who like them. For my part, I abominate all
|
47
|
+
honorable respectable toils, trials, and tribulations of every kind
|
48
|
+
whatsoever. It is quite as much as I can do to take care of myself,
|
49
|
+
without taking care of ships, barques, brigs, schooners, and what not.
|
50
|
+
And as for going as cook,—though I confess there is considerable glory
|
51
|
+
in that, a cook being a sort of officer on ship-board—yet, somehow, I
|
52
|
+
never fancied broiling fowls;—though once broiled, judiciously
|
53
|
+
buttered, and judgmatically salted and peppered, there is no one who
|
54
|
+
will speak more respectfully, not to say reverentially, of a broiled
|
55
|
+
fowl than I will. It is out of the idolatrous dotings of the old
|
56
|
+
Egyptians upon broiled ibis and roasted river horse, that you see the
|
57
|
+
mummies of those creatures in their huge bake-houses the pyramids.
|
58
|
+
|
59
|
+
No, when I go to sea, I go as a simple sailor, right before the mast,
|
60
|
+
plumb down into the forecastle, aloft there to the royal mast-head.
|
61
|
+
True, they rather order me about some, and make me jump from spar to
|
62
|
+
spar, like a grasshopper in a May meadow. And at first, this sort of
|
63
|
+
thing is unpleasant enough. It touches one’s sense of honor,
|
64
|
+
particularly if you come of an old established family in the land, the
|
65
|
+
Van Rensselaers, or Randolphs, or Hardicanutes. And more than all, if
|
66
|
+
just previous to putting your hand into the tar-pot, you have been
|
67
|
+
lording it as a country schoolmaster, making the tallest boys stand in
|
68
|
+
awe of you. The transition is a keen one, I assure you, from a
|
69
|
+
schoolmaster to a sailor, and requires a strong decoction of Seneca and
|
70
|
+
the Stoics to enable you to grin and bear it. But even this wears off
|
71
|
+
in time.
|
72
|
+
|
73
|
+
What of it, if some old hunks of a sea-captain orders me to get a broom
|
74
|
+
and sweep down the decks? What does that indignity amount to, weighed,
|
75
|
+
I mean, in the scales of the New Testament? Do you think the archangel
|
76
|
+
Gabriel thinks anything the less of me, because I promptly and
|
77
|
+
respectfully obey that old hunks in that particular instance? Who ain’t
|
78
|
+
a slave? Tell me that. Well, then, however the old sea-captains may
|
79
|
+
order me about—however they may thump and punch me about, I have the
|
80
|
+
satisfaction of knowing that it is all right; that everybody else is
|
81
|
+
one way or other served in much the same way—either in a physical or
|
82
|
+
metaphysical point of view, that is; and so the universal thump is
|
83
|
+
passed round, and all hands should rub each other’s shoulder-blades,
|
84
|
+
and be content.
|
85
|
+
|
86
|
+
Again, I always go to sea as a sailor, because they make a point of
|
87
|
+
paying me for my trouble, whereas they never pay passengers a single
|
88
|
+
penny that I ever heard of. On the contrary, passengers themselves must
|
89
|
+
pay. And there is all the difference in the world between paying and
|
90
|
+
being paid. The act of paying is perhaps the most uncomfortable
|
91
|
+
infliction that the two orchard thieves entailed upon us. But _being
|
92
|
+
paid_,—what will compare with it? The urbane activity with which a man
|
93
|
+
receives money is really marvellous, considering that we so earnestly
|
94
|
+
believe money to be the root of all earthly ills, and that on no
|
95
|
+
account can a monied man enter heaven. Ah! how cheerfully we consign
|
96
|
+
ourselves to perdition!
|
97
|
+
|
98
|
+
Finally, I always go to sea as a sailor, because of the wholesome
|
99
|
+
exercise and pure air of the fore-castle deck. For as in this world,
|
100
|
+
head winds are far more prevalent than winds from astern (that is, if
|
@@ -1,19 +1,31 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Lita::Handlers::MarkovBlabber, lita_handler: true do
|
4
|
+
let(:test_inputs_path) { File.join(__dir__, '..', '..', 'dict') }
|
5
|
+
|
4
6
|
let(:robot) { Lita::Robot.new(registry) }
|
5
7
|
|
8
|
+
before do
|
9
|
+
robot.config.handlers.markov_blabber.markov_inputs_path = test_inputs_path
|
10
|
+
end
|
11
|
+
|
6
12
|
subject { described_class.new(robot) }
|
7
13
|
|
8
|
-
describe ':
|
9
|
-
it '
|
10
|
-
|
11
|
-
|
12
|
-
word_count = response.split.count
|
14
|
+
describe ':gibberish' do
|
15
|
+
it 'generates lots of words' do
|
16
|
+
result = subject.gibberish
|
17
|
+
word_count = result.split.count
|
13
18
|
expect(word_count > 4).to be_truthy
|
14
19
|
expect(word_count < 30).to be_truthy
|
15
20
|
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'preload_brain' do
|
24
|
+
it "fills the brain's dictionary with words" do
|
25
|
+
end
|
26
|
+
end
|
16
27
|
|
28
|
+
describe 'blabber' do
|
17
29
|
it 'answers arbitrary inputs' do
|
18
30
|
lyrics = ['welcome to the jungle',
|
19
31
|
'take me down to the paradise city',
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Lita::MarkovBrain do
|
4
|
+
let(:test_inputs_path) { File.join(__dir__, '..', '..', 'dict') }
|
5
|
+
|
6
|
+
describe 'given a short file full of words' do
|
7
|
+
subject { Lita::MarkovBrain.new(inputs_path: test_inputs_path) }
|
8
|
+
|
9
|
+
it "can generate n words on demand" do
|
10
|
+
n = rand(1..100)
|
11
|
+
result = subject.generate_n_words(n)
|
12
|
+
|
13
|
+
expect(result.split.count).to eq(n)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'lita-markov-blabber'
|
2
|
+
require 'lita/rspec'
|
3
3
|
|
4
4
|
# A compatibility mode is provided for older plugins upgrading from Lita 3. Since this plugin
|
5
5
|
# was generated with Lita 4, the compatibility mode should be left disabled.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-markov-blabber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Pritchett
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rack-test
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: rake
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - ">="
|
@@ -120,12 +120,15 @@ files:
|
|
120
120
|
- README.md
|
121
121
|
- Rakefile
|
122
122
|
- dict/2701-0.txt
|
123
|
+
- dict/gutenberg-moby-dick.txt
|
123
124
|
- lib/lita-markov-blabber.rb
|
124
125
|
- lib/lita/handlers/markov_blabber.rb
|
125
126
|
- lib/lita/markov_brain.rb
|
126
127
|
- lita-markov-blabber.gemspec
|
127
128
|
- locales/en.yml
|
129
|
+
- spec/dict/moby_dick_sample.txt
|
128
130
|
- spec/lita/handlers/markov_blabber_spec.rb
|
131
|
+
- spec/lita/markov_brain_spec.rb
|
129
132
|
- spec/spec_helper.rb
|
130
133
|
- templates/.gitkeep
|
131
134
|
homepage: https://github.com/dpritchett/lita-markov-blabber
|
@@ -154,5 +157,7 @@ signing_key:
|
|
154
157
|
specification_version: 4
|
155
158
|
summary: Nonsensical nearly-human fallback responses for your lita bot
|
156
159
|
test_files:
|
160
|
+
- spec/dict/moby_dick_sample.txt
|
157
161
|
- spec/lita/handlers/markov_blabber_spec.rb
|
162
|
+
- spec/lita/markov_brain_spec.rb
|
158
163
|
- spec/spec_helper.rb
|