markov 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+