markov 0.0.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.
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Array do
4
+ it 'should give a random element' do
5
+ [].should respond_to(:random)
6
+ end
7
+
8
+ describe 'giving a random element' do
9
+ before :each do
10
+ @array = (1..20).to_a
11
+ end
12
+
13
+ it 'should find a random number' do
14
+ @array.expects(:rand).returns(0)
15
+ @array.random
16
+ end
17
+
18
+ it 'should find a random number between 0 and its length' do
19
+ @array.expects(:rand).with(@array.length).returns(0)
20
+ @array.random
21
+ end
22
+
23
+ it 'should return the element indexed by the random number' do
24
+ i = 7
25
+ @array.stubs(:rand).returns(i)
26
+ @array.random.should == @array[i]
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,217 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Markov do
4
+ before :each do
5
+ @markov = Markov.new
6
+ end
7
+
8
+ describe 'when initialized' do
9
+ before :each do
10
+ Markov.instance_eval do
11
+ public :data
12
+ end
13
+ end
14
+
15
+ it 'should have empty data' do
16
+ @markov.data.should == {}
17
+ end
18
+ end
19
+
20
+ it 'should reset itself' do
21
+ @markov.should respond_to(:reset)
22
+ end
23
+
24
+ describe 'when resetting itself' do
25
+ before :each do
26
+ Markov.instance_eval do
27
+ public :data, :data=
28
+ end
29
+ end
30
+
31
+ it 'should empty its data' do
32
+ @markov.data = { 'a' => [ 'b' ] }
33
+ @markov.reset
34
+ @markov.data.should == {}
35
+ end
36
+ end
37
+
38
+ it 'should allow adding' do
39
+ @markov.should respond_to(:add)
40
+ end
41
+
42
+ describe 'adding' do
43
+ it 'should accept an argument' do
44
+ lambda { @markov.add('a') }.should_not raise_error(ArgumentError)
45
+ end
46
+
47
+ it 'should accept multiple arguments' do
48
+ lambda { @markov.add('a', 'b', 'c', 'd', 'e', 'f') }.should_not raise_error(ArgumentError)
49
+ end
50
+
51
+ it 'should require at least one argument' do
52
+ lambda { @markov.add }.should raise_error(ArgumentError)
53
+ end
54
+ end
55
+
56
+ describe 'checking data after adding' do
57
+ before :each do
58
+ Markov.instance_eval do
59
+ public :data, :data=
60
+ end
61
+ end
62
+
63
+ describe 'a single argument' do
64
+ it 'should add the argument when its data is empty' do
65
+ @markov.reset
66
+ @markov.add('a')
67
+ @markov.data.should == { 'a' => [] }
68
+ end
69
+
70
+ it 'should add the argument to already-present data' do
71
+ @markov.data = { 'a' => [ 'b' ] }
72
+ @markov.add('e')
73
+ @markov.data.should == { 'a' => [ 'b' ], 'e' => [] }
74
+ end
75
+
76
+ it 'should add the argument and retain already-present data' do
77
+ @markov.data = { 'a' => [ 'b' ] }
78
+ @markov.add('a')
79
+ @markov.data.should == { 'a' => [ 'b' ] }
80
+ end
81
+ end
82
+
83
+ describe 'a pair of arguments' do
84
+ it 'should add the arguments when its data is empty' do
85
+ @markov.reset
86
+ @markov.add('a', 'b')
87
+ @markov.data.should == { 'a' => [ 'b' ], 'b' => [] }
88
+ end
89
+
90
+ it 'should add the arguments to already-present data' do
91
+ @markov.data = { 'a' => [ 'b' ] }
92
+ @markov.add('e', 'f')
93
+ @markov.data.should == { 'a' => [ 'b' ], 'e' => [ 'f' ], 'f' => [] }
94
+ end
95
+
96
+ it 'should add the arguments and retain already-present data' do
97
+ @markov.data = { 'a' => [ 'b' ] }
98
+ @markov.add('a', 'f')
99
+ @markov.data.should == { 'a' => [ 'b', 'f' ], 'f' => [] }
100
+ end
101
+
102
+ it 'should add the arguments to already-present data about the same linkage' do
103
+ @markov.data = { 'a' => [ 'b' ] }
104
+ @markov.add('a', 'b')
105
+ @markov.data.should == { 'a' => [ 'b', 'b' ], 'b' => [] }
106
+ end
107
+ end
108
+
109
+ describe 'many arguments' do
110
+ it 'should add the arguments when its data is empty' do
111
+ @markov.reset
112
+ @markov.add('a', 'b', 'c', 'd', 'e')
113
+ @markov.data.should == { 'a' => [ 'b' ], 'b' => [ 'c' ], 'c' => [ 'd' ], 'd' => [ 'e' ], 'e' => [] }
114
+ end
115
+
116
+ it 'should add the arguments to already-present data' do
117
+ @markov.data = { 'a' => [ 'b' ] }
118
+ @markov.add('e', 'f', 'g', 'h', 'i')
119
+ @markov.data.should == { 'a' => [ 'b' ], 'e' => [ 'f' ], 'f' => [ 'g' ], 'g' => [ 'h' ], 'h' => [ 'i' ], 'i' => [] }
120
+ end
121
+
122
+ it 'should add the arguments and retain already-present data' do
123
+ @markov.data = { 'a' => [ 'b' ], 'f' => [ 'q' ] }
124
+ @markov.add('a', 'f', 'g', 'h', 'i')
125
+ @markov.data.should == { 'a' => [ 'b', 'f' ], 'f' => [ 'q', 'g' ], 'g' => [ 'h' ], 'h' => [ 'i' ], 'i' => [] }
126
+ end
127
+
128
+ it 'should add the arguments to already-present data about the same linkage' do
129
+ @markov.data = { 'a' => [ 'b' ], 'f' => [ 'g' ] }
130
+ @markov.add('a', 'b', 'e', 'f', 'g', 'h', 'i')
131
+ @markov.data.should == { 'a' => [ 'b', 'b' ], 'b' => [ 'e' ], 'e' => [ 'f' ], 'f' => [ 'g', 'g' ], 'g' => [ 'h' ], 'h' => [ 'i' ], 'i' => [] }
132
+ end
133
+ end
134
+ end
135
+
136
+ it 'should generate' do
137
+ @markov.should respond_to(:generate)
138
+ end
139
+
140
+ describe 'generating' do
141
+ before :each do
142
+ @data = { 'a' => ['b', 'c'], 'b' => ['c'], 'c' => ['d'], 'd' => ['e'], 'e' => [] }
143
+ @markov.stubs(:data).returns(@data)
144
+ @keys = @data.keys
145
+ @data.stubs(:keys).returns(@keys)
146
+ end
147
+
148
+ it 'should accept an argument' do
149
+ lambda { @markov.generate(5) }.should_not raise_error(ArgumentError)
150
+ end
151
+
152
+ it 'should not require an argument' do
153
+ lambda { @markov.generate }.should_not raise_error(ArgumentError)
154
+ end
155
+
156
+ it 'should get its data' do
157
+ @markov.expects(:data).returns(@data)
158
+ @markov.generate
159
+ end
160
+
161
+ it "should get its data's keys" do
162
+ @data.expects(:keys).returns(@keys)
163
+ @markov.generate
164
+ end
165
+
166
+ it 'should get a random key' do
167
+ @keys.expects(:random).returns(@keys.first)
168
+ @markov.generate
169
+ end
170
+
171
+ it 'should access the data for the returned key' do
172
+ key = @keys.first
173
+ @keys.stubs(:random).returns(key)
174
+ @data.expects(:[]).with(key).returns([])
175
+ @markov.generate
176
+ end
177
+
178
+ it 'should get a random element from the data for the returned key' do
179
+ key = @keys.first
180
+ key_data = @data[key]
181
+ @keys.stubs(:random).returns(key)
182
+ @data.stubs(:[]).returns([])
183
+ @data.stubs(:[]).with(key).returns(key_data)
184
+ key_data.expects(:random).returns(key_data.first)
185
+ @markov.generate
186
+ end
187
+
188
+ it 'should not get an element from the data for the returned key if that data is empty' do
189
+ key = @keys.first
190
+ key_data = []
191
+ @keys.stubs(:random).returns(key)
192
+ @data.stubs(:[]).with(key).returns(key_data)
193
+ key_data.expects(:random).never
194
+ @markov.generate
195
+ end
196
+
197
+ it 'should return the items' do
198
+ key = @keys.first
199
+ key_data = @data[key]
200
+ @keys.stubs(:random).returns(key)
201
+ @data.stubs(:[]).returns([])
202
+ @data.stubs(:[]).with(key).returns(key_data)
203
+ item = key_data.random
204
+ key_data.stubs(:random).returns(item)
205
+ @markov.generate.should == [key, item]
206
+ end
207
+
208
+ it 'should limit the returned items if given an argument' do
209
+ @markov.generate(1).length.should == 1
210
+ end
211
+
212
+ it 'should return an empty array if there are no keys' do
213
+ @data.stubs(:keys).returns([])
214
+ @markov.generate.should == []
215
+ end
216
+ end
217
+ end
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,23 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ # this is my favorite way to require ever
10
+ begin
11
+ require 'mocha'
12
+ rescue LoadError
13
+ require 'rubygems'
14
+ gem 'mocha'
15
+ require 'mocha'
16
+ end
17
+
18
+ Spec::Runner.configure do |config|
19
+ config.mock_with :mocha
20
+ end
21
+
22
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
23
+ require 'markov'
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/models"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/**/*_spec.rb']
21
+ end
@@ -0,0 +1,9 @@
1
+ # stubs for the website generation
2
+ # To install the website framework:
3
+ # script/generate website
4
+
5
+ task :website_generate
6
+
7
+ task :website_upload
8
+
9
+ task :website => :publish_docs
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: markov
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Yossef Mendelssohn
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-06 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.1.4
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: mocha
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.1
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: hoe
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.7.0
44
+ version:
45
+ description: simple markov chains
46
+ email:
47
+ - ymendel@pobox.com
48
+ executables: []
49
+
50
+ extensions: []
51
+
52
+ extra_rdoc_files:
53
+ - History.txt
54
+ - License.txt
55
+ - Manifest.txt
56
+ files:
57
+ - History.txt
58
+ - License.txt
59
+ - Manifest.txt
60
+ - README.rdoc
61
+ - Rakefile
62
+ - config/hoe.rb
63
+ - config/requirements.rb
64
+ - lib/markov.rb
65
+ - lib/markov/core_ext.rb
66
+ - lib/markov/core_ext/array.rb
67
+ - lib/markov/version.rb
68
+ - script/console
69
+ - script/destroy
70
+ - script/generate
71
+ - setup.rb
72
+ - spec/array_spec.rb
73
+ - spec/markov_spec.rb
74
+ - spec/spec.opts
75
+ - spec/spec_helper.rb
76
+ - tasks/deployment.rake
77
+ - tasks/environment.rake
78
+ - tasks/rspec.rake
79
+ - tasks/website.rake
80
+ has_rdoc: true
81
+ homepage: http://yomendel.rubyforge.org
82
+ post_install_message: ""
83
+ rdoc_options:
84
+ - --main
85
+ - README.txt
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: "0"
93
+ version:
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: "0"
99
+ version:
100
+ requirements: []
101
+
102
+ rubyforge_project: yomendel
103
+ rubygems_version: 1.2.0
104
+ signing_key:
105
+ specification_version: 2
106
+ summary: simple markov chains
107
+ test_files: []
108
+